2012-01-09 66 views
1

對不起,我甚至不知道如何提出這個問題..所以,如果你可以建議周圍,以及它,將不勝感激。如何使用新的ruby(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

我的猜測(只是一個猜測)是沒有;它實際上是一個句法竅門,即使你想對它進行評估,也可以將「:」的左邊的任何內容轉換爲符號。 – 2012-01-09 23:09:22

回答

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 } 

那麼你必須在你的Hashes中使用胖箭頭語法。這同樣適用,如果你有一個關鍵的不是一個符號:

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的風格是有限的效用。