学习Ruby的人都会对它的Symbol疑惑,我也一样,所以要多花点时间研究一下Symbol。
Symbol中文叫符号,因该是用来标记某样东西的。初看了一些资料,在我的脑海中,觉得Symbol就像是String一样,可以作为访问器中变量名,方法参数和hash的键,这不就是String吗。是不是呢?继续研究。
- 什么是Symbol
在形式上,最前面是个冒号的就是Symbol,
- puts :samsam
- puts :"samsam"
- puts :'samsam'
- puts :"i am samsam"
- =>samsam
- samsam
- samsam
- i am samsam
- Symbol是字符串吗
- puts :samsam
- puts "samsam"
- =>samsam
- samsam
上面打印出来的东西一样啊,Symbol好像和字符串没什么区别啊。还有什么办法可以看出他们的区别呢。试试吧
- puts :samsam.class
- puts "samsam".class
- =>Symbol
- String
豁然开朗,哦,原来他们不是同一种对象啊。对哦,Ruby中一切皆对象,Symbol也是对象啊。既然是不同的对象,肯定有不同的性质。
- Symbol的不变性
- puts :samsam.object_id
- puts :samsam.object_id
- puts :samsam.object_id
- puts "samsam".object_id
- puts "samsam".object_id
- puts "samsam".object_id
- =>99298
- 99298
- 99298
- 21103390
- 21103370
- 21103350
可以看出每个一个Symbol只有一个对象,而一个String每次使用都是一个新对象。Symbol像不像Java中的String。
- Symbol可以转换为String吗
答案是肯定的,只要用to_s方法,返回的就是冒号后面的字符串。
- puts :samsam.to_s
- =>samsam
- puts :samsam.to_s.object_id
- puts :samsam.to_s.object_id
- puts :samsam.to_s.object_id
- =>21103610
- 21103590
- 21103570
后面一段程序表明to_s后确实是String。
- Symbol能改变状态吗
既然一个Symbol在运行时只有一个对象,那我就只要你一个对象,但能不能改变这个对象的状态呢,比如改变所表示字符串的值。
- :samsam = "cool boy"
- => syntax error, unexpected '=', expecting $end
- :samsam = "cool boy"
- ^
- :samsam.to_s = "cool boy"
- =>undefined method `to_s=' for :samsam:Symbol (NoMethodError)
看来是不行了,那就让Symbol洁身自好吧。
- Symbol有什么用
Symbol作为一个符号,可以怎么用呢,是不是可以代替String用呢?是的。但是在一些地方还是习惯用Symbol,比如hash的键。用Symbol的好处是可以节省内存,不用每次用到的时候创建一个对象。
- Symbol不适合做什么
一句话,如果你需要改变它的状态或需要用String丰富的方法,那你就不适合用Symbol,还是用最基本的Strign吧。