2013-05-10 49 views
1

我無法檢查兩個字符串是否相等,當它們中的一個通過splat參數傳遞時。因爲coffeescript使用嚴格的比較,並且因爲它們在通過splat的時候創建了參數的副本,所以我無法正確比較字符串而無需使用反引號。有沒有更好的辦法?這裏有一個最小的一段代碼,演示了此問題:Coffeescript - 如何在通過splat傳遞字符串時檢查字符串相等性?

check=(arg) -> 
    if arg == 'foo' then "'#{arg}'=='foo'" else "'#{arg}'!='foo'" 

emit=(args...) -> 
    check(args) 

console.log(emit('foo')) 
console.log(check('foo')) 

從這個輸出將是如下:

> coffee mincase.coffee 
'foo'!='foo' 
'foo'=='foo' 

編輯: 畝太短,給我的鑰匙,所以修訂工作代碼如下所示(一切,除了發出相同)

emit=(args...)-> 
    check.apply(null,args) 

回答

2

當您使用圖示,該圖示放splatted參數到一個數組。例如:

f = (x...) -> console.log(x instanceof Array) 
f(6) 

會在控制檯給你一個true。在這種情況下,fine manual並不是很好,但它不會完全拼出來,它假定您瞭解JavaScript的arguments對象的工作方式,並且省略了明確的splat將您的參數放入數組部分。

所以,你最終傳遞一個數組到check和一個數組與字符串比較使用CoffeeScript的==(或JavaScript的===)永遠不會是真的。

如果你想emit檢查的第一個參數,那麼你需要這麼說:

emit = (args...) -> check(args[0]) 

演示:http://jsfiddle.net/ambiguous/TBndM/

+0

謝謝!我已經編輯了一些問題,以表明我實際上要做的更多細節,但是這解決了問題。我現在在做check.apply(null,args),而不是獲取參數[0],以便我可以傳遞多個參數(這不會從我發佈的代碼中清除)。 – Erik 2013-05-10 15:35:35

+1

@Erik:如果你不想顯式地應用'',你也可以在函數調用('f(array ...)'')中摔打,例如:http://jsfiddle.net/ambiguous/Gjh7G/ – 2013-05-10 17:29:44

+0

酷,這是更好。再次感謝 – Erik 2013-05-11 15:15:25

相關問題