Проблема в том, что вы сравниваете первый элемент как байт, который является не символом, а числом, со строкой с одним символом пробела.В Smalltalk целые числа, символы и строки различаются, поэтому вы должны сравнить с соответствующим типом.В этом случае вы можете получить первый символ строки с at:
вместо byteAt:
или сравнить со значением пробела ascii, которое равно 32, или Character space asciiValue
или $ asciiValue
.Вот одно из возможных решений:
trimleading := [ :str |
ch := str at: 1.
ret := str copyFrom: 1 to: str size.
[ ch = Character space ]
whileTrue: [ ret := ret copyFrom: 2 to: ret size.
ch := ret at: 1 ].
ret ].
^ ('>>' , (trimleading value: ' this is a test ') , '<<')
displayNl
, как вы могли заметить, я изменил copyFrom:
на copyFrom:to:
.Это потому, что, в отличие от того, что можно подумать, copyFrom:
не копирует из позиции, переданной в конец строки, но пытается скопировать получатель из другого объекта (это поведение наследуется от Object
).
Существует множество других улучшений и упрощений вашего кода, я оставляю это вам в качестве упражнения.