smalltalk中的文字字符串是否可变



1)stringstring literal 之间有什么区别

2) 一本书说'zero' at: 1 put: $h会失败,因为文字是不可变的,但如果我这样做,'zero' copy at: 1 put: $h会起作用,因为复制一个文字字符串会产生另一个不是文字的字符串。困惑的

想象一下,您有一个方法回答一个文字字符串(文字意味着其内容在源代码中按字面形式写入)

MyClass>>constantString
    ^'foo'

现在,如果这个文本字符串是可变的,那么您可以糟糕地执行这个片段

MyClass new constantString at: 1 put: $b.

然后MyClass的每个实例都会对#constantString回答"boo"。不过,您不明白为什么,因为源代码仍然指示"foo"。肮脏的

一些Smalltalk方言使这些文字字符串不可变,以避免这种意外的坏惊喜。有些没有虚拟机对不变性的支持,而是让用户承担全部责任。

| a b |
a := b := 'foo'.
a == b. "=> true, so the identical string"
a at: 1 put: $b.
b "=> 'boo'

所以在Squeak中,可能在Pharo中,字符串文字并不是一成不变的。

其他Smalltalks确实支持不变性,因此中的字符串文字(Smalltalk)确实是不可变的。

关于复制,也许你从其他语言中继承了一些假设。'foo'是一个字面意思,即有创建String的语法,但实际上,'foo'只是另一个对象。在Squeak和Pharo中,这些文字只是普通的String实例,因此您可以自由地对它们进行变异。

正如上面的片段所示,这可能会导致意外的结果,因为如果将第一行更改为a := 'foo'. b := 'foo'.,最终仍然会得到相同的结果:Squeak悄悄地共享该文本,而不是创建一个具有相同值的新文本。

这本书错了。在吱吱声中,字符串不是一成不变的。那是哪本书?

'zero' at: 1 put: $h; yourself.=>"英雄"

'zero' copy at: 1 put: $h; yourself=>"英雄"

不过,字符是不可变的。如果他们不这样做,那会很有趣。

最新更新