我希望能够从另一个方法调用中获取一个数组,并在将其传递给另一个函数时添加一个额外的参数。阅读this answer后,我制作了以下CoffeeScript:
class TestMe
some_meth: (four) ->
(console.log e) for e in four
foo= [37.5,5,255.0]
t= new TestMe()
t.some_meth(foo...,1)
它编译成以下JavaScript(咖啡版本1.9.1):
(function() {
var TestMe, foo, t,
slice = [].slice;
TestMe = (function() {
function TestMe() {}
TestMe.prototype.some_meth = function(four) {
var e, i, len, results;
results = [];
for (i = 0, len = four.length; i < len; i++) {
e = four[i];
results.push(console.log(e));
}
return results;
};
return TestMe;
})();
foo = [37.5, 5, 255.0];
t = new TestMe();
t.some_meth.apply(t, slice.call(foo).concat([1]));
}).call(this);
这不会产生任何输出。
在调试器(node debug
)中单步执行,我发现函数的参数只是数组的第一个元素(而不是数组)。这很奇怪,因为如果我在调试器中执行slice.call(foo).concat([1])
,我会得到一个数组作为输出。如果我将some_meth
的签名更改为接受四个参数,则输出符合预期。
显然,我可以使用一些解决方法,而且我会使用其中一种,但我当然更喜欢能够写出t.some_meth(foo...,1)
的清晰度和简单性。
有没有人能够深入了解为什么这个成语无法按预期工作?实现能够传递四个元素数组的目标的惯用方法是什么,其中一个元素是常量,其余元素来自另一个数组?
答案 0 :(得分:2)
您的错误位于t.some_meth(foo...,1)
。您将数字数组[37.5, 5, 255.0, 1]
的内容作为参数传递给t.some_meth
。因此,ìn
失败,因为四个不是数组而是数字37.5
。
正确的电话会是:
t.some_meth [foo..., 1]
因此传入数组。