使用Symbol作为Ruby函数的参数

时间:2014-09-05 01:42:30

标签: ruby

我正在尝试学习铁轨和红宝石。然后我面对一个问题

我发现我们可以创建一个仅使用符号的函数。而不是使用哈希。

例如:

a={b: "hash value", c: "another has value"}
printValue( :b)

这是真的吗?你举个例子吗?我试图搜索,但我找不到它

1 个答案:

答案 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。实际上,在最后一个示例中,我们传递的是StringFixnum,然后是Symbolmy_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中看到很多。