Squeak(smalltalk)subSrings忽略字符串末尾的空字符串

问题描述 投票:3回答:2

我正在尝试在字符串末尾标识换行符使用subStrings。

问题:

check := 's
' subStrings: Character cr asString.

Transcript show: check size ; cr.
"prints: 1"
Transcript show: check ; cr.
"prints: #('s')"

我会期望有2个字符串,因为我的检查字符串包含一个cr字符,而subStrings返回#('s')]

当换行符出现在检查字符串中时

check := 's
'.
Transcript show: check size ; cr.
"prints: 2"
substring newline smalltalk squeak
2个回答
3
投票

[该方法按其工作方式工作,并且我认为它与它的名称一致,因为String的最后一个字符之后没有任何内容。

[在Pharo和Smalltalk的其他方言中,您具有方法'split:',该方法可以满足您的情况:

Character cr split: 's
'

将以#('s' '')回答

您可能希望在以下行中将#split:的(非常)简化版本添加到Squeak中>]

Character >> split: aString
    | strings |
    aString isEmpty ifTrue: [^Array new].
    strings := aString subStrings: self asString.
    aString last = self ifTrue: [strings := strings copyWith: ''].
    ^strings

请注意,我已经分别处理了空字符,以便能够检查aString的最后一个字符。


附录

在@ aka.nice的回答之后,很明显#split:的更好版本只是简化为

Character >> split: aString
    ^aString splitBy: self asString

此外,相同的想法可用于在其他类中实现#split:


2
投票

在吱吱声中有splitBy:。在SequenceableCollection中定义。尽管subStringsfindTokens:会搜索一组定界符中的任何一个,但splitBy:会将定界符视为要匹配的整个序列。同样,这样的定界符序列总是拆分左右子集合,可能为空。

© www.soinside.com 2019 - 2024. All rights reserved.