我正在尝试学习铁轨和红宝石。然后我面对一个问题
我发现我们可以创建一个仅使用符号的函数。而不是使用哈希。
例如:
a={b: "hash value", c: "another has value"}
printValue( :b)
这是真的吗?你举个例子吗?我试图搜索,但我找不到它
答案 0 :(得分:3)
学习Ruby的人不太了解符号是相当普遍的。符号是标准的Ruby类型,就像其他内置的Ruby类型一样。下面是一个符号如何只是某种类型的对象的例子:
'A'.class # => String
1.class # => Fixnum
:a.class # => Symbol
与任何其他类型一样,符号具有方法。如果您打开IRB并键入:a.methods.sort
,它将显示您可以在符号上调用的所有方法。例如,:a.to_s # => 'a'
正如您所注意到的,符号通常用作Hash
键。但是,其他类型也可以是Hash
键:
my_hash = { 'A' => 'an A', 1 => 'a 1', :a => 'the symbol a'}
my_hash['A'] # => 'an A'
my_hash[1] # => 'a 1'
my_hash[:a] # => 'the symbol a'
就像您可以将String
或其他类型传递给方法一样,您可以传递Symbol
。实际上,在最后一个示例中,我们传递的是String
,Fixnum
,然后是Symbol
到my_hash
的{{1}}方法。
人们真正喜欢散列键符号的原因是它们重用起来非常轻巧。下面是一个示例,显示了符号与任何其他对象之间的主要区别之一:
[]
如您所见,我创建了三个具有值“a”的字符串,并且它们各自具有不同的对象ID。换句话说,内存中有三个"a".object_id # => 70098399407740
"a".object_id # => 70098399393460
"a".object_id # => 70098399388140
:a.object_id # => 359368
:a.object_id # => 359368
:a.object_id # => 359368
个对象包含值“a”。相反,每次使用String
时,它都具有相同的对象ID。我的整个程序中只有一个:a
对象。
将符号传递给方法并不罕见。你会在Rails中看到很多。