2009-01-23 96 views
9

这可能有些小问题,最近我一直试图在ruby上变得更好,并开始阅读精彩的The Ruby Programming Language。有人提到的是字符串文字被认为是可变的,所以在一个循环中,最好使用一个变量,然后是一个文字,因为一个新的字符串将在每次迭代中被实例化。Ruby字符串可变性

我的问题是为什么?起初我以为这是因为插值,但符号是不可变的,它们支持插值。从静态背景来看,它对我来说并没有多大意义。

编辑:

阅读thenduks的答案后,我想我可能有它。 AFAIK,Java或C#等语言没有破坏性的字符串方法(它们使用upcase,但不是upcase!)。因为事情像upcase!或< <,文字不能是不可变的。

不是100%确定的,另一种可能性是它发生的编译时实习,这是在脚本语言中不会发生的事情。

回答

7

不能确定究竟你的问题是什么,但考虑下面的代码:

10.times { puts "abc".object_id } 

此打印出10组不同的ID。为什么?仅仅因为你知道这个字符串不会改变并不意味着Ruby。如果你认为​​只应创建一次,然后如果你这样做会发生什么:

10.times { puts "abc".upcase! } 

upcase!方法变异的字符串是大写字母,在下一次迭代中第一次迭代中创建的字符串不是相同了。

也许张贴会搞乱你的代码示例?

+0

增加了一些更多的问题,并给了+1 :) – 2009-01-23 16:22:10