【问题标题】:Why this block is not trimming string为什么这个块没有修剪字符串
【发布时间】:2019-10-01 00:20:14
【问题描述】:

我正在尝试使用以下块从发送的字符串中修剪前导空格:

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: 工作。

问题出在哪里,如何解决?谢谢。

【问题讨论】:

    标签: string trim smalltalk gnu-smalltalk


    【解决方案1】:

    问题是您将第一个元素作为一个字节(不是字符而是数字)与具有一个空格字符的字符串进行比较。在 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)。

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

    【讨论】:

    • 您能否就其他可能的改进提供一些提示?
    • 好的! 1)您在每次迭代时都复制字符串,这是低效的。您最好找到第一个非空格字符的索引。 2) 您可以使用 isSeparator 来处理制表符和 cr。 3) 您可以通过使用 String 继承的某些功能来避免手动循环,例如 #findFirst:,它在 gst 中返回匹配的第一个元素的索引,如果不存在则返回 0。最后你可能会有这样的东西:[:str | start := str findFirst: [:ch | ch isSeparator not]. start = 0 ifTrue: [''] ifFalse: [str copyFrom: start to: str size]].
    • 不应该是ifTrue: [str] 而不是ifTrue: [''](在您上面的评论中)吗?
    • 如果 start 为零,则要么是所有分隔符,要么是空字符串。在第一种情况下,您仍然需要删除空格。
    • 好的。我知道了。这应该是显而易见的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2012-07-26
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多