Попробуйте
stringOne = stringTwo
ifTrue: [myNumber := 20]`
Я не думаю, что вам нужны квадратные скобки в первой строке
Нашел отличное объяснение. Всего вещь здесь
В Smalltalk логические значения (т. Е. True или False) являются объектами: в частности, они являются экземплярами абстрактного базового класса Boolean или, скорее, его двух подклассов True и False. Таким образом, каждый логический тип имеет тип True или False и не содержит фактических данных члена. В Bool есть две виртуальные функции, ifTrue: и ifFalse:, которые принимают в качестве аргумента блок кода. И True, и False переопределяют эти функции; Версия ifTrue в True: вызывает переданный код, а версия False ничего не делает (и наоборот для ifFalse :). Вот пример:
a < b
ifTrue: [^'a is less than b']
ifFalse: [^'a is greater than or equal to b']
Кстати, эти вещи в квадратных скобках по сути являются анонимными функциями. За исключением того, что они являются объектами, потому что в Smalltalk все является объектом. Теперь происходит то, что мы вызываем метод «<» с аргументом b; это возвращает логическое значение. Мы вызываем его методы ifTrue: и ifFalse:, передавая в качестве аргументов код, который мы хотим выполнить в любом случае. Эффект такой же, как у кода Ruby </p>
if a < b then
puts "a is less than b"
else
puts "a is greater than or equal to b"
end