CoffeeScript在解构赋值中是否有类似通配符的东西?

时间:2014-01-27 08:44:10

标签: coffeescript

在Scala中,我可以做以下事情:

val List(first, _, third) = List(1, 2, 3)
// first = 1
// third = 3

我目前有一些CoffeeScript代码,其中我也对数组中的某些元素不感兴趣。理想情况下,我想使用通配符,就像我在Scala中所做的那样。

[first, _, third] = [1, 2, 3]

现在,这确实有效,但它也添加了这项任务:

_ = 2

......这显然不是我想要的。 (我正在使用下划线。)忽略数组中值的首选方法是什么?

顺便说一句,我正在使用它进行正则表达式匹配;我正在使用的正则表达式具有可选组,它们实际上仅用于匹配,而不是用于获取任何实际数据。

match = /^(([a-z]+)|([0-9]+)) (week|day|year)(s)? (before|after) (.*)$/.exec str
if match?
  [__, __, text, number, period, __, relation, timestamp] = match
  …

2 个答案:

答案 0 :(得分:1)

在您的具体情况下,您可以在正则表达式中使用non-capturing groups来绕过整个问题:

  

(?:x)
  匹配 x 但不记得匹配。这些被称为非捕获括号。无法从结果数组的元素[1],...,[n]或预定义的RegExp对象的属性$1,...,{{中调用匹配的子字符串1}}。

如果我正确地阅读您的代码,您需要:

$9

您也可以将/^(?:([a-z]+)|([0-9]+)) (week|day|year)(?:s)? (before|after) (.*)$/ 替换为(?:s)?,因为无需像这样对单个文字进行分组:

s?

在任何一种情况下,您都会留下:

/^(?:([a-z]+)|([0-9]+)) (week|day|year)s? (before|after) (.*)$/

您可以使用array slice删除前导[__, text, number, period, relation, timestamp] = match

__

[text, number, period, relation, timestamp] = match[1..] 是对Array.slice的隐藏调用,因为在解除match[1..]时,解构不够智能(尚未)跳过match[0]。额外的方法调用可能对您有用,也可能无关紧要。

答案 1 :(得分:0)

没有办法像这样进行通配符分配。你可以使用双下划线__,像这样

[first, __, third] = [1, 2, 3]

就个人而言,我会以有意义的方式命名第二个变量,即使之后没有使用它。