GPath周りで壮絶にはまり中 (´・ω・`)
んーーー???
なんかもの凄い初歩的な所で詰まってる気がしつつ・・・
Groovyイン・アクションの 7.5.1 の GPath 周りというか例に挙がってるプログラムではまりちゅう・・・
class Invoice { List items Date date } class LineItem { Product product int count int total () { return product.dollar * count } } class Product { String name def dollar } def ulcDate = new Date(107, 0, 1) def ulc = new Product (dollar:1499, name:'ULC') def ve = new Product (dollar:499, name:'Visual Editor') def invoices = [ new Invoice (date:ulcDate, items: [ new LineItem (count:5, product:ulc), new LineItem (count:1, product:ve) ]), new Invoice(date:[107, 0, 2], items: [ new LineItem(count:4, product:ve) ]) ] assert [5*1499, 499, 4*499] == invoices.items.flatten()*.total()
なんでコレが動くんだ。。。 (´・ω・`)
invoices はここだと List なわけで、そいつには items なんて言うフィールドはついてない。
assert の下で
println invoices.class.name println invoices.items println invoices.items.flatten()
してやると
java.util.ArrayList [[LineItem@43ece626, LineItem@75f9eba0], [LineItem@6adc91e2]] [LineItem@43ece626, LineItem@75f9eba0, LineItem@6adc91e2]
こんな感じだし。。。
んで、もしかして?と思って
def list = [[1,2],3] println list.items
ってやってみたら
Caught: groovy.lang.MissingPropertyException: Exception evaluating property 'items' for java.util.ArrayList, Reason: groovy.lang.MissingPropertyException: No such property: items for class: java.lang.Integer
って怒られるし。
でも、エラーメッセージみると ArrayList に対して items の評価しに行ってるんじゃなくて、list に格納されてる各要素(ここだと Integer)に評価しにいってるっぽいんだよなぁ・・・
Collection 型に対して解決出来ないメッセージ送ると、その内部要素に処理が委譲される??
といった所で朝の自由時間終了 (´・ω・`)