在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)
我们还应该记住,对于像这样的情况,我们有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:.
字符串>>截断到:
'abcdef' truncateTo: 30. "'abcdef'"
'abcdef' truncateTo: 3. "'abc'"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
107 次 |
| 最近记录: |