如何使用新的ruby(1.9)哈希语法从关联中创建符号(哈希键)?

如何使用新的ruby(1.9)哈希语法从关联中创建符号(哈希键)?,ruby,hash,symbols,Ruby,Hash,Symbols,对不起,我甚至不知道该怎么问这个问题。。因此,如果您也能就此提出建议,我们将不胜感激 # 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 + '

对不起,我甚至不知道该怎么问这个问题。。因此,如果您也能就此提出建议,我们将不胜感激

# 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中的一种替代语法,可以用于哈希文本中的一些符号文本

不能对所有符号使用尾随冒号样式,请尝试以下操作,您将看到:

{ :$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\u]\w*\z/I
匹配的值,但我不确定)转换为哈希文字中使用的符号。基本上,JavaScript样式除了最简单的情况外,在所有情况下都是无用的;但这些琐碎的案例确实是最常见的

我能想到的唯一方法是将JavaScript样式与非文字符号一起使用,这是一种令人憎恶的方式,如下所示:

ass = association.to_s.singularize.to_sym
h   = eval "{ #{ass}: 'pancakes' }"
如果你曾经在真实的代码中写过类似的东西,那么上帝会怜悯你的灵魂

此外,请记住,要访问哈希时,必须使用符号的前导冒号形式:

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

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

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\u]\w*\z/I
匹配的值,但我不确定)转换为哈希文字中使用的符号。基本上,JavaScript样式除了最简单的情况外,在所有情况下都是无用的;但这些琐碎的案例确实是最常见的

我能想到的唯一方法是将JavaScript样式与非文字符号一起使用,这是一种令人憎恶的方式,如下所示:

ass = association.to_s.singularize.to_sym
h   = eval "{ #{ass}: 'pancakes' }"
如果你曾经在真实的代码中写过类似的东西,那么上帝会怜悯你的灵魂

此外,请记住,要访问哈希时,必须使用符号的前导冒号形式:

h[:pancakes] # Valid
h[pancakes:] # Invalid
因此JavaScript风格的实用性有限。

我的猜测(只是猜测)是否定的;这实际上是一个语法技巧,它可以将
:“
左边的任何东西转换成一个符号,即使你想对它进行评估;这实际上是一种语法技巧,它可以将
“:”
左边的任何内容转换为符号,即使您希望对其进行求值。