Smalltalk - Сравните две строки для равенства

Вы захотите найти папку своего профиля ( инструкции ), а затем найдите папку с названием «расширения». Там будет папка для каждого установленного вами дополнения.

Обратите внимание, что каждый раз, когда надстройка обновляется, ваши изменения будут перезаписываться.

9
задан BIBD 29 October 2009 в 19:51
поделиться

5 ответов

Попробуйте

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
17
ответ дан 4 December 2019 в 09:37
поделиться

Как говорили другие, это будет работать так, как вы хотите, если вы избавитесь от первого набора квадратных скобок.

Но чтобы лучше объяснить проблему, с которой вы столкнулись:

[stringOne = stringTwo ] ifTrue:[myNumber := 20]

передает сообщение ifTrue: блоку, а блоки не понимают этот метод, только логические объекты понимают.

Если вы сначала оцените блок, он будет оценивать как истинный объект, который будет тогда знайте, как ответить:

[stringOne = stringTwo] value ifTrue:[myNumber := 20]

Или что вам действительно нужно делать, как указывали другие:

stringOne = stringTwo ifTrue:[myNumber := 20]

оба из которых оценивают stringOne = stringTwo до true перед отправкой ] ifTrue: [...] к нему.

4
ответ дан 4 December 2019 в 09:37
поделиться

[stringOne = stringTwo] - это блок, а не логическое значение. Когда блок вызывается, возможно, результатом будет логическое значение. Но вы не вызываете блок здесь. Вместо этого вы просто заставляете блок быть получателем ifTrue .

Вместо этого попробуйте:

(stringOne = stringTwo) ifTrue: [
    myNumber := 20 ].
1
ответ дан 4 December 2019 в 09:37
поделиться

Следует ли блокировать сравнение? Я бы подумал, что:

( stringOne = stringTwo ) ifTrue: [ myNumber := 20 ]

будет достаточно.

0
ответ дан 4 December 2019 в 09:37
поделиться

но я, кажется, делаю что-то не так

Учитывая, что вы используете VisualWorks, ваша установка должна включать папку с документами .

Посмотрите на AppDevGuide.pdf - в нем много информации о программировании с помощью VisualWorks, и более того, в нем есть много вводной информации о программировании на Smalltalk.

Просмотрите таблицу содержания в начале, до Глава 7 «Структуры управления» , щелкните «Ветвление» или «Условные тесты», и вы попадете в соответствующий раздел в PDF-файле, в котором рассказывается все о Smalltalk if-then-else и приводятся примеры, которые могли бы вам помочь. посмотрите, что вы делали неправильно.

0
ответ дан 4 December 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: