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