2010-06-27 43 views
7
a > b 
ifTrue:[ 'greater' ] 
ifFalse:[ 'less or equal' ] 

我理解的是布爾A> B接收該消息ifTrue:[ '更大'],然後ifFalse:[ '小於或等於']遵守到概括:爲什麼ifTrue和ifFalse沒有被隔開;在Smalltalk中?

objectInstance selector; selector2 

但有一分號需要指定selector2的接收者不是(objectInstance選擇符),而是objectInstance。與上面的條件執行不一樣嗎?

+0

爲了完整起見,用於_cascade_ - 發送給同一對象的一系列消息。富吧巴茲。與富酒吧的意義相同。 foo baz。 – 2010-06-27 15:59:09

+0

你的理解是錯誤的;它不是「接收......然後......」,而是「接收一條消息」。請參閱下面的回覆。 – blabla999 2012-11-28 11:34:48

回答

19

該方法的選擇是Boolean>>ifTrue:ifFalse:,這意味着它是一個方法與參數,而不是方法與一個參數。

Ergo,要調用該方法,請使用兩個塊參數向其發送消息ifTrue:ifFalse:

請注意,爲了方便起見,還有方法Boolean>>ifFalse:ifTrue:,Boolean>>ifTrue:Boolean>>ifFalse:

7

相關的一切都已經被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'] 

取決於值ab。試試(a b)=(1 2)與(a b)=(2 1)...

許多Smalltalk初學者的問題是,他們認爲ifXXX:作爲語法,它實際上是一個消息發送產生價值。另外,半並不像許多以前學過的語言那樣是一個語句分隔符,而是一個排序消息發送結構。

對於初學者來說是一個糟糕的陷阱,因爲代碼似乎適用於某些特定的值組合,而它爲其他人產生了有趣的結果。 讓我們希望你的單元測試覆蓋這些;-)

編輯:看到哪裏不好值從何而來,看看什麼是布爾返回>> ifFalse:方法一真實接收器...

+0

+1用於通知不同的返回值 – 2012-11-28 23:17:58

相關問題