如何使用字符串在哈希中查找符号

时间:2018-04-21 18:42:05

标签: ruby string hash key

我有一个字符串:

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"}]
}

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

products.key?(category)

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

products.key?(category.to_sym)

1 个答案:

答案 0 :(得分:2)

我认为这源于对符号如何运作的误解。具有相同内容的每个符号完全相同,直到具有相同的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]