有没有办法使这个Ruby三元运算正确评估?

时间:2012-06-27 01:53:36

标签: ruby ternary-operator

以下代码行

<% invite.accepted ? { @going, @not_going = 'selected', '' } : { @going, @not_going = '', 'selected' } %>

是我尝试将几个操作(计算表达式并相应地设置两个变量的值)压缩成一行。

它引发了一个错误,声称有一个意想不到的逗号。

有没有办法让这项工作成功,或者我只是让可怜的三元运营商超载?

(顺便说一句,这只是个人实验。我不介意使用简单的 - 虽然很麻烦 - if / else语句)

编辑:以下代码行有效!我会尽快检查正确的答案!

<% invite.accepted ? ( @going, @not_going = 'selected', '' ) : ( @going, @not_going = '', 'selected' ) %>

3 个答案:

答案 0 :(得分:8)

怎么样:

@going, @not_going = invite.accepted ? ['selected', ''] : ['', 'selected']

w, x = y, zw, x = [y, z]相同,因此效果很好而且没有重复。

答案 1 :(得分:2)

您似乎正在将true分配给invite.accepted而不是对其进行测试,请尝试以下操作:

<% (invite.accepted == true) ? (@coming, @not_coming = 'coming', '') : (@going, @not_going = 'not coming', 'selected') %>

这样会更好,因为您不需要测试true == true

<% (invite.accepted) ? (@coming, @not_coming = 'coming', '') : (@going, @not_going = 'not coming', 'selected') %>

修改

您也可以尝试将其包装在一个函数中,以便它可以评估为单个实体:

<% (invite.accepted) ? assign(@coming, @not_coming, 'coming', '') : assign(@going, @not_going, 'not coming', 'selected') %>

def assign(a,b,c,d)
   a, b = c,d;
end

答案 2 :(得分:1)

Parens ;工作:

irb(main):018:0> foo = true ? (a=:a ; b=:b) : :foo
=> :b
irb(main):019:0> a
=> :a
irb(main):020:0> b
=> :b
irb(main):021:0> 

请注意,不是语句分隔符:

irb(main):001:0> a=:a, b=:b
=> [:a, :b]
irb(main):002:0> a
=> [:a, :b]
irb(main):003:0> b
=> :b
irb(main):004:0> 

;是一个语句分隔符:

irb(main):004:0> a=:a; b=:b
=> :b
irb(main):005:0> a
=> :a
irb(main):006:0> b
=> :b
irb(main):007:0> 

但这并没有立即帮助你,因为解释器没有寻找语句分隔符 - 只有:

irb(main):014:0> foo = true ? a=:a, b=:b : :foo
SyntaxError: (irb):14: syntax error, unexpected ',', expecting ':'
foo = true ? a=:a, b=:b : :foo
...

Parens和,不会抛出错误,但它无法正常工作:

irb(main):021:0> foo = true ? (a=:a , b=:b) : :foo
=> [:a, :b]
irb(main):022:0> a
=> [:a, :b]
irb(main):023:0> b
=> :b
irb(main):024:0> 

我希望do .. end能够正常工作,但这也失败了:

irb(main):024:0> foo = true ? do a=:a ; b=:b end : :foo
SyntaxError: (irb):24: syntax error, unexpected keyword_do
foo = true ? do a=:a ; b=:b end : :foo
...