2011-04-07 69 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

相关问题