为什么此块不修剪字符串

时间:2019-05-14 03:14:40

标签: string trim smalltalk gnu-smalltalk

我正在尝试以下代码块来修剪发送的字符串中的前导空格:

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 个答案:

答案 0 :(得分:4)

问题在于,您正在将第一个元素(不是一个字符而是一个数字)与一个带有一个空格字符的字符串进行比较。在Smalltalk整数中,字符和字符串是不同的,因此应与相应的类型进行比较。在这种情况下,您可以使用at:而不是byteAt:来获取字符串的第一个字符,或者将其与空间的ascii值进行比较,该值是32,或者是Character space asciiValue或{{1} }。这是一种可能的解决方案:

$  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继承的) )。

您的代码还有很多其他可能的改进和简化,我将其留给您作为练习。