如何使用新的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} 

并不是旧语法是坏事,我只是想知道是否有办法使用新语法(甚至通过中介(即屁股))来做到这一点。

JavaScript样式语法实际上不是语法,它只是1.9中的替代语法, 用于Hash文字中的某些符号文字。

你不能使用所有符号的尾部冒号样式,尝试这些,你会看到:

 { :$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' }" 

如果你曾经在真实的代码中加入类似的东西,那么神可以怜悯你的灵魂。

另外,请记住,当您要访问哈希时,必须使用符号的前导冒号forms:

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

因此JavaScript样式的实用性有限。