4

rhino (JavaScript)function.apply()を使用して、次のようなvaragsJavaメソッドに引数を渡したいと思います。

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));

「ハローナンバー2」

于 2012-10-10T14:43:24.893 に答える
0

文字列オブジェクトで「format」{メソッド}を使用しているjava.langが見つかりませんか。String.formatが見つかった場合は、次を使用します。

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

formatString関数はsprintfを作成します

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

私の意見では、format()関数を使用してください...

于 2012-10-10T14:32:28.880 に答える