我有一个字符串:
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)
答案 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]