2010-06-16 7 views
7

В Smalltalk, если задана строка «OneTwoThree», я бы хотел удалить последнюю «тройную» часть, .e., In Squeak method finder: 'OneTwoThree' . 'Three' . 'OneTwo'.Элегантный способ удалить последнюю часть строки?

Лучшее, что я могу придумать это:

'OneTwoThree' allButLast: 'Three' size,

, но он не чувствует себя очень Smalltalk-иш, поскольку он использует длину подстроки, а не саму подстроки. Как бы вы его закодировали?

+0

+1 для коллекции «bon mot»! –

ответ

8
'OneTwoThree' readStream upToAll: 'Three' 
6

Я обычно использую #copyReplaceAll: с: методом, если последняя строка не повторяется в другом месте в исходной строке, конечно:

'OneTwoThree' copyReplaceAll: 'Three' with: '' 
+1

Yup, но это заменит все виды «Три». Но да, это коротко и мило. – nes1983

+0

Но для вашего случая я думаю, что ваше решение по-прежнему остается лучшим. –

1

Если вам нужно все после того, как только последнее совпадение удалено:

| оригинальный cutOut последнийEnd текущийEnd модифицировано |

оригинал: = 'OneTwoThree'.
cutOut: = 'Three'.
lastEnd: = 0.
[текущийEnd: = lastEnd.
lastEnd: = оригинальный указательOf: cutOut стартAt: последнийEnd +1.
lastEnd = 0 ] whileFalse.

модифицирована: = currentStart> 0 ifTrue: [оригинал первая: currentEnd] ifFalse: [оригинал]

+0

Mmmm этот код не очень объектно ориентированный. Описанные выше варианты намного лучше, потому что они фактически повторно используют предоставленный код. В smalltalk этот вид процедурного кода считается грехом. –

+0

Ну, ни один из двух методов выше не делает то, что он просил, от того, как я это интерпретировал; удалите последнюю часть строки, начиная с последнего вхождения другой строки. readStream upToAll: возвращает строку со всем после первого появления «тройки». copyReplaceAll: возвращает строку со всеми вхождениями «Три», и ничего больше. Так что, пока они повторно используют то, что другие создали удобные методы, на самом деле это не помогает, если это не то, что он пытается сделать :) – Rydier

+0

BTW; если вы считаете такой код «грехом», попробуйте взглянуть на фактические реализации copyReplaceAll: с: и upToAll:;) – Rydier

2

В проекте Муз, там должен быть способ #removeSuffix:, который удаляет данный суффикс, если настоящее время.

Смежные вопросы