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做最好的識別缺陷。我在下面概述了更正的語法。 –