相關的一切都已經被sayd,但只爲您的娛樂:
象前面說,
rcvr ifTrue:[...] ifFalse:[...]
是一個單一的消息# 'ifTrue:ifFalse:' 與2個ARGS發送到rcvr。該表達式的值是該消息發送的值。 相反:
rcvr ifTrue:[...]; ifFalse:[...]
是2條連續的消息(# 'ifTrue: '和#' ifFalse:')的級聯,每個發送到RCVR 1個ARG。表達式的值是從上次發送返回的值。
現在有趣的是,布爾搞明白ifTrue:/ifFalse:(每1個ARG), 所以你的代碼工作的副作用(評估這些塊),而不是它的價值。 這意味着:
a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
生成輸出相同:
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
但:
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
將在MSG產生不同的值大於:
msg := a > b ifTrue:['gt'] ifFalse:['le']
取決於值a和b。試試(a b)=(1 2)與(a b)=(2 1)...
許多Smalltalk初學者的問題是,他們認爲ifXXX:作爲語法,它實際上是一個消息發送產生價值。另外,半並不像許多以前學過的語言那樣是一個語句分隔符,而是一個排序消息發送結構。
對於初學者來說是一個糟糕的陷阱,因爲代碼似乎適用於某些特定的值組合,而它爲其他人產生了有趣的結果。 讓我們希望你的單元測試覆蓋這些;-)
編輯:看到哪裏不好值從何而來,看看什麼是布爾返回>> ifFalse:方法一真實接收器...
爲了完整起見,用於_cascade_ - 發送給同一對象的一系列消息。富吧巴茲。與富酒吧的意義相同。 foo baz。 – 2010-06-27 15:59:09
你的理解是錯誤的;它不是「接收......然後......」,而是「接收一條消息」。請參閱下面的回覆。 – blabla999 2012-11-28 11:34:48