我有一个“格式”方法,其工作方式与C#String.Format方法类似,具有以下签名:
在名为StringTools的类中:
/**
* Formats a string, based on C# String.Format method.
* @param raw A string with numbered tokens, such as "{0}, {1}"
* @param rest Values that replace the numbered tokens in raw.
*/
public static function format(raw:String, ...rest:*):String;
StringTools.format(“{0},{1}”,“Hello”,“World”)按预期返回字符串“Hello,World”。现在,我正在尝试让我的日志记录类使用此方法,但是我无法通过可选变量。日志记录类中方法的签名是:
public static function infof(raw:String, ...rest:*):String;
如果我将“rest”直接传递给StringTools.format(raw,rest),它会作为一个数组传入,而不是作为一系列参数传递,所以如果我调用它,请说:infof(“{0}, {1}“,”Hello“,”World“),我得到字符串”Hello,World,{1}“,因为它将第一个标记替换为整个值数组。
我也尝试构造一个arguments数组,并调用这样的方法:
var collectArgs:Array = [raw];
for (var i:Number = 0; i < rest.length; i++)
{
collectArgs.push(rest[i]);
}
var callFunction:Function = StringTools.format.call;
trace(callFunction.apply(null, collectArgs));
然而,这跟踪“世界,6”。因此,看起来参数被移位了。所以,我尝试将collectArgs初始化为[null,raw],然后我得到“Hello World,6。数字为{1}”。
我做错了吗?将可选参数从一个需要可选参数的方法传递给另一个需要可选参数的方法的正确方法是什么?
谢谢!
答案 0 :(得分:1)
你也可以这样做(当然这不是字符串格式化的最佳实现):
public static function format(raw:String, ...rest:*):String {
if (rest[0] is Array && rest.length == 1) {
rest = rest[0];
}
var r:RegExp = /(\{\d+\})/g;
var matches:Array = raw.match(r);
for (var i:Number = 0; i < rest.length; i++) {
raw = raw.replace(matches[i], rest[i]);
}
return raw;
}
然后你的infof函数看起来像这样:
public static function infof(raw:String, ...rest:*):void {
var formatted = StringTools.format(raw, rest);
}
如我的评论所述,如果从callFunction setter的末尾删除call方法,则不需要提供null作为第一个参数。请参阅http://livedocs.adobe.com/以了解调用方法实际执行的操作以及第一个参数的用途。
正如@stephen所提到的,将原始var卸载到其余数组上要简单得多,而不是建立一个新的。
答案 1 :(得分:1)
我认为你使用apply是正确的。这似乎可以说明你想要的行为:
static function f1(raw:String, ...rest:*):void
{
trace("f1: "+raw+" "+rest);
rest.unshift(raw);
f2.apply(null, rest);
}
static function f2(raw:String, ...rest:*):void
{
trace("f2: "+raw+" "+rest);
}
function passSomeArguments():void
{
f1("A",1,2,3);
}
编辑:您需要传递'null'作为要应用的第一个参数,因为第一个参数是调用函数时被认为是'this'的参数。由于函数是静态的(并且在任何情况下都不依赖于'this'),您可以传递null,但是您必须传递某些东西。
答案 2 :(得分:0)
实际上,发现这是我的问题。只要arguments数组中的第一个元素为null,它就可以使用所描述的参数集合方法正常工作。我不确定为什么null是必要的,但它的工作方式很好。