2017-06-19 27 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:因为多个分配比简单的赋值解析不同。