【问题标题】:How to use a string to find a symbol in a hash如何使用字符串在哈希中查找符号
【发布时间】:2018-10-02 04:48:31
【问题描述】:

我有一个字符串:

category = "cupcakes"

我需要看看这个哈希是否有那个字符串,转换成一个符号,作为一个键:

products = {
  :cupcakes => [{:title => "chocolate", :flavor => "chocolate"}, {:title => "summer special", :flavor => "pink cake"}],
  :cookies => [{:title => "chocolate bliss", :flavor => "chocolate chip"}, {:title => "breakfast surprise", :flavor => "oatmeal raisin"}]
}

这个不起作用,因为类别是一个字符串,而不是一个符号。

products.key?(category)

这个不起作用,因为:cupcake 是一个独特的符号,我们只是在创建另一个符号。

products.key?(category.to_sym)

【问题讨论】:

  • 类别是单数还是复数?
  • “我们只是在创建另一个符号” – 不,每个符号 :cupcake 指的是同一个对象。它不起作用,因为您的密钥是 :cupcakes(带有“s”)。
  • @stefan,我修复了类型-o(复数“s”)我无法访问:cupcake,因为用户要输入一个字符串,我需要使用它要访问的字符串:cupcake

标签: ruby string hash key


【解决方案1】:

我认为这是对符号工作原理的误解。每个具有相同内容的符号都是完全相同的,直到具有相同的object_id。具有不同内容的符号总是不同。这与它们可能具有相同内容但 object_id 不同的字符串形成对比,或者有时字符串可能包含一件事,而下一刻它完全不同,尽管具有相同的 object_id

Ruby 的object_id 值就是他们所说的“对象标识符”,是一种表示“对象编号”的方式。

现在字符串"cupcake"和符号:cupcake不一样了:

  "cupcake" == :cupcake
  # => false

如果您进行转换,它们是:

  "cupcake".to_sym == :cupcake
  # => true

真正的问题是你期望:cupcake:cupcakes 是同一个东西。 Ruby 不懂英语的规则和语义,所以就其而言,这是两个完全不同的东西。

如果您使用 ActiveSupport,您可以执行以下操作:

"cupcake".pluralize.to_sym == :cupcakes
# => true

这需要一个额外的库,但好消息是它默认带有 Rails 之类的东西。

无论如何,您定义数据的方式需要将其引用为:

products[:cupcakes]
products["cupcake".to_sym]
products["cupcake".pluralize.to_sym]

【讨论】:

  • 感谢您的帮助。我修复了 type-o(缺少 s),现在我的代码可以工作了。感谢您对符号的澄清。一个小小的 type-o 会让初学者迷失一段时间,这真的很有帮助!
  • 关于 Ruby 最令人困惑的事情之一是符号与字符串。很高兴我能帮上忙。
猜你喜欢
  • 2017-12-21
  • 2012-04-23
  • 2012-03-31
  • 1970-01-01
  • 2019-08-08
  • 2013-03-22
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多