为什么Matz选择在Ruby中默认使字符串可变?

为什么Matz选择在Ruby中默认使字符串可变?,ruby,string,language-design,immutability,mutable,Ruby,String,Language Design,Immutability,Mutable,这个问题正好相反: 在Ruby中做出这个选择仅仅是因为操作(附录等)在可变字符串上是有效的,还是有其他原因 (如果只是效率的话,那就显得很奇怪,因为Ruby的设计似乎没有高度重视促进高效的实现。)正如您所注意到的,这与Ruby的设计是一致的。不可变字符串比可变字符串效率更高—由于字符串被重复使用,复制更少—但这会使程序员的工作更加困难。直观地看,字符串是可变的-您可以将它们连接在一起。为了解决这个问题,Java无声地将两个字符串的串联(通过+)转换为使用StringBuffer对象,我相信还有其

这个问题正好相反:

在Ruby中做出这个选择仅仅是因为操作(附录等)在可变字符串上是有效的,还是有其他原因


(如果只是效率的话,那就显得很奇怪,因为Ruby的设计似乎没有高度重视促进高效的实现。)

正如您所注意到的,这与Ruby的设计是一致的。不可变字符串比可变字符串效率更高—由于字符串被重复使用,复制更少—但这会使程序员的工作更加困难。直观地看,字符串是可变的-您可以将它们连接在一起。为了解决这个问题,Java无声地将两个字符串的串联(通过
+
)转换为使用StringBuffer对象,我相信还有其他类似的方法。相反,Ruby选择以牺牲性能为代价,使字符串在默认情况下是可变的

Ruby还有许多破坏性的方法,比如
String#upcase

另一个可能的原因是Ruby受到Perl的启发,Perl恰好使用可变字符串


Ruby有符号和冻结字符串,它们都是不可变的。作为额外的奖励,符号保证每个可能的字符串值都是唯一的。

这些是我的意见,不是Matz的。为了回答这个问题,当我说一种语言有“不可变字符串”时,这意味着它的所有字符串都是不可变的,也就是说,没有办法创建一个可变的字符串

  • “不可变字符串”设计将字符串视为标识符(例如哈希键和其他VM内部使用)和数据存储结构。其思想是,标识符是可变的是危险的。对我来说,这听起来像是违反了单一责任。在Ruby中,我们有标识符的符号,所以字符串可以作为数据存储。Ruby确实允许字符串作为散列键,但我认为程序员很少将字符串存储到变量中,将其用作散列键,然后修改字符串。在程序员的心目中,有(或应该有)两种字符串用法的分离。通常情况下,用作散列键的字符串是文本字符串,因此它发生变异的可能性很小。使用字符串作为散列键与使用两个字符串的数组作为散列键没有太大区别。只要你的头脑很好地掌握了你用什么作为钥匙,那么就没有问题

  • 从认知简单性的角度来看,使用字符串作为数据存储非常有用。只需考虑java及其<代码> StringBuffer <代码>。这是一个额外的数据结构(在一个已经很大且通常不直观的标准库中),如果您试图执行字符串操作,例如在另一个字符串的某个索引处插入一个字符串,则必须对其进行管理。因此,一方面,Java认识到需要执行这些类型的操作,但是由于不可变字符串向程序员公开,他们必须引入另一种结构,这样操作仍然是可能的,而不需要我们重新发明轮子。这给程序员带来了额外的认知负荷

  • 在Python中,插入最简单的方法似乎是在插入点之前和之后获取子字符串,然后围绕要插入的字符串连接它们。我想他们可以很容易地向标准库添加一个方法,插入并返回一个新字符串。但是,如果该方法被称为
    insert
    ,初学者可能会认为它改变了字符串;为了便于描述,它必须被称为
    new\u,并插入
    或类似的奇怪内容。在日常使用中,“插入”意味着您更改了插入内容(例如,将信封插入邮箱会更改邮箱内容)。这再次提出了一个问题:“为什么我不能更改我的数据存储?”

  • Ruby提供了对象冻结功能,因此可以安全地传递对象,而不会引入细微的bug。好的方面是Ruby对待字符串就像对待任何其他数据结构(数组、哈希、类实例)一样;它们都可以冷冻。一致性是程序员友好的。不可变字符串使字符串作为一种“特殊”数据结构脱颖而出,而实际上,如果您将其用作数据存储的话,它并不是一种特殊的数据结构


  • 注:我对Ruby知之甚少。但是我对语言设计感兴趣。你为什么不问问Matz呢?他可能比我们有更好的答案do@Sam:哈哈,说得好。我希望他在某个地方写过这篇文章,有人可以给我指一下或总结一下。通过调用
    .freezed
    可以使字符串不可变,但你不能真正使不可变字符串可变-这违反了原则。例如,如果我将一个不可变字符串传递给一个函数,我不会期望该函数使其变为可变并开始更改它。作为一名程序员,不可变性会给我带来额外的工作,这一想法让我着迷。我对额外工作的想法是,我必须非常小心地将字符串显示给谁,因为任何人都可能对其进行变异!我喜欢我不变的字符串@rjh:这些天我的精神科医生只允许我使用整数和浮点数,她对浮点数不太确定。不可变字符串究竟是如何“让程序员更难工作”的?值得一提的是,这是Ruby 3.0中可能会改变的行为