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

问题描述 投票:5回答:4

在菲罗7,我试图得到一个字符串,或者只是整个字符串的字符的第一个号码(如果字符的请求数超过了字符串的长度)。

但是,下面的例子将导致一个错误,而我只是希望它返回整个字符串:

    'abcdef' copyFrom: 1 to: 30. "=> SubscriptOutOfBounds Error"
    'abcdef' first: 30. "=> SubscriptOutOfBounds Error"
    'abcdef' first: 3. "=> 'abc'; OK"

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

作为一种变通方法,我做了如下,首先要检查的字符串的长度,如果长度超过最大长度只发送first:,但它不是很优雅:

label := aTaskbarItemMorph label size < 30 ifTrue: [ aTaskbarItemMorph label ] ifFalse: [ aTaskbarItemMorph label first: 30 ].
smalltalk pharo
4个回答
4
投票

字符串>>截断:

'abcdef' truncateTo: 30. "'abcdef'"
'abcdef' truncateTo: 3. "'abc'"

5
投票

MethodFinder to the rescue

我们还应该记住,对于像这样的情况下,我们在菲罗的MethodFinder。通过评估你的例子使用它。在我们的例子

MethodFinder methodFor: #(('abcdef' 30) 'abcdef' ('abcdef' 3) 'abc')

会产生

"'(data1 contractTo: data2) (data1 truncateTo: data2) '"

其中包含已经提到#truncateTo:,并增加了#contractTo:。需要注意的是,后者实现了缩短技术的其他味道,即

'abcdef' contractTo: 6 "'a...f'"

可能不是你想要的今天,但什么是一条信息可能被证明在未来有用。


Syntax

MethodFinder的语法要求长度Array,其中每一个实施例由一对的2 * #examples(输入参数,结果)。

有趣的是,佳乐括号可以很容易地提供动态创建的例子:

input := 'abcdef'.
n := 1.
MethodFinder methodFor: {
     {input. input size + n}. input.
     {input. input size - n}. input allButLast
}

也可以找到truncateTo:


2
投票

我看不出在String类或其超默认任何这样的方法。你的解决方法是一个很好的解决方案。

可替换地更短的解决方法是使用min:选择的字符串的尺寸或字符的数量有限。例如:

string := '123456'.
label := string first: (string size min: 5).

另一个解决方案是一个扩展方法添加到String类,你想要做什么。因此,该方法将被添加到String类,但摆在你的包。例如:

String>>atMost: numberOfElement
    ^ self size < numberOfElement 
        ifTrue: [ self ] 
        ifFalse: [ self first: numberOfElement ]

然后下面将工作:

string := '123456'.
string atMost: 2.  "'12'"
string atMost: 10. "'123456'"

当添加扩展方法,你可以添加一个前缀他们的名字,以避免可能的冲突。例如,如果方法atMost:将在以后的Pharo或者其他组合也将定义这样的扩展方法添加。


2
投票

下面是一个简单的表达,将带给你想要的东西:

aString readStream next: n
© www.soinside.com 2019 - 2024. All rights reserved.