4

グローバル関数のヒアドキュメントでビーストを使用するのに問題があります。ランタイムはエラー" Exception: arg2 is not defined"をスローします。次に例を示します。

ruleset a163x59 {
  meta {
    name "Beesting in heredoc"
    description <<
        Demonstrate the error with beestings in global function heredocs
    >>
    author "Steve Nay"
    logging on
  }

  dispatch {
  }

  global {
    myFunc = function(arg1, arg2) {
        firstString = "This is a regular string: #{arg1}. No problem there.";
        secondString = <<
            This is a heredoc with a beesting: #{arg2}. Problem!
        >>;
        secondString;
    };
  }

  rule first_rule {
    select when pageview ".*" setting ()
    pre {
        msg = myFunc("First argument", "Second argument");
    }
    notify("Testing...", msg) with sticky = true;
  }
}

未定義であることについて文句を言うことはありませんarg1。これは、通常の文字列内でビーストを使用することが問題ないことを示しています。

私が間違っていることはありますか、それともこれはバグですか?

4

2 に答える 2

3

これは実際にはバグですが、回避策があります。関数定義を次の変更されたコードに置き換えます。

myFunc = function(arg1, arg2) {
    firstString = "This is a regular string: #{arg1}. No problem there.";
    secondString = <<
        This is a heredoc with a beesting: #{arg2}. Problem!
    >>;
    "#{secondString}";
};

最後のステートメント (戻り値) が引用されたビースティングであることに注意してください。これにより、ヒアドキュメント内のビースティングが強制的に解決され、機能します。

この問題は、KRL が javascript の実行まで beesting 置換を遅延バインドするために発生しますが、クロージャー生成にバグがあり、変数が使用できなくなります。引用されたビースティングで解決を強制すると、この問題が解決します。

于 2011-03-26T03:44:27.897 に答える
2

私自身のテストで、あなたが実際にバグに遭遇したことを確認しました. 私はそれを提出し、できるだけ早くこれを解決します。ありがとうございました。

于 2011-03-26T02:37:17.857 に答える