在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
…
答案 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]
就个人而言,我会以有意义的方式命名第二个变量,即使之后没有使用它。