2013-08-28 38 views
0

我一直在读一个Ruby的书在那里我遇到了下面的代码来描述符号如何使用符号创建一个类似的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 

我不知道我是否已经明确表示这个问题,如果不是我应该尝试改写它。

+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)。

这是回答您的问题吗?

4

我看到误解了什么符号,以及它们的目的是什么。

if direction == :north 

在这一行,direction可变(它可以容纳任何值),并且:north(它可被分配给变量)。

试图做到这一点:

:north = 1 

就像是试图做

2 = 1 

这是没有意义的,当然。

相关问题