It's the reverse of this question: Why can't strings be mutable in Java and .NET?
在Ruby中做出这样的 Select 是因为操作(附录等)对可变字符串有效,还是因为其他原因?
(如果只是效率的话,那就很奇怪了,因为Ruby的设计似乎没有高度重视促进高效的实现.)
It's the reverse of this question: Why can't strings be mutable in Java and .NET?
在Ruby中做出这样的 Select 是因为操作(附录等)对可变字符串有效,还是因为其他原因?
(如果只是效率的话,那就很奇怪了,因为Ruby的设计似乎没有高度重视促进高效的实现.)
正如你所注意到的,这与Ruby的设计是一致的.不可变字符串比可变字符串更有效——由于字符串被重复使用,复制更少——但这会让程序员的工作更加困难.直观地看,字符串是可变的——可以将它们连接在一起.为了解决这个问题,Java默默地将两个字符串的串联(通过+
)转换为StringBuffer对象的使用,我相信还有其他类似的攻击.相反,Ruby Select 以牺牲性能为代价,使字符串在默认情况下是可变的.
Ruby还有许多 destruct 性的方法,比如String#upcase!
,它们依赖于字符串的可变性.
另一个可能的原因是Ruby的灵感来自Perl,而Perl恰好使用可变字符串.
Ruby有符号和冻结字符串,它们都是不可变的.作为额外的奖励,每个可能的字符串值的符号都保证是唯一的.