1

当其中一个字符串通过 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'

编辑: mu 太短给了我钥匙,所以修改后的工作代码看起来像这样(除了发出之外,一切都是一样的)

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

1 回答 1

2

当您使用 splat 时,splat 会将 splatted 的参数放入一个数组中。例如:

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

会给你一个true在控制台。在这种情况下,精美的手册并不是那么好,它并没有准确地拼写出来,它假设您了解 JavaScript 的arguments对象是如何工作的,并且省略了将您的参数放入数组部分的显式 splat。

因此,您最终将数组传递给使用 CoffeeScript (或 JavaScript )check与字符串进行比较的数组永远不会是真的。=====

如果你想emit检查第一个参数,那么你需要这样说:

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

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

于 2013-05-10T01:51:16.670 回答