Smalltalk 删除字符串最后一部分的优雅方式?

Smalltalk 删除字符串最后一部分的优雅方式?,smalltalk,Smalltalk,在Smalltalk中,如果给定字符串'onetwother',我想删除最后的'Three'部分,例如,在Squeak method finder符号中:'onetwother'三个”一对一 我能想到的最好办法是: 'onetwotree'所有但最后一个:'Three'尺寸 但它并不是很小题大做,因为它使用的是子字符串长度,而不是子字符串本身。如何编写它?我通常使用#copyReplaceAll:with:方法,如果最后一个字符串没有在原始字符串的其他地方重复,当然: 'OneTwoThree'

在Smalltalk中,如果给定字符串'onetwother',我想删除最后的'Three'部分,例如,在Squeak method finder符号中:
'onetwother'三个”一对一

我能想到的最好办法是:

'onetwotree'所有但最后一个:'Three'尺寸

但它并不是很小题大做,因为它使用的是子字符串长度,而不是子字符串本身。如何编写它?

我通常使用#copyReplaceAll:with:方法,如果最后一个字符串没有在原始字符串的其他地方重复,当然:

'OneTwoThree' copyReplaceAll: 'Three' with: ''

如果仅在删除最后一次事件后才需要所有内容:

|原始切口lastEnd currentEnd已修改|

原件:=“一对三”。
断流器:=“三个”。
lastEnd:=0。
[当前结束:=最后结束。
lastEnd:=原始索引of:cutOut起始点:lastEnd+1。
lastEnd=0 ]同时也是

修改:=currentStart>0如果确实:[原始第一个:currentEnd]
如果[original copy]

在Moose项目中,应该有一个方法
#removeSuffix:
删除给定的后缀(如果存在)

是的,但这将取代“三”的所有外观。但是,是的,它很简短,很贴心。但就你的情况而言,我认为你的解决方案仍然是最好的。嗯,这段代码不是很面向对象的。上面描述的选项要好得多,因为它们实际上重用了提供的代码。在smalltalk中,这种程序代码被认为是一种罪恶。好吧,从我对它的解释来看,上面两种方法都没有达到他的要求;删除字符串的最后一部分,从另一个字符串的最后一个匹配项开始。readStream Uptall:返回一个字符串,其中删除了第一次出现的“三”之后的所有内容。copyReplaceAll:返回字符串,其中删除了所有出现的“三”项,而不返回其他内容。因此,尽管他们重复使用其他人创建的方便方法,但如果这不是他想要做的,那实际上没有帮助:)顺便说一句;如果您认为这类代码是“罪恶”,请尝试查看CopyRePaTALALL的实际实现:你说得对,莱迪尔。似乎还没有一个聪明的方便方法来解决所有问题。如果Stream有upToLastAll:,就可以了。
'OneTwoThree' readStream upToAll: 'Three'