簡體   English   中英

文字字符串在smalltalk中是否可變?

[英]Are literal strings mutable in 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中,字符串文字不是一成不變的。

其他Smalltalk確實支持不可變性,因此這些 Smalltalk中的字符串文字確實是不可變的。

關於復制,也許您是從其他語言繼承過來的。 從某種意義上說, 'foo'是一種字面量,它具有創建String的語法,但實際上, 'foo'只是另一個對象。 在Squeak和Pharo中,這些文字只是普通的String實例,因此您可以隨意對其進行突變。

如上面的代碼片段所示,這可能會導致意外的結果,因為如果將第一行更改a := 'foo'. b := 'foo'. a := 'foo'. b := 'foo'. 您仍然會得到相同的結果:Squeak靜靜地共享該文字,而不是使用相同的值制作一個新的文字。

這本書是錯的。 在吱吱聲中,字符串不是不可變的。 那是哪本書?

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

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

字符是不可變的。 如果不是,那將很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM