September 29, 2022

Boolean Messages


aFrog = bFrog

  • Test for equality. Does the receiver aFrog have the same state as the argument bFrog? i.e. do their instance variables reference the same values? It does not test for object identity. Answers true or false.

aFrog == bFrog

  • Test for identity. Is aFrog the same object as bFrog? i.e. do they both reference the same memory address? This message selector is inherited by all Smalltalk objects, from Object, and is never overridden. Answers true or false.

The other comparison operators are:

~= "inequality"
< "less than"
> "greater than"
<= "less than or equal to"
>= "greater than or equal to"

More complex Boolean expressions can be constructed using three other Boolean operators. They are

and is written in Smalltalk as &. It takes two Boolean operands and returns true if both operands return true. Otherwise it answers false.

(3 < 4) & (5 < 6)
"evaluates to"
(true) & (true)
"answers true"

(6 > 7) & (4 < 9)
"evaluates to"
(false) & (true)
"answers false"

true & false "answers false"
false & false "answers false"

or written in Smalltalk as | (the vertical bar, or pipe character)
It takes two Boolean operands and returns true if one or both of those operands returns true. Otherwise it will return false.

(2 < 5) | (9 > 18)
"evaluates to"
true | false
"answers true"

(20 < 10) | (5 > 1)
"evaluates to"
false | false
"answers false"

true | true "answers true"

not written in Smalltalk as not

Unlike the two previous binary operators not is a unary operator. It takes a single Boolean operand and negates that operand.

(10 > 5) not
"evaluates to"
true not
"answers false"

If you try and evaluate not true you will find that Smalltalk will ask you to create not as a variable. Remember true is the receiver of the not message and will return false as its message answer.

Similarly false not returns true

Go here for some Boolean questions and answer.

There are two other useful Boolean message selectors, and: , or:
Both of these selectors take blocks as their arguments. However, by using and:, as opposed to &, if the receiver happens to be false the argument to and: will not be evaluated. This is a far more efficient means of testing Boolean variables than the use of &, because in the latter case the block will be evaluated even if the receiver is false. Go here for an example of using and:

Similarly, try using or: instead of |.

Next page » Conclusion

Previous page « Branching
































































Up to top of page