2012-01-09 3 views
1

申し訳ありませんが、私はこの質問をどのように行うかについてもわかりません。そのことについてもお伝えできれば幸いです。古い構文は悪いことだと新しいルビー(1.9)ハッシュ構文を使用して、関連付けからシンボル(ハッシュキー)を作成する方法は?

# A. WORKS, but "stockroom" is hardcoded 
render partial: association.to_s.singularize + '', 
    locals: {stockroom: new_object} 

# B. WORKS, but uses old syntax 
render partial: association.to_s.singularize + '', 
    locals: {association.to_s.singularize.to_sym => new_object} 

# C. does NOT work 
render partial: association.to_s.singularize + '', 
    locals: {association.to_s.singularize.to_sym: new_object} 

# D. does NOT work 
ass = association.to_s.singularize.to_sym 
logger.debug "--- ass: #{ass.inspect} (#{ass.class})" 
    # => --- ass: :stockroom (Symbol) 
render partial: association.to_s.singularize + '', locals: {ass: new_object} 

ない(でも、仲介者(すなわち、お尻)を経由して)新しい構文を使用してこれを行う方法がありますならば、私は思ったんだけど。

+1

私の推測(ちょうど推測)はノーです。 '': ''の左にあるものをシンボルに変換する構文上のトリックです。評価したい場合でもそうです。 –

答えて

9

JavaScriptのスタイルの構文は本当に新しい構文ではありません、リテラルハッシュ内一部シンボルリテラルのために使用することができることを1.9でちょうど代替構文です。

あなたはすべてのシンボルとトレーリングコロンのスタイルを使用することはできません

、これらを試してみてください、あなたが表示されます:

{ :$set => 11 }      # Valid 
{ $set: 11 }       # Invalid 
{ :'where.is.pancakes.house?' => 23 } # Valid 
{ 'where.is.pancakes.house?': 23 } # Invalid 

を同様に、リテラル記号でない記号がある場合:

s = o.to_sym; { s => 42 } 
{ o.to_sym => 42 } 

ハッシュで太い矢印の構文を使用する必要があります。あなたがシンボルでないキーがあれば同じことが適用されます。

a = %w{where is pancakes house?} 
h = { a => 11 } 
g = { a: 11 } # Also works but produces a completely different result! 

を要約すると、トレーリングコロンが一部リテラル値に変換する(私は/\A[a-z_]\w*\z/iに一致するものを考えるが、私は確かではないよ)ことハッシュリテラルの内部で使用された場合、シンボルの前に置かれます。基本的に、JavaScriptスタイルはほとんど役に立たないが、ほとんどの場合は役に立たない。しかし、ささいな事件が最も一般的であるように起こる。

私は非リテラルシンボルは、このような醜態だろうとJavaScriptのスタイルを使用すると考えることができる唯一の方法:

ass = association.to_s.singularize.to_sym 
h = eval "{ #{ass}: 'pancakes' }" 

とあなたはその後、実際のコードではそのような何かを置けばよいです神はあなたの魂に慈悲を持っています。

また、あなたがあなたのハッシュにアクセスする際、シンボルのリーディング・コロンフォームを使用する必要があることに留意してください:

h[:pancakes] # Valid 
h[pancakes:] # Invalid 

ので、JavaScriptのスタイルは、限られた有用です。

関連する問題