Groovy 1.8 DSLの機能の1つで助けが必要です。Groovy 1.8 a bcスタイル
はthisテストケースを考えてみましょう:
/**
* For odd number of elements, treat the last element as a call to a getter
*
* case a b c
* equivalent a(b).getC()
*/
void testTrailingElementAsGetter() {
def drank = false
def more = 'more'
def drink = { String s -> [milk: { drank = true }()] }
def d = drink more milk
assert drank
}
私は[foo: { drank = true }()]
に[milk: { drank = true }()]
を変更した場合、テストケースはまだ渡します。これは新しい実装のバグか、Groovyの構文で何か不足していますか?
EDIT-SOLVED:@hanと@Gareth Davisの両方が適切な手掛かりを投稿しました。 @hanが指摘したようにマップを返し[A]
groovy:000> more = 'more'
===> more
groovy:000> drank = false
===> false
groovy:000> drink = { String s -> [milk: { drank = true }()] }
===> [email protected]
[A] groovy:000> drink more
===> {milk=true}
[B] groovy:000> drank
===> true
groovy:000> drink more milk
===> true
groovy:000> drink more water
===> null
ライン:ここでは、このテストを理解するためにいくつかのより多くの詳細があります。行[B]
のdrank
は、JavaScript module patternと同様に、作成直後(@Gareth Davisが指摘したように)クロージャが実行されているため、すでにtrue
です。私はこの "テスト"がこの機能を紹介する最良の方法だとは思わない - drank
の副作用は間違っている。
def drink = { String s -> [milk: { drank = true }] }
実際に作成時にではなく、DSLを実行する上での閉鎖を呼び出す末尾の括弧:へ
def drink = { String s -> [milk: { drank = true }()] }
変更: