为什么这个块不修剪字符串
Why this block is not trimming string
我正在尝试从发送的字符串中跟随 trim 前导空格:
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.
它可以正常工作,但不会从发送的字符串中删除前导空格。 return 值与发送的字符串相同。
显然,第一个字符 ch
没有被拾取。 at:
也无法代替 byteAt:
。
问题出在哪里,如何解决?谢谢
问题是您将作为字节的第一个元素(不是字符而是数字)与具有一个 Space 字符的字符串进行比较。在 Smalltalk 中整数、字符和字符串是不同的,所以你应该比较相应的类型。在这种情况下,您可以使用 at:
而不是 byteAt:
获取字符串的第一个字符,或者与 space 的 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
).
您的代码还有很多其他可能的改进和简化,我将其留给您作为练习。
我正在尝试从发送的字符串中跟随 trim 前导空格:
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.
它可以正常工作,但不会从发送的字符串中删除前导空格。 return 值与发送的字符串相同。
显然,第一个字符 ch
没有被拾取。 at:
也无法代替 byteAt:
。
问题出在哪里,如何解决?谢谢
问题是您将作为字节的第一个元素(不是字符而是数字)与具有一个 Space 字符的字符串进行比较。在 Smalltalk 中整数、字符和字符串是不同的,所以你应该比较相应的类型。在这种情况下,您可以使用 at:
而不是 byteAt:
获取字符串的第一个字符,或者与 space 的 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
).
您的代码还有很多其他可能的改进和简化,我将其留给您作为练习。