3

次のコード行

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

いくつかの操作(式を評価し、それに応じて2つの変数の値を設定する)を1行にまとめようとする私の試みです。

予期しないコンマがあると主張して、エラーが発生します。

これを機能させる方法はありますか、それとも私は貧しい三項演算子をオーバーロードしているだけですか?

(ちなみに、これは単なる個人的な実験でした。面倒ですが、単純なif / elseステートメントを使用してもかまいません)

編集:次のコード行が機能します!できるだけ早く正しい答えをチェックします!

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

3 に答える 3

8

どうですか:

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

w, x = y, zは と同じw, x = [y, z]なので、これは問題なく機能し、繰り返しはありません。

于 2012-06-27T02:03:10.947 に答える
2

テストではなくに割り当てtrueinvite.acceptedいるようです。これを試してください:

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

if をテストする必要がないので、これはより良いでしょう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
于 2012-06-27T01:57:59.637 に答える
1

;仕事:

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> 

A;はステートメントセパレータです。

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
...
于 2012-06-27T02:09:22.120 に答える