【问题标题】:How to create symbol (hash key) from association, using new ruby (1.9) hash syntax?如何使用新的 ruby​​ (1.9) 哈希语法从关联中创建符号(哈希键)?
【发布时间】:2012-02-06 10:57:14
【问题描述】:

对不起,我什至不知道如何问这个问题..所以如果你也能提出建议,我们将不胜感激。

# 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))。

【问题讨论】:

  • 我的猜测(只是猜测)是否定的;这确实是一种语法技巧,可以将 ":" 左侧的任何内容转换为符号,即使您希望对其进行评估。

标签: ruby hash symbols


【解决方案1】:

JavaScript 样式语法并不是真正的 new 语法,它只是 1.9 中的一种 alternate 语法,可以 用于 一些哈希文字中的符号文字。

你不能对所有符号都使用尾随冒号样式,试试这些,你会看到:

{ :$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 样式的实用性有限。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2022-01-10
    • 2012-03-30
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多