2017-06-19 97 views
2

這個工程:如何使用多重分配與三元運算符?

foo, bar = 1, 2 
foo == 1 #true 
bar == 2 #true 

這也適用:

baz = true 
foo = baz ? 1 : 2 
foo == 1 #true 

工作:

foo, bar = baz ? 1, 2 : 3, 4 
# SyntaxError: (irb):4: syntax error, unexpected ',', expecting ':' 
# foo, bar = baz ? 1, 2 : 3, 4 
#     ^

如何來格式化,以便它的工作原理?

+3

在解析第三個表達式中的第一個逗號時,會引發異常'「語法錯誤,意外事件',',期待':'」'。這是因爲'1,2'不是Ruby對象。 –

+0

@AryaMcCarthy,好問題。我忘記了包含錯誤迴應。感謝誰編輯我的問題:) –

+0

此外,'意外的',''可能只是Ruby做最好的識別缺陷。我在下面概述了更正的語法。 –

回答

4

下面是一個使用三元操作多個分配正確的語法:

foo, bar = baz ? [1, 2] : [3, 4] 

真假必須包裹在括號中的返回值。

我希望這有助於:)

+5

這不能回答你的問題。 –

+0

我同意,這個答案可以解決原始問題(在問題中沒有描述),但它不是對問題的回答。不知道它是如何得到upvote。 – Gerry

+2

它回答(或提供解決方案)_「如何使用三元運算符多個任務?」_部分。 – Stefan

7

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, 2foo, 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, 2mrhs : args ',' arg_value)的明確裸逗號的規則不能與條件一起使用,因爲它明確需要至少兩個逗號分隔的參數 - 這不是條件可能的結果。

TL; DR:因爲多個分配比簡單的賦值解析不同。