字符串或整个字符串的前n个字符; 没有SubscriptOutOfBounds

myd*_*rms 5 smalltalk pharo

在Pharo 7中,我试图获取字符串的第一个字符数,或者只是整个字符串(如果请求的字符数超过字符串的长度).

但是,以下示例导致错误,而我只是希望它返回整个字符串:

    'abcdef' copyFrom: 1 to: 30. "=> SubscriptOutOfBounds Error"
    'abcdef' first: 30. "=> SubscriptOutOfBounds Error"
    'abcdef' first: 3. "=> 'abc'; OK"
Run Code Online (Sandbox Code Playgroud)

如果请求的长度超过字符串长度,是否有一个方法只返回整个字符串?

作为一种解决方法,我做了以下操作,首先检查字符串的长度,只有first:在长度超过最大长度时发送,但它不是很优雅:

label := aTaskbarItemMorph label size < 30 ifTrue: [ aTaskbarItemMorph label ] ifFalse: [ aTaskbarItemMorph label first: 30 ].
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 5

MethodFinder来救援

我们还应该记住,对于像这样的情况,我们有MethodFinderPharo.您可以通过评估您的示例来使用它.在我们的例子中

MethodFinder methodFor: #(('abcdef' 30) 'abcdef' ('abcdef' 3) 'abc')
Run Code Online (Sandbox Code Playgroud)

会产生

"'(data1 contractTo: data2) (data1 truncateTo: data2) '"
Run Code Online (Sandbox Code Playgroud)

其中包含已经提到#truncateTo:并添加的内容#contractTo:.注意,后者实现其他缩短技术的风格,即

'abcdef' contractTo: 6 "'a...f'"
Run Code Online (Sandbox Code Playgroud)

可能不是你今天想要的东西,而是一条可能在将来有用的信息.


句法

语法MethodFinder需要一个Array长度2 * #examples,其中每个示例都包含一对(输入参数,结果).

有趣的是,Squeak括号可以轻松提供动态创建的示例:

input := 'abcdef'.
n := 1.
MethodFinder methodFor: {
     {input. input size + n}. input.
     {input. input size - n}. input allButLast
}
Run Code Online (Sandbox Code Playgroud)

也会发现truncateTo:.


Pet*_*nak 4

字符串>>截断到:

'abcdef' truncateTo: 30. "'abcdef'"
'abcdef' truncateTo: 3. "'abc'"
Run Code Online (Sandbox Code Playgroud)