[英]First n characters of string or whole string; without SubscriptOutOfBounds
在Pharo 7中,我試圖獲取字符串的第一個字符數,或者只是整個字符串(如果請求的字符數超過字符串的長度)。
但是,以下示例導致錯誤,而我只是希望它返回整個字符串:
'abcdef' copyFrom: 1 to: 30. "=> SubscriptOutOfBounds Error"
'abcdef' first: 30. "=> SubscriptOutOfBounds Error"
'abcdef' first: 3. "=> 'abc'; OK"
如果請求的長度超過字符串長度,是否有一個方法只返回整個字符串?
作為一種解決方法,我做了以下操作,首先檢查字符串的長度,然后first:
發送first:
如果長度超過最大長度,但它不是很優雅:
label := aTaskbarItemMorph label size < 30 ifTrue: [ aTaskbarItemMorph label ] ifFalse: [ aTaskbarItemMorph label first: 30 ].
我們還應該記住,對於像這樣的情況,我們在Pharo中有MethodFinder
。 您可以通過評估您的示例來使用它。 在我們的例子中
MethodFinder methodFor: #(('abcdef' 30) 'abcdef' ('abcdef' 3) 'abc')
會產生
"'(data1 contractTo: data2) (data1 truncateTo: data2) '"
其中包含已經提到的#truncateTo:
並添加#contractTo:
. 注意,后者實現其他縮短技術的風格,即
'abcdef' contractTo: 6 "'a...f'"
可能不是你今天想要的東西,而是一條可能在將來有用的信息。
MethodFinder
的語法需要一個長度為2 * #examples
的Array
,其中每個示例都包含一對( 輸入參數 , 結果 )。
有趣的是,Squeak括號可以輕松提供動態創建的示例:
input := 'abcdef'.
n := 1.
MethodFinder methodFor: {
{input. input size + n}. input.
{input. input size - n}. input allButLast
}
也會發現truncateTo:
.
字符串>> truncateTo:
'abcdef' truncateTo: 30. "'abcdef'"
'abcdef' truncateTo: 3. "'abc'"
我沒有在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.