1.Symbol 是什么
Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字。
创建一个 Symbol 对象的方法是在名字或者字符串前面加上冒号:
Symbol本质上(C语言层次)是无符号整数 这是Symbol和String的本质区别。也是用Symbol替代String可以提高执行速度的原因
2.区别
在 Ruby 中每一个对象都有唯一的对象标识符(Object Identifier),可以通过 object_id 方法来得到一个对象的标识符。我们来看看 Symbol 对象和 String 对象的差别:
irb(main):001:0> puts :foo.object_id 327458 => nil irb(main):002:0> puts :foo.object_id 327458 => nil irb(main):003:0> puts :"foo".object_id 327458 => nil irb(main):004:0> puts "foo".object_id 24303850 => nil irb(main):005:0> puts "foo".object_id 24300010 => nil irb(main):006:0> puts "foo".object_id 24296170 => nil
3.用法
当变量是不可变动时,可使用symbol,因为他更像标签,而且速度比字符串块,适合做hash的key
hosts = { :beijing => 'machine1', :shanghai => 'machine2', :guangzhou => 'machine3', :tianjin => 'machine4', :shenzhen => 'machine5' }
或者哈希参数的方法
class Test def my_method(opts={}) default_opts={:arg1 => 10, :arg2 => "abc"} default_opts.merge!(opts) default_opts.each{|key,value| puts "#{key} is #{value}"} end end t = Test.new t.my_method :arg1=>5, :arg3=>"def" 运行结果 arg1 is 5 arg2 is abc arg3 is def
4.和String的互相转换
string可透过.to_sym及.intern转换symbol。
"lakers".to_sym => :lakers "lakers".intern => :lakers
Symbol 到 String irb(main):001:0> :test.id2name => "test" irb(main):002:0> :test.to_s => "test" irb(main):003:0> :"I am a boy".to_s => "I am a boy"