2010-06-16 5 views
7

Smalltalk에서 문자열 'OneTwoThree'가 주어지면 마지막 'Three'부분을 제거하고 싶습니다 .e., 스퀵 메소드 파인더 표기법 : 'OneTwoThree' . 'Three' . 'OneTwo'.우아한 방법은 문자열의 마지막 부분을 제거 하시겠습니까?

'OneTwoThree' allButLast: 'Three' size,

하지만 오히려 문자열 자체보다, 문자열 길이를 사용하기 때문에 그것은 매우 스몰 토크 틱 생각하지 않습니다

내가 가지고 올 수있는 최선이다. 어떻게 코딩 하시겠습니까?

+0

"봉 mot"컬렉션 +1! –

답변

8
'OneTwoThree' readStream upToAll: 'Three' 
6

나는 보통 #copyReplaceAll를 사용하여 : 방법, 마지막 캐릭터는 물론 원래 문자열의 다른 곳에서 반복되어 있지 않은 경우 :

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

그래,하지만 그게 'Three'의 모든 모습을 대신 할거야. 그러나 그렇습니다, 그것은 짧고 달콤합니다. – nes1983

+0

하지만 귀하의 경우에는 솔루션이 여전히 최고라고 생각합니다. –

1

마지막 선두로부터 제거한 후 모든 것을해야하는 경우 :

원본 cutOut lastEnd currentEnd가 수정되었습니다.

원본 : 'OneTwoThree'.
cutOut : = '3'.
lastEnd : = 0
[currentEnd : = lastEnd.
lastEnd : = 원본 indexOf : cutOut startingAt : lastEnd +1.
lastEnd = 0 ] whileFalse.

변성 = currentStart> 0 ifTrue : 원래 제 : currentEnd] ifFalse : 무스 프로젝트에서 [원본]

+0

음,이 코드는 객체 지향적이지 않습니다. 위에서 설명한 옵션은 제공된 코드를 실제로 다시 사용하기 때문에 훨씬 좋습니다. 스몰 토크에서 이러한 종류의 절차 코드는 죄악으로 간주됩니다. –

+0

글쎄요, 위의 두 가지 방법 중 어느 것도 그가 내가 어떻게 해석했는지 묻지 않았습니다. 다른 문자열의 마지막 항목에서 시작하여 문자열의 마지막 부분을 제거합니다. readStream upToAll : 'Three'가 처음 나타난 후 모든 항목이있는 문자열을 반환합니다. copyReplaceAll : 'Three'가 모두 제거 된 문자열을 반환하고 그 외에는 아무것도 반환하지 않습니다. 다른 사람들이 편리한 방법을 만든 것을 재사용하는 동안, 그가하려고하는 것이 아니라면 실제로 도움이되지 않습니다. – Rydier

+0

BTW; 이러한 종류의 코드를 "죄"라고 생각한다면 copyReplaceAll의 실제 구현을 살펴보십시오. : with : 및 upToAll :;) – Rydier

2

, 만약 주어진 접미사를 제거하는 방법 #removeSuffix:이 있어야 선물.

관련 문제