Могу ли я вызвать get (i) или getFrom () для диапазона, состоящего из одной даты в groovy? - PullRequest
0 голосов
/ 26 июля 2011

У меня есть метод, который требует диапазона в groovy, и у меня нет проблем, передавая что-то вроде

новая дата ("01.01.1999") .. новая дата ("01.01.1999")

Но я бы предпочел передать одну дату (как диапазон)

Когда я распечатываю это, это выглядит хорошо

Range range = startDate as Range

Это отображается в консоли

[Пт Ян 01 00:00:00 CST 1999]

Но теперь, когда я пытаюсь сделать .get (i) или .getFrom (), он не может сказать

groovy.lang.MissingMethodException: No signature of method: java.util.Date.getFrom() is applicable for argument types: () values: []
Possible solutions: getDate(), getDay(), getTime(), getYear(), before(java.util.Date), getAt(int)
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:54)
    at org.codehaus.groovy.runtime.InvokerHelper$invokeMethod.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
    at Date_delegateProxy.getFr

Кто-нибудь добился успеха, пытаясь разыграть и использовать одну дату в качестве Range в groovy?

1 Ответ

2 голосов
/ 27 июля 2011

В Groovy оператор as вызывает метод asType для объекта с классом, в который вы хотите преобразовать его в качестве аргумента. DefaultGroovyMethods предоставляет все реализации, которые поставляются с Groovy, о которых я знаю, ни одна из которых не преобразуется в Range.

При необходимости вы можете переопределить asType для поддержки Range, однако я думаю, что большинство людей посчитают, что злоупотребление перегрузкой операторов и такая плохая практика, что я на самом деле не решаюсь привести пример. Тем не менее, это должно делать то, что вы просите.

// Save the original asType method so that it can be called by the overridden one
final f = Date.metaClass.getMetaMethod('asType', [Class] as Class[])

// Replace the default asType method for Date objects
Date.metaClass.asType = { final Class it ->
    // For ranges convert the date into a range with the date as both the start
    // and end. For other types, use the default implementation of asType
    return it == Range? (delegate..delegate) : f.invoke(delegate, it)
}

final start = new Date()
final end   = start

assert start..end == start as Range
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...