一佳一

记录像1+1一样简洁的代码

导航

ruby symbol 用法(:变量)

Posted on 2022-07-12 15:39  一佳一  阅读(235)  评论(0编辑  收藏  举报
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"