2011-07-11 6 views
3

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 }()] } 

変更:

答えて

1
groovy:000> drank =false 
===> false 
groovy:000> d = {x -> [y: {drank=true}()]} 
===> [email protected] 
groovy:000> drank 
===> false 
groovy:000> d 2 
===> {y=true} 
groovy:000> drank 
===> true 

最初のセットを呼び出すのxはちょうどマップ{Y:真}となり、その後はtrueに飲んだ

本当に

かなり不可解な行動これから我々は多くがある 見ることができます新しい1.8構文からDSLを合成する方法 - キー参照解除マップ - 終了と呼び出し - クラスとメソッド

bary

2

問題がです。

def d = drink more milk 

// d is actually a closure not a boolean you would need to invoke it in order to get the required side effect of setting drank. 
d.call() 
関連する問題