Ruby的符号(Symbol)

原创 2007年09月25日 22:02:00
Ruby的符号足以让很多初学者迷惑上一段时间,看过本章节后,或许会解开你心中的疑惑。

在Ruby中,一个符号是就是一个Symbol类的实例,它的语法是在通常的变量名前加一个冒号,如
:my_sy

Ruby的符号像一个字符串,因为它内部表现形式是一个字符序列。而与字符串不同的是,每个符号的实例只有一个。看下面的例子:
array = ["foo", "foo", "foo", :foo, :foo, :foo]

建立这个数组后,内存中将有三个内容为"foo"的字符串对象,而只有一个:foo对象。

一个符号有它唯一对应的一个整数值,可以用to_i来获取它。

符号常用的地方是用它来代表变量名或者方法名:
class SomeClass
  attr_accessor :whatever
end

与上面程序对等的程序如下:
class SomeClass
  def whatever
    @whatever
  end
  def whatever=(val)
    @whatever = val
  end
end

你可能会问,为什么不用字符串来表示呢?其实,字符串也是可以的:
attr_reader :alpha
attr_reader "beta"   # 也是合法的

那它们的区别在哪里?某种意义上来说,是为了提高程序性能,节省内存吧。

有的人说,"符号就如同不可变的字符串",从它的行为上来说,可能是对的。但是,Symbol并是是继承至String,而且,与字符串相关
的那些典型操作方法,Symbol也不一定有,也不需要有。


符号不一定看起来是像变量一样,它也可以这样:
sym1 = :"This is a symbol"
sym2 = :"This is, too!"
sym3 = :")(*&^%$"
你可以用这样奇怪的符号来定义实例变量名或方法,你可以使用诸如send或instance_variable_get来获取它们的引用。虽然是可行的,
但请尽量不要使用这么奇怪的符号。


用Symbol作为枚举
==========================================
像Pascal或版本稍晚的C语言,都存在enum这种类型。Ruby不能正真的拥有这样的类型,因为它没有类型检查。但使用Symbol可以用来产生
这样的效果:
North, South, East, West = :north, :south, :east, :west

用Symbol作为元数据
==========================================
通常我们使用捕获异常的方式来处理错误,避免使用老式的返回代码的方式。但是,如果你想用老式的方式,还是可以的。像nil就是这样一个元数据。
我们通常可以这样使用(因为符号是全局的,所以在之后的整个程序中,都可以使用这些符号来作为元数据):
str = get_string
case str
  when String
    # Proceed normally
  when :eof
    # end of file, socket closed, whatever
  when :error
    # I/O or network error
  when :timeout
    # didn't get a reply
end


Symbols, Variables, Methods
==========================================
Symbol最常用的地方就是我们熟知的定义属性了:
class MyClass
  attr_reader :alpha, :beta
  attr_writer :gamma, :delta
  attr_accessor :epsilon
  # ...
end
这里的方法,如attr_accessor,它以传入的符号来确定实例变量的名称,以及读写属性的方法的名称,但这不代表所有的情况
(即总是会自动精确匹配符号和实例变量的名称),例如,当使用instance_variable_set方法的时候,符号和实例变量名必须
精确给出:
sym1 = :@foo
sym2 = :foo
instance_variable_set(sym1,"str")   # 正常,匹配到@foo
instance_variable_set(sym2,"str")   # 错误

不过,记住,在这些地方不一定要使用符号,可以用字符串来替代。


转换Symbol
============================================
Symbol和字符串之间可以互相转换,使用to_s和to_sym来实现:
a = "foobar"
b = :foobar
a == b.to_str    # true
b == a.to_sym    # true

 

理解 Ruby Symbol (Ruby中的符号)

转自:[http://blog.csdn.net/besfanfei/article/details/7966850]Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby...
  • Richar1
  • Richar1
  • 2015年07月22日 10:51
  • 751

Tribon符号Symbol解析库

  • 2016年06月25日 19:40
  • 649KB
  • 下载

辛星浅析ruby中的symbol

最近有位朋友问我如何理解ruby中的symbol,我也不知道如何解释,就在这里大致说一下自己的理解吧。      第一点,symbol怎么表示。         其实它和字符串的使用有点相似,它就...

Ruby中全局变量,实例变量,局部变量,类变量,Symbol对比

参考自:http://rubyer.me/blog/485 http://sunnyshuhai.iteye.com/blog/286970 Ruby中全局变量,实例变量,类变量,Symb...

Ruby中全局变量,实例变量,类变量,Symbol

参考自:http://rubyer.me/blog/485 http://sunnyshuhai.iteye.com/blog/286970 Ruby中全局变量,实例变量,类变...

Ruby 学习笔记 Symbol

Ruby 学习笔记 Symbol Symbol 在ruby中是由一个标示符前面加一个冒号(:)组成的。从程序员的角度说它不是字符串,不是变量,不是常量,他仅是个名字,它的值是它自己。从解释器的角度说...

关于GCC属性中的弱符号(weak symbol)

关于弱符号的解释: 若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为weak symbol(弱符号),则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号...

安装与配置windbg的symbol(符号)

本篇是新手自己写的一点心得.建议新手看看.同时希望前辈多多指教. 写这篇的动机:在网上找了一上午的windbg配置符号教程.楞是没找到详细的,都讲的太 模糊而且互相抄袭.不适合新手看.终于靠自己的...
  • nui111
  • nui111
  • 2016年07月12日 22:11
  • 2197

基础篇:6.1)形位公差-符号 Symbol

本章目的:了解定义形位公差的符号。 1.公差特征项目的符号(GM新标准) //形位公差共:5类14个,4,2,3,3,2。 2.附加符号(GM新标准)  //①基本尺寸(理论尺...
  • zjc314
  • zjc314
  • 2017年10月19日 00:12
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ruby的符号(Symbol)
举报原因:
原因补充:

(最多只允许输入30个字)