4

我想使用 rhino(JavaScript)function.apply()将参数传递给 varags Java 方法,如下所示:

function sprintf()
{
    return java.lang.String.format.apply(arguments);
}
sprintf("%d\n", 5);

但是调用sprintf()会报错:

Error: can't find method java.lang.String.format().

我想这是因为该format()方法不是正确的 JavaScript 函数而是 Java 方法,所以它没有apply()定义。(虽然这不是错误消息所说的,所以可能不是。)

我确实发现我可以添加自己的 apply() 方法:

java.lang.String.format.apply = function() {}

但是如果你明白我的意思,我看不出apply()没有怎么写。apply()有任何想法吗?

4

2 回答 2

1

@Vincent Montressor

这是一个部分解决方案:

function sprintf(string) {
  var args = Array.prototype.splice.call(arguments, 1);

  for (var i = 0; i < args.length; i++) {
    if (!isNaN(args[i])) {
      args[i] = new java.lang.Integer(args[i]);
    }    
  }

  return java.lang.String.format(String(string), args);
}

有几个问题:

  • 在您的实现中 .format() 方法签名未正确使用,即第一个参数应该是字符串
  • 参数列表中的数值必须转换为正确的 java 类型。

这是示例调用:

print(sprintf("Hello %s %d", "number", 2));

产生:“Hello number 2”

于 2012-10-10T14:43:24.893 回答
0

是否找不到 java.lang 您在字符串对象中使用“格式”{method}。如果找到 String.format 则使用:

 format("Hello, %s!", [firstName]);

你 formatString 函数创建 sprintf

function sprintf() {
    return String.format.apply(arguments);
}

在我看来,使用format()函数......

于 2012-10-10T14:32:28.880 回答