除了什麼肖恩DeNigris說,爲什麼比較true
在第二種情況的原因是,當你執行所有三個語句一起,編譯器要聰明,只一次爲'aaa'
並創建對象分享他們的a
和b
。
,如果你把這個變成一個方法*同樣的情況:
Object subclass: #MyClassA
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'MyApp'
!MyClassA methodsFor: 'testing' stamp: nil prior: nil!
testStrings
| a b |
a := 'aaa'
b := 'aaa'
^a == b
! !
MyClassA testStrings " ==> true"
但這不發生,如果他們是在不同的方法:
Object subclass: #MyClassB
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'MyApp'
!MyClassB methodsFor: 'testing' stamp: nil prior: nil!
a
| a |
a := 'aaa'
^a
! !
!MyClassB methodsFor: 'testing' stamp: nil prior: nil!
b
| b |
b := 'aaa'
^b
! !
!MyClassB methodsFor: 'testing' stamp: nil prior: nil!
testStrings
^self a == self b
! !
MyClassB testStrings " ==> false"
這是因爲在Squ EAK,像蜇傷文字對象存儲在它們在
*定義的方法的方法目標:從技術上講,每個DoIt
或PrintIt
,那就是當你只是通過按鍵執行代碼,被編譯到一個方法吱。
在第一種情況下,不同的對象實例,所以'false'。在第二種情況下,編譯器/解釋器顯然認爲使'a'和'b'引用相同的字符串對象是有效的,因爲這些值是相同的,並且它節省了內存,所以'true'。 – lurker