我想比較Smalltalk中的兩個字符串,但我似乎做錯了什麼。Smalltalk - 比較兩個字符串是否相等
我不斷收到此錯誤:
未處理的異常:非布爾接收器。繼續講真話。
stringOne := 'hello'.
stringTwo := 'hello'.
myNumber := 10.
[stringOne = stringTwo ] ifTrue:[
myNumber := 20].
任何想法我做錯了什麼?
我想比較Smalltalk中的兩個字符串,但我似乎做錯了什麼。Smalltalk - 比較兩個字符串是否相等
我不斷收到此錯誤:
未處理的異常:非布爾接收器。繼續講真話。
stringOne := 'hello'.
stringTwo := 'hello'.
myNumber := 10.
[stringOne = stringTwo ] ifTrue:[
myNumber := 20].
任何想法我做錯了什麼?
嘗試
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
您是否應該阻止比較?我原以爲:
(stringOne = stringTwo) ifTrue: [ myNumber := 20 ]
就足夠了。
那裏的parens既是不必要的,也是非典型的。實際上,我發現如果我正在編寫需要parens(尤其是嵌套parens)的表達式,那麼我可能會讓事情太複雜,並將其重構爲temp或獨立的方法調用。 – 2009-10-29 14:43:33
[stringOne = stringTwo]
是塊,而不是一個布爾值。當調用塊,也許這將導致一個布爾值。但是你並沒有在這裏調用這個塊。相反,你只是導致塊是ifTrue
接收器。
相反,嘗試:
(stringOne = stringTwo) ifTrue: [
myNumber := 20 ].
正如其他人所說,它會工作你想,如果你擺脫第一組方括號的方式。
但要解釋你正在運行到更好的問題:
[stringOne = stringTwo ] ifTrue:[myNumber := 20]
是將消息傳遞給ifTrue:
塊和塊不明白的方法,只有布爾對象一樣。
如果先評估該塊,它會評估爲一個真正的對象,然後將知道如何應對:
[stringOne = stringTwo] value ifTrue:[myNumber := 20]
或者你應該做的,正如其他人所指出的:
stringOne = stringTwo ifTrue:[myNumber := 20]
在將ifTrue:[...]
發送給它之前,兩者都評估stringOne = stringTwo
到true
。
but I seem to be doing something wrong
假設你正在使用您的VisualWorks中安裝應包括一個doc文件夾。
看看AppDevGuide.pdf - 它有很多關於使用VisualWorks進行編程的信息,更多的關於它有很多關於Smalltalk編程的介紹性信息。
查看內容表中的開始部分,直到點擊「分支」或「條件測試」,然後您會看到PDF中相應的部分,告訴你所有關於Smalltalk if-then-else並給出了能幫助你看到你做錯了什麼的例子。
我想補充以下50Cent:
爲塊實際上它可以傳遞lambda表達式,另一個很好的例子是下面的方法:
do:aBlock ifCondition:aCondition
... some more code ...
aCondition value ifTrue: aBlock.
... some more code ...
aBlock value
...
所以參數ifTrue:/ifFalse:實際上可以來自其他人。這種傳入條件通常在「..如果:」或「..錯誤:」類方法中有用。
(最初的意思是評論,但我無法得到未格式化的代碼示例)
感謝我的同伴Android。這是問題所在。 – user69514 2009-10-29 02:36:47
Woof - 我不是那麼熟悉的Smalltalk,但我想起了方括號用於評估,如果你評估'='運算符,你不會得到一個布爾值:) – Bostone 2009-10-29 03:35:26
嘆息 - 想在這裏添加acode的例子,但這是錯誤的格式。忘記它,我添加了一個答案... – blabla999 2011-05-11 07:50:46