Почему этот блок не обрезает строку - PullRequest
2 голосов
/ 14 мая 2019

Я пытаюсь следующий блок, чтобы обрезать начальные пробелы из отправленной строки:

trimleading := [ :str|
    ch := (str byteAt: 1).          "get first character: ERROR HERE"
    ret := str copyFrom: 1.         "make a copy of sent string"
    [ch = ' '] whileTrue: [         "while first char is space"
        ret := (ret copyFrom: 2).   "copy from 2nd char"
        ch := ret byteAt: 1.        "again test first char"
        ].
    ret                             "value is modified string"
].

('>>',(trimleading value: '    this is a test  '),'<<') displayNl.

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

По-видимому, первый символ ch не подобран.at: также не работает вместо byteAt:.

Где проблема и как ее можно решить?Спасибо.

1 Ответ

4 голосов
/ 14 мая 2019

Проблема в том, что вы сравниваете первый элемент как байт, который является не символом, а числом, со строкой с одним символом пробела.В 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).

Существует множество других улучшений и упрощений вашего кода, я оставляю это вам в качестве упражнения.

...