2011-07-14 39 views
4

我不知道我理解的标志是什么。我在不同的地方阅读以下内容:符号在Ruby中

  • 符号是不可变的,这意味着内容在初始化后不会改变。这意味着对象可以有很多引用,因为内容不能改变。
  • 使用符号的身份和字符串,其中的内容事项。
  • Symbol对象仅实例化一次,并且只要该进程运行存在。
  • 关于符号表

我不明白这些话。最后,我不明白符号对象是什么。 :name是一个符号对象,还是:name只是对某个符号对象的引用?

回答

3

也许这IRB会话可以明确的事情了一点:

irb(main):001:0> "First".object_id 
=> 23849064 
irb(main):002:0> "First".object_id 
=> 23842248 
irb(main):003:0> "First".object_id 
=> 23835432 
irb(main):004:0> "First".object_id 
=> 23828616 
irb(main):005:0> :First.object_id 
=> 301892 
irb(main):006:0> :First.object_id 
=> 301892 
irb(main):007:0> :First.object_id 
=> 301892 
irb(main):008:0> :First.object_id 
=> 301892 
irb(main):009:0> 

想象object_id方法为类似于对象的地址。正如你所看到的,“First”字符串每次都有一个不同的地址(意味着每次创建一个新对象),而符号不会改变。也许你可以将符号与单例关联(如单例模式,而不是元编程方式),以便于理解。

2

你可以把符号作为一种常量,但不包含实际值。在没有符号语言,你可能为了方便做这样的事情:

const BLUE = 1 
const GREEN = 2 

my_color = GREEN 

... 


if (my_color == GREEN) 

在Ruby中,你可以使用符号这样的:

my_color = :green 

... 

if my_color == :green 

这是更有效,因为一个符号是仅仅是一个符号。它不存储任何值或任何东西,所以你不需要初始化它们。我不确定Ruby解释器中的符号是如何处理的,但我认为这与任何新手ruby程序员都没有关系。

一个很好的指南可以在这里找到:​​

4

这个报价从书“Eloquent Ruby”帮助我理解的符号,有书中处理字符串和符号,这也是非常好的一整章。

答案是,我们倾向于使用字符的字符串在代码中两个昼夜温差而 ferent目的:第一个,也是最明显的,使用的字符串是保存一些数据 我们正在处理。阅读从数据库中的那些书的对象,你将很可能 有你的双手满弦的数据,东西之类的书,作者的 名,实际文本的标题。

我们使用字符串的第二种方式是在我们的pro- 克中表示事情,比如想要查找表中的所有记录。最关键的事情有关 :所有在我们的书ActiveRecord的例子是,ActiveRecord的可以识别它时,它 看到它,代码需要知道哪些记录返回,并且:一切是说 它应该返回每个人的标志。关于使用类似这样的东西的好处是:对于这个“代表”责任的所有类型,它对人类来说也是有意义的:你可能会认识到更多的东西:当你遇到它时,意味着所有的东西都比0更合适,或-1,甚至 (天堂禁止!)0x29ef。

这两种用于字符串的方法 - 一方面用于 上的常规数据处理任务,另一方面用于内部符号标记类型的作业,这使得对对象的不同要求变得非常不同。如果您正在处理数据,那么您将希望使用整个范围的字符串操作工具:您可能需要第一个 标题的十个字符,或者您可能想要获取它的长度或查看它是否与 某些匹配正则表达式。另一方面,如果您在代码中使用某些字符来代表 ,那么您可能不会对 实际字符造成太大兴趣。相反,在第二种情况下,你只需要知道这个东西 是告诉你找到所有记录还是仅仅是第一条记录的标志。主要是,当你想要一些字符代表某些东西时,你只需要知道这是否与012.相同,快速而可靠。
+0

从来没有听说过那本书,看起来很有趣。感谢您分享该链接! – LuckyLuke

1

我认为符号最好通过用例来解释。

创建常量时,它们比整数更具表现力。

def rgb(color_symbol) 
    return nil unless color_symbol.is_a? Symbol 
    case color_symbol 
    when :red; { r: 255, g: 0, b: 0 } 
    when :green; { r: 0, g: 255, b: 0 } 
    when :blue; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_symbol= :red) 

,符号只是通过其独特的地址相比较,比

def rgb(color_number) 
    return nil unless color_number.is_a? Fixnum 
    case color_number 
    when 1; { r: 255, g: 0, b: 0 } 
    when 2; { r: 0, g: 255, b: 0 } 
    when 3; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_number= 2) 

对于条件语句比较更具可读性,所以他们不是字符串,这是由长度相比更有效,然后每一个字符。

def rgb(color_string) 
    return nil unless color_string.is_a? String 
    case color_string 
    when "red"; { r: 255, g: 0, b: 0 } 
    when "green"; { r: 0, g: 255, b: 0 } 
    when "blue"; { r: 0, g: 0, b: 255 } 
    else; { r: 0, g: 0, b: 0 } 
    end 
end 

p rgb(color_string= "blue") 

这会比使用符号效率低。

0

A Symbol实例是一组有序的字符。 String实例是一个字符容器,它可以包含任何字符序列。