Вы можете использовать
word doWithIndex: [:c :i | c = guess ifTrue: [mask at: i put: c]]
, что эквивалентно:
i := 1.
word do: [:c |
c = guess ifTrue: [mask at: i put: c].
i := i + 1]
, за исключением того, что вам не нужно инициализировать и увеличивать i
(что немного большеподвержен ошибкам и более многословен)
Приложение
Учитывая, что экземпляры String
не могут расти или изменять свой размер, что является неизменным, я предполагаю, чточто может измениться - это переменная word
.В этом случае вы должны инициализировать mask
соответственно, чтобы обе строки всегда имели одинаковую длину.Например:
word: aString
word := aString.
mask := word copy atAllPut: $?
Если вы также хотите сохранить уже угаданные символы:
word: aString
| guessed |
word := aString.
guessed := mask reject: [:c | c = $?].
mask := word copy atAllPut: $?.
guessed do: [:c | self try: c].
Где #try:
- это метод, который мы использовали до
try: aCharacter
word doWithIndex: [:c :i | c = aCharacter ifTrue: [mask at: i put: c]]
(при желании вы можете uppercase
вещей)