簡體   English   中英

字符串或整個字符串的前n個字符; 沒有SubscriptOutOfBounds

[英]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 ].

MethodFinder來救援

我們還應該記住,對於像這樣的情況,我們在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 * #examplesArray ,其中每個示例都包含一對( 輸入參數結果 )。

有趣的是,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM