2011-04-07 71 views
1

詢問對象是否是布爾值的最佳方式是什麼?知道是否是布爾值的最佳方法

按照要求,這裏的原因:

我一個打印的東西的方法,任何一種東西,當這個東西是一個布爾值,我想它打印「是」或「否」,而不是對或錯。我是做像這樣,但它看起來太一劈對我說:

[anObject 
    ifTrue: [ 'Yes' ] 
    ifFalse: [ 'No' ] ] 
     on: Error 
     do: [ anObject printString ] 
+1

或許,如果你能解釋一下你爲什麼要」問一個反對它是否是布爾型的「專家將能夠提出與你需要的東西相匹配的東西。 – igouy 2011-04-07 19:19:44

回答

5

添加您自己的PRINTSTRING的定義則:

Object >> #bernatPrintString 
    ^self printString 

True >> #bernatPrintString 
    ^'Yes' 

False >> #bernatPrintString 
    ^'No' 
+1

謝謝,這看起來更多OO – 2011-04-12 08:28:02

+0

這是一個很好的解決方案,但它不處理printString的遞歸性,('IsBernatPrintingRecursive?' - > false)bernatPrintString。 – 2012-07-17 23:25:17

2

value isKindOf: Boolean - 但我會避免這樣的檢查!也許有一些有點不對了,如果你需要做到這一點...

+0

是的,這就是我想避免:) – 2011-04-07 16:51:47

+0

我不認爲重點是要避免這種語法,但爲了避免檢查完全... – 2011-04-07 22:29:07

4
anObject == true or: [ anObject == false ] 
+0

謝謝,我想這是最有效的? – 2011-04-07 16:52:20

+0

是的,這是非常有效的。它不發送任何消息;它被編譯成幾個有效的字節碼。 – 2011-04-13 05:14:53

-1

更簡單,最有效的,而不是需要避免:value class == Boolean

+2

這假定'true'和'false'都是布爾類的實例。但是在通常的布爾值的Smalltalk實現中,'true'是'True'類的單例實例,'false'是'False'類的單例實例。這兩個'True'和'Flase'類都從'Boolean'繼承。 – 2011-04-08 14:55:55

0

什麼比這更簡單?

anObject isBoolean ifTrue:[...] ifFalse:[...]

+1

但isBoolean不存在於每一個方言;) – 2011-04-08 09:39:04

相關問題