2009-10-29 88 views
8

我想比較Smalltalk中的兩個字符串,但我似乎做錯了什麼。Smalltalk - 比較兩個字符串是否相等

我不斷收到此錯誤:

未處理的異常:非布爾接收器。繼續講真話。

stringOne := 'hello'. 
stringTwo := 'hello'. 
myNumber := 10. 

[stringOne = stringTwo ] ifTrue:[ 
    myNumber := 20]. 

任何想法我做錯了什麼?

回答

16

嘗試

stringOne = stringTwo 
    ifTrue: [myNumber := 20]` 

我不認爲你需要在第一線

找到很好的解釋方括號。整個thing is here

在Smalltalk中,布爾值(即True或False)是對象:具體來說,它們是抽象基類布爾值的實例,或者是它的兩個子類True和False。所以每個布爾類型都是True或False,並且沒有實際的成員數據。 Bool有兩個虛函數,ifTrue:和ifFalse:,它們將一個代碼塊當作它們的參數。 True和False都會覆蓋這些函數; True的版本ifTrue:調用它傳遞的代碼,False的版本不做任何事情(反之ifFalse也是如此:)。這裏有一個例子:

a < b 
    ifTrue: [^'a is less than b'] 
    ifFalse: [^'a is greater than or equal to b'] 

順便說一句,方括號中的那些東西基本上是匿名函數。除了它們是對象之外,因爲所有東西都是Smalltalk中的一個對象。現在,發生什麼事情是我們稱之爲「<」的方法,帶有參數b;這會返回一個布爾值。我們把它的ifTrue:和ifFalse:方法作爲參數傳遞給我們要執行的代碼。效果與Ruby代碼相同

if a < b then 
    puts "a is less than b" 
else 
    puts "a is greater than or equal to b" 
end 
+0

感謝我的同伴Android。這是問題所在。 – user69514 2009-10-29 02:36:47

+0

Woof - 我不是那麼熟悉的Smalltalk,但我想起了方括號用於評估,如果你評估'='運算符,你不會得到一個布爾值:) – Bostone 2009-10-29 03:35:26

+0

嘆息 - 想在這裏添加acode的例子,但這是錯誤的格式。忘記它,我添加了一個答案... – blabla999 2011-05-11 07:50:46

0

您是否應該阻止比較?我原以爲:

(stringOne = stringTwo) ifTrue: [ myNumber := 20 ] 

就足夠了。

+1

那裏的parens既是不必要的,也是非典型的。實際上,我發現如果我正在編寫需要parens(尤其是嵌套parens)的表達式,那麼我可能會讓事情太複雜,並將其重構爲temp或獨立的方法調用。 – 2009-10-29 14:43:33

1

[stringOne = stringTwo]是塊,而不是一個布爾值。當調用塊,也許這將導致一個布爾值。但是你並沒有在這裏調用這個塊。相反,你只是導致塊是ifTrue接收器。

相反,嘗試:

(stringOne = stringTwo) ifTrue: [ 
    myNumber := 20 ]. 
4

正如其他人所說,它會工作你想,如果你擺脫第一組方括號的方式。

但要解釋你正在運行到更好的問題:

[stringOne = stringTwo ] ifTrue:[myNumber := 20] 

是將消息傳遞給ifTrue:塊和塊不明白的方法,只有布爾對象一樣。

如果先評估該塊,它會評估爲一個真正的對象,然後將知道如何應對:

[stringOne = stringTwo] value ifTrue:[myNumber := 20] 

或者你應該做的,正如其他人所指出的:

stringOne = stringTwo ifTrue:[myNumber := 20] 

在將ifTrue:[...]發送給它之前,兩者都評估stringOne = stringTwotrue

0

but I seem to be doing something wrong

假設你正在使用您的VisualWorks中安裝應包括一個doc文件夾

看看AppDevGuide.pdf - 它有很多關於使用VisualWorks進行編程的信息,更多的關於它有很多關於Smalltalk編程的介紹性信息。

查看內容表中的開始部分,直到點擊「分支」或「條件測試」,然後您會看到PDF中相應的部分,告訴你所有關於Smalltalk if-then-else並給出了能幫助你看到你做錯了什麼的例子。

0

我想補充以下50Cent:

爲塊實際上它可以傳遞lambda表達式,另一個很好的例子是下面的方法:

do:aBlock ifCondition:aCondition 
    ... some more code ... 
    aCondition value ifTrue: aBlock. 
    ... some more code ... 
    aBlock value 
    ... 

所以參數ifTrue:/ifFalse:實際上可以來自其他人。這種傳入條件通常在「..如果:」或「..錯誤:」類方法中有用。

(最初的意思是評論,但我無法得到未格式化的代碼示例)