2010-06-16 13 views
7

स्मॉलटॉक में, यदि स्ट्रिंग 'वनटवो थ्री' दिया गया है, तो मैं अंतिम 'तीन' भाग को हटा देना चाहता हूं, .e, स्क्वाक विधि खोजक नोटेशन में: 'OneTwoThree' . 'Three' . 'OneTwo'एक स्ट्रिंग के अंतिम भाग को हटाने के लिए सुरुचिपूर्ण तरीका?

सबसे अच्छा मैं के साथ आ सकता है:

'OneTwoThree' allButLast: 'Three' size,

लेकिन यह बहुत स्मालटाक-ish महसूस नहीं करता है, क्योंकि यह सबस्ट्रिंग लंबाई का उपयोग करता है, बल्कि सबस्ट्रिंग से भी। आप इसे कैसे कोड करेंगे? , विधि यदि अंतिम स्ट्रिंग निश्चित रूप से मूल स्ट्रिंग में कहीं और दोहराया नहीं है:

+0

"bon mot" संग्रह के लिए +1! –

उत्तर

8
'OneTwoThree' readStream upToAll: 'Three' 
6

मैं आमतौर पर #copyReplaceAll का उपयोग करें: के साथ

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

यूप, लेकिन यह 'तीन' की सभी उपस्थितियों को प्रतिस्थापित करेगा। लेकिन हाँ, यह छोटा और प्यारा है। – nes1983

+0

लेकिन सिर्फ आपके मामले के लिए मुझे लगता है कि आपका समाधान अभी भी सबसे अच्छा है। –

1

तुम सब कुछ की जरूरत है के बाद ही पिछले घटना हटाया:

| मूल कटऑट अंतिम अंत वर्तमान और संशोधित |

मूल: = 'वनटू थ्री'।
कटऑट: = 'तीन'।
अंतिम अंत: = 0.
[वर्तमान अंत: = अंतिम अंत।
अंतिम अंत: = मूल अनुक्रमणिका अगर: कटऑट प्रारंभ करें: अंतिम अंत +1।
lastEnd = 0 ] जबकि गलत।

संशोधित: = currentStart> 0 ifTrue: [मूल पहले: currentEnd] ifFalse: [मूल प्रति]

+0

एमएमएमएम यह कोड बहुत ऑब्जेक्ट उन्मुख नहीं है। ऊपर वर्णित विकल्प बहुत बेहतर हैं क्योंकि वे वास्तव में प्रदान किए गए कोड का पुन: उपयोग करते हैं। स्मॉलटाक में इस तरह के प्रक्रियात्मक कोड को पाप के रूप में माना जाता है। –

+0

ठीक है, ऊपर दिए गए दो तरीकों में से कोई भी उसने जो कुछ भी नहीं पूछा, उससे मैंने क्या किया; किसी अन्य स्ट्रिंग की अंतिम घटना से शुरू होने पर स्ट्रिंग के अंतिम भाग को हटा दें। readStream upToAll: 'तीन' की पहली घटना के बाद सब कुछ के साथ एक स्ट्रिंग देता है। copyReplaceAll: 'तीन' हटाए गए सभी अवसरों के साथ स्ट्रिंग देता है, और कुछ और नहीं। तो जब वे दूसरों ने सुविधा विधियों के लिए उपयोग किया है, तब वे पुन: उपयोग करते हैं, जो वास्तव में मदद नहीं करता है अगर वह ऐसा करने की कोशिश नहीं कर रहा है :) – Rydier

+0

बीटीडब्ल्यू; यदि आप उस तरह के कोड को "पाप" मानते हैं, तो copyReplaceAll के वास्तविक कार्यान्वयन को देखने का प्रयास करें: साथ: और ऊपर तक:;) – Rydier

2

मूस परियोजना में, वहाँ एक विधि #removeSuffix: कि किसी दिए गए प्रत्यय निकाल देता है, अगर होना चाहिए वर्तमान।

संबंधित मुद्दे