在Ruby的学习过程中应该不乏接触到Symbol,就是以冒号开头的变量名如 :tems_of_service,特别是在Rails中,更是大量使用Symbol。
这不乏让初学者感觉有些疑惑,疑惑的是Symbol有什么作用,什么时候使用Symbol才是正确的?以下根据最近学习的体会进行总结。
1、什么是Symbol
Jim Weirich:Symbol是有名字的对象
Austin Ziegler:An object that is a name
2、Symbol和字符串
Symbol和字符串的主要区别在于,内存的存储方式上。
符号 :a_symbol在多次使中引用的是同一个内存地址。
而字符串 “a_string”在多次使用中指向的是不同的内存地址,即每次都生成一个新的对象。
Symbol和字符串是可以相互转换的,一般来说使用Symbol的地方使用字符串来代替都是合法的。
可以通过以下方法进行转换:
:a_symbol.to_s #=>"a_symbol" :a_symbol.id2name #=>"a_symbol" "a_string".to_sym #=>:a_string "a_string".intern # =>:a_string
3、Symbol的作用
第一是 节省内存的用量,提高性能
特别对于Rails如果不适用Symbol,某一个字符串可能会被使用很多次,在大访问量情况下节省的资源还是不可忽视的。
另外对于hash对象,如果使用Symbol也可以提高效率,因为使用字符串必须每次计算字符串的hash。
第二是 易读性
它使得语言的理解更加自然,如attr_accessor :a_name 我们很容易理解Ruby将生成一个以a_name为名字的访问器。
4、什么时候使用Symbol
引用Ruby黑客Jim Weirich的两句话:
如果对象的内容(字符创序列)总要,那么使用字符串。
如果对象的一致性重要,那么使用符号。