2015-06-23 65 views
0

我希望能夠從另一個方法調用中獲取數組,並在將其傳遞給另一個函數時附加一個參數。看了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

'results.push(console.log(e))'將會是一大堆未定義的,因爲'console.log'不會返回任何東西。看起來你正在映射輸入列表,而不是簡單地迭代它。 – ssube

+1

如果你只是想傳遞一個數組,請傳遞一個數組並且不要展開它。 – Bergi

回答

2

你的bug在t.some_meth(foo...,1)。您將一組數字[37.5, 5, 255.0, 1]的內容作爲參數傳遞給t.some_meth。因此,ìn失敗,因爲四不是一個數組,但數字37.5

正確呼叫將是:

t.some_meth [foo..., 1] 

從而使在數組中。

+0

@你說得對:我的回答不清楚。我已經編輯,使其更清晰(我希望)。 –

+0

謝謝。我不太確定我是如何錯過的,因爲事後的看法有多明顯! –