我一直在阅读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
我不确定我是否已经清楚地表达了这个问题,如果不是,我会尝试重新加注它。
答案 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
)。
这会回答你的问题吗?