有关Ruby的Symbol


    学习Ruby的人都会对它的Symbol疑惑,我也一样,所以要多花点时间研究一下Symbol。


    Symbol中文叫符号,因该是用来标记某样东西的。初看了一些资料,在我的脑海中,觉得Symbol就像是String一样,可以作为访问器中变量名,方法参数和hash的键,这不就是String吗。是不是呢?继续研究。

 

  • 什么是Symbol

在形式上,最前面是个冒号的就是Symbol,

Ruby代码   收藏代码
  1. puts :samsam  
  2. puts :"samsam"  
  3. puts :'samsam'  
  4. puts :"i am samsam"  
  5. =>samsam  
  6.   samsam  
  7.   samsam  
  8.   i am samsam  

 

  •  Symbol是字符串吗 
Ruby代码   收藏代码
  1. puts :samsam  
  2. puts "samsam"  
  3. =>samsam  
  4.   samsam  

     上面打印出来的东西一样啊,Symbol好像和字符串没什么区别啊。还有什么办法可以看出他们的区别呢。试试吧

 

Ruby代码   收藏代码
  1. puts :samsam.class  
  2. puts "samsam".class  
  3. =>Symbol  
  4.   String  

     豁然开朗,哦,原来他们不是同一种对象啊。对哦,Ruby中一切皆对象,Symbol也是对象啊。既然是不同的对象,肯定有不同的性质。

 

  • Symbol的不变性
Ruby代码   收藏代码
  1. puts :samsam.object_id  
  2. puts :samsam.object_id  
  3. puts :samsam.object_id  
  4. puts "samsam".object_id  
  5. puts "samsam".object_id  
  6. puts "samsam".object_id  
  7. =>99298  
  8.   99298  
  9.   99298  
  10.   21103390  
  11.   21103370  
  12.   21103350  

     可以看出每个一个Symbol只有一个对象,而一个String每次使用都是一个新对象。Symbol像不像Java中的String。

 

  • Symbol可以转换为String吗

    答案是肯定的,只要用to_s方法,返回的就是冒号后面的字符串。

Ruby代码   收藏代码
  1. puts :samsam.to_s  
  2. =>samsam  
  3.   
  4. puts :samsam.to_s.object_id  
  5. puts :samsam.to_s.object_id  
  6. puts :samsam.to_s.object_id  
  7. =>21103610  
  8.   21103590  
  9.   21103570  

   后面一段程序表明to_s后确实是String。

 

  • Symbol能改变状态吗

    既然一个Symbol在运行时只有一个对象,那我就只要你一个对象,但能不能改变这个对象的状态呢,比如改变所表示字符串的值。

Ruby代码   收藏代码
  1. :samsam = "cool boy"  
  2. => syntax error, unexpected '=', expecting $end  
  3. :samsam = "cool boy"  
  4.          ^  
  5. :samsam.to_s = "cool boy"  
  6. =>undefined method `to_s=' for :samsam:Symbol (NoMethodError)  

     看来是不行了,那就让Symbol洁身自好吧。

 

  • Symbol有什么用

    Symbol作为一个符号,可以怎么用呢,是不是可以代替String用呢?是的。但是在一些地方还是习惯用Symbol,比如hash的键。用Symbol的好处是可以节省内存,不用每次用到的时候创建一个对象。

 

  • Symbol不适合做什么

    一句话,如果你需要改变它的状态或需要用String丰富的方法,那你就不适合用Symbol,还是用最基本的Strign吧。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值