在菲罗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 ].
字符串>>截断:
'abcdef' truncateTo: 30. "'abcdef'"
'abcdef' truncateTo: 3. "'abc'"
我们还应该记住,对于像这样的情况下,我们在菲罗的MethodFinder
。通过评估你的例子使用它。在我们的例子
MethodFinder methodFor: #(('abcdef' 30) 'abcdef' ('abcdef' 3) 'abc')
会产生
"'(data1 contractTo: data2) (data1 truncateTo: data2) '"
其中包含已经提到#truncateTo:
,并增加了#contractTo:
。需要注意的是,后者实现了缩短技术的其他味道,即
'abcdef' contractTo: 6 "'a...f'"
可能不是你想要的今天,但什么是一条信息可能被证明在未来有用。
MethodFinder
的语法要求长度Array
,其中每一个实施例由一对的2 * #examples
(输入参数,结果)。
有趣的是,佳乐括号可以很容易地提供动态创建的例子:
input := 'abcdef'.
n := 1.
MethodFinder methodFor: {
{input. input size + n}. input.
{input. input size - n}. input allButLast
}
也可以找到truncateTo:
。
我看不出在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或者其他组合也将定义这样的扩展方法添加。
下面是一个简单的表达,将带给你想要的东西:
aString readStream next: n