読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

プロパティの値としてラムダ式を保持する場合の注意点

例えばこんなOGNL式があったとします。

<s:set var="foo" value="#{
    'bar': :[#this ? 'YES' : 'NO' ]
}" />

単に、プロパティfoo.barにラムダ式をセットしただけです。


では、ラムダ式を実行してみましょう。

<s:set var="foo" value="#{
    'bar': :[#this ? 'YES' : 'NO' ]
}" />

You should not say '<s:property value="#foo.bar(true)" />'.


YES と表示されるはずですよね。
実行結果は次の通りです。

You should not say ''.


…ん?何も表示されない?


どうやら何か間違っているようです。

原因

ラムダ式の実行は、式評価の優先順位が高いのです。
だから

#foo.bar('true')

#foo.(bar('true'))

という解釈になります。
そして、これは構文エラーです。


この場合、

(#foo.bar)('true')

と書くことで意図したとおりに動作します。