关于ruby中符号和字符串的区别

Python017

关于ruby中符号和字符串的区别,第1张

1,符号字符串,都是ruby中表示文本的方式

他们之间是可以通过to_sym 和 to_s 之间来转换的

:username.to_s

username

'username'.to_sym

:username

2, 相同的符号代表的一定是同一个对象,相同的字符串代表的不一定是同一个对象

这个是最大的区别,符号是不可更改的,字符串是可以修改的、

3,性能上,符号更加占优

正是因为符号不可变,而字符串变量必须具有含有修改其类容的功能,所以系统开销比较大,所以一般遇到不需要修改的文本信息时,建议使用符号。

经常看到一些写法,比如

我们知道, &符号在ruby中是用来调用块的,而 : 符号一般是表示symbol类型,通常用来表示方法,或者调用类的实例变量(实例变量需要在类中用attr_reader或者attr_accessor声明。)

所以,上面的表达方式等同于 array.uniq {|a| a.first}.sort_by {|x| x.last}

即先按照数组的第一个元素去重,然后再按照数组的最后一个元素排序。

http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby 参考第一个答案。

1. 字符串和符号,都是Ruby中表示文本的方式

不管字符串变量也好,符号变量也好,都是用来表示文本的,它们之间,也可以互相转换(通过to_sym和to_s):

>> "book".to_sym

=>:book

>> :track.to_s

=>"track"

2. 相同的符号是一个对象,相同的字符并不一定是一个对象

这就是符号和字符串最大的差别,符号是不可变的,不能对一个符号进行修改。所以说,两个看起来相同的符号一定是一个对象,但是说两个看起来一样的字符串是一个对象,就不对了。

这里,我们用 equal? 方法检验这一点,当两个对象相同时,equal返回true,反之是false:

>> :book.equal?(:book)

=>true

>> "book".equal?("book")

=>false