4

我在全局函数的heredoc中使用beestings时遇到了麻烦。运行时抛出错误“ 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未定义,这表明在常规字符串中使用 beesting 就可以了。

是我做错了什么,还是这是一个错误?

4

2 回答 2

3

这实际上是一个错误,但有一个解决方法。用这个修改过的代码替换你的函数 def:

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}";
};

请注意,最后一条语句(返回值)是引用的 beesting。这会强制解决heredoc 内的任何问题,并且有效。

出现此问题的原因是 KRL 将 beesting 替换绑定到 javascript 执行后,但在闭包生成中存在一个错误,导致变量不可用。使用引用的 beesting 强制解决此问题。

于 2011-03-26T03:44:27.897 回答
2

我已经在我自己的测试中确认您确实偶然发现了一个错误。我会把它归档,我们会尽快解决这个问题。谢谢你。

于 2011-03-26T02:37:17.857 回答