symbol 分析

Symbol 是什么

Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字。

在 Ruby 中每一个对象都有唯一的对象标识符(Object Identifier),可以通过 object_id 方法来得到一个对象的标识符。

 

见,每个 String 对象都是不同的,即便他们包含了相同的字符串内容;而对于 Symbol 对象,一个名字(字符串内容)唯一确定一个 Symbol 对象

 

除了可以采用一般的字符串,还可以使用操作符(例如+, -, *, /),变量,常量,方法甚至类的名字来创建 Symbol 对象,例如:+就是一个合法的 Symbol 。实际上,在 Ruby 内部操作符、变量等名字本身就是作为 Symbol 处理的,例如当你定义一个实例变量时, Ruby 会自动创建一个 Symbol 对象,例如 @test 对应为 :@test

Symbol 对象一旦定义将一直存在,直到程序执行退出。所有 Symbol 对象存放在 Ruby 内部的符号表中,可以通过类方法 Symbol.all_symbols 得到当前 Ruby 程序中定义的所有 Symbol 对象,该方法返回一个 Symbol 对象数组。由于 Symbol 比较多,你可以 dump 到文件中来查看。

 

Symbol 转化为 String

使用 to_s 或 id2name 方法将 Symbol 转化为一个 String 对象

注意,每个 String 对象都是唯一的,因此对一个 Symbol 调用多次将产生多个 String 对象。

 

String 转化为 Symbol

除了在字符串前面加冒号,还可以使用 to_sym 或 intern 方法将 String 转化为 Symbol ,如果该 Symbol 已经存在,则直接返回

 

使用 Symbol

正如前边提到的, Ruby 内部一直在使用 Symbol ,比如 Ruby 程序中的各种名字,Symbol本质上是 Ruby 符号表中的东西。使用 Symbol 处理名字可以降低 Ruby 内存消耗,提高执行速度,这点我们在下一篇文章中会看到。

那么 Symbol 对我们有什么用呢?当然也是内存。使用 String 的开销太大了,因为每一个String 都是一个对象。想想前边的例子,一个字符串每出现一次 Ruby 就会创建一个 String 对象。

通常来讲,当你面临 String 还是 Symbol 的选择时,可以参考以下标准:

  • 如果使用字符串的内容,这个内容可能会变化,使用 String
  • 如果使用固定的名字或者说是标识符,使用 Symbol

那么什么时候我们会用到名字呢?很多时候都会,比如枚举值、关键字(哈希表关键字、方法的参数)等等

 

哈希参数

                
def my_method(para1, …, options={})
#your code
end

def my_method(options={})
#your code
end

如果你希望设定一些默认参数,并允许调用者更改这些参数,可以使用哈希对象的 merge! 方法

hsh.merge!( other_hash )该方法将 other_hash 里内容加到 hsh 中,如果other_hash hsh 有重复的 key ,则 key other_hash 中的 value 覆盖 hsh 中对应 key value 如果你希望设定一些默认参数,并允许调用者更改这些参数,可以使用哈希对象的 merge! 方法

hsh.merge!( other_hash )该方法将 other_hash 里内容加到 hsh 中,如果other_hash hsh 有重复的 key ,则 key other_hash 中的 value 覆盖 hsh 中对应 key value

 

 

symbol 的分析参考: http://www.ibm.com/developerworks/cn/opensource/os-cn-rubysbl2/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值