如何使用符号创建类似的Ruby方法?

时间:2013-08-28 17:01:33

标签: ruby symbols

我一直在阅读Ruby书籍,我在下面遇到了代码来描述符号

def walk(direction)
  if direction == :north
    # ...
  end
end

我试过并且未能创建一个类似的方法(比较

这样的符号

direction == :north

因为大多数时候我看到的符号使用的是param[:name],所以在我的代码中我尝试了:north = 1 or :favourite = 'ruby',但语法错误。

是否真的可以单独使用符号进行这样的比较(没有哈希),而不是

if "ruby" == param[:name]
end

if "ruby" == :name
end

我不确定我是否已经清楚地表达了这个问题,如果不是,我会尝试重新加注它。

2 个答案:

答案 0 :(得分:4)

我看到对符号是什么以及它们的目的有何误解。

if direction == :north

在这一行中,direction变量(它可以包含任何值),:north(可以分配)变量)。

尝试这样做:

:north = 1

就像试图做

2 = 1

当然,这没有任何意义。

答案 1 :(得分:2)

符号更像是标识符,或特殊版本的字符串。

使用字符串,您可以

str1 = 'SYM'

str2 = 'symbol'
str2 = str2[0,3].upcase

现在内存中的不同位置有两个相同的字符串。 Ruby必须比较所有字符才能评估str1 == str2

然而,符号是唯一的 - 你不能对它们进行角色操作,如果你有

sym1 = :SYM
sym2 = :SYM

然后只需要一次比较来测试它们的相等性。如果我们查看字符串和符号

的对象ID,它就会清楚地证明这一点
puts str2.object_id
puts str1.object_id

puts sym1.object_id
puts sym2.object_id

puts str1.to_sym.object_id
puts str2.to_sym.object_id

<强>输出

22098264
22098228
203780
203780
203780
203780

因此两个字符串具有不同的对象ID,而这两个符号实际上是同一个对象。即使将两个字符串转换为符号也会提供相同的对象ID,因此只有一个 :SYM

因为符号是,所以写:north = 1之类的内容就像编写'north' = 1一样没有意义。

将字符串与符号进行比较,例如'north' = :north将始终返回false,因为它们是不同的对象类。

param[:name]仅适用于您可以使用任何对象索引哈希值。 (你可以说param[Object.new] = 1。)它不同于编写param['name'](用文字字符串索引哈希)或param[name](用内容索引哈希变量name)。

这会回答你的问题吗?