foo, bar = baz ? 1, 2 : 3, 4
< =这行不通......为什么?
这里的原因:
如果你看看parse.y
(红宝石的语法),三元条件结构arg1 ? arg2 : arg3
需要为它的参数arg
(参数):
arg : lhs '=' arg_rhs
| # ...
| arg '?' arg opt_nl ':' arg
| # ...
和
arg_rhs : arg
# ...
如上所见,分配lhs = rhs
也是arg
。但多个分配mlhs1, mlhs2 = mrhs1, mrhs2
是语句:
stmt : # ...
| mlhs '=' mrhs_arg
| # ...
| expr
;
虽然一个参数可以用来作为表达
expr : # ...
| arg
;
和如上所见的表达可以作为一个语句,反向不然:一个说法是不总是有效的表达,表达并不总是有效的参数。
而且,当你有[1, 2]
,这是一个数组,这是一个有效arg
,这也是一个有效的arg_rhs
,它可以在arg : lhs '=' arg_rhs
右边去了。 1, 2
不是有效arg
,但它是有效mrhs_arg
(多个建立的参数右侧,它或者具有像foo, bar = 1, 2
,foo, bar = *[1, 2]
甚至foo, bar = 1, *[2]
逗号隔开的多个值,或者destructures像foo, bar = [1, 2]
数组值):
mrhs_arg : mrhs
| arg_value
;
mrhs : args ',' arg_value
# ...
| args ',' tSTAR arg_value
# ...
| tSTAR arg_value
# ...
;
因此它适合于stmt : mlhs '=' mrhs_arg
规则。
这最后一条规则也是为什么你的解决方案foo, bar = baz ? [1, 2] : [3, 4]
工作原理:baz ? [1, 2] : [3, 4]
是arg
,这也是arg_value
,并且可以在mrhs_arg : arg_value
规则中使用。但允许foo, bar = 1, 2
(mrhs : args ',' arg_value
)的明确裸逗号的规则不能与条件一起使用,因为它明确需要至少两个逗号分隔的参数 - 这不是条件可能的结果。
TL; DR:因为多个分配比简单的赋值解析不同。
在解析第三个表达式中的第一个逗号时,会引发异常'“语法错误,意外事件',',期待':'”'。这是因为'1,2'不是Ruby对象。 –
@AryaMcCarthy,好问题。我忘记了包含错误回应。感谢谁编辑我的问题:) –
此外,'意外的',''可能只是Ruby做最好的识别缺陷。我在下面概述了更正的语法。 –