我正在尝试在字符串末尾标识换行符使用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"
[该方法按其工作方式工作,并且我认为它与它的名称一致,因为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:
。
在吱吱声中有splitBy:
。在SequenceableCollection
中定义。尽管subStrings
和findTokens:
会搜索一组定界符中的任何一个,但splitBy:
会将定界符视为要匹配的整个序列。同样,这样的定界符序列总是拆分左右子集合,可能为空。