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

并不是说旧语法是一件坏事,我只是想知道是否有一种方法可以使用新语法(即使是通过中介(即ass))来做到这一点。

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!

总之,当在Hash文本中使用时,尾随冒号会将其前面的一些文本值(我认为任何与/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样式的实用性有限。

最新更新