1

6.5.14 エルビス演算子

SpEL で elvis 演算子を使用すると、奇妙な動作が見られます。elvis 式を括弧 "()" で囲まないと、elvis 演算子の結果が返され、残りの式は無視されます。以下の動作を示すサンプルコード:

    HashMap<String, String> facts = new HashMap<String, String>();
    facts.put("flag", "flagvalue");
    String expressionString;
    Expression expression;
    Object expressionResult;

    expressionString = "[flag]?:'' matches '(?i)flagvalue'";
    expression = new SpelExpressionParser().parseExpression(expressionString);
    expressionResult = expression.getValue(facts);
    System.out.println("Unexpected Result:" + expressionResult);

    expressionString = "([flag]?:'') matches '(?i)flagvalue'";
    expression = new SpelExpressionParser().parseExpression(expressionString);
    expressionResult = expression.getValue(facts);
    System.out.println("Expected Result:" + expressionResult);

出力:

    Unexpected Result:flagvalue
    Expected Result:true

奇妙な部分は、値がハッシュマップにない場合 (つまり、facts.put 行にコメントを付ける)、elvis 演算子が正常に動作しているように見え、両方の式が期待どおりに false を返すことです。

(spring-framework-3.0.5 を使用)

4

1 に答える 1

2

違いを理解するには、例を Java 式に拡張する必要があると思います。次のようになります。

System.out.println(facts.containsKey("flag") ? facts.get("flag") : "".matches("(?i)flagvalue"))
System.out.println((facts.containsKey("flag") ? facts.get("flag") : "").matches("(?i)flagvalue"))

印刷する

flagvalue
true

実装の内部は見ていませんが、式ツリーのビューでネストされた演算子である'' matches '(?i)flagvalue'ため、最初に評価されると思います。matches

お役に立てれば。

于 2012-03-14T22:39:26.023 に答える