2010-06-16 7 views
7

En Smalltalk, si se le da la cadena 'OneTwoThree', me gustaría eliminar la última 'Tres' parte, es decir, en la notación del buscador de métodos Squeak: 'OneTwoThree' . 'Three' . 'OneTwo'.¿Manera elegante de quitar la última parte de una cuerda?

Lo mejor que puedo llegar a decir:

'OneTwoThree' allButLast: 'Three' size,

pero no se siente muy Smalltalk-ish, ya que utiliza la longitud subcadena, en lugar del propio subcadena. ¿Cómo lo codificarías?

+0

+1 para la colección "bon mot"! –

Respuesta

8
'OneTwoThree' readStream upToAll: 'Three' 
6

lo general el uso #copyReplaceAll: con: método, si la última cadena no se repite en otras partes de la cadena original, por supuesto:

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

Sí, pero eso reemplazará TODAS las apariencias de 'Tres'. Pero sí, es corto y dulce. – nes1983

+0

Pero solo para su caso, creo que su solución sigue siendo la mejor. –

1

Si necesita todo lo que después sólo la última ocurrencia retira:

| original cutOut lastEnd currentEnd modified |

original: = 'OneTwoThree'.
cutOut: = 'Tres'.
lastEnd: = 0.
[currentEnd: = lastEnd.
lastEnd: = original indexOf: cutOut startingAt: lastEnd +1.
lastEnd = 0 ] whileFalse.

modificado: = currentStart> 0 ifTrue: [Original primero: currentEnd] ifFalse: [copia original]

+0

Mmmm este código no está muy orientado a objetos. Las opciones descritas anteriormente son mucho mejores porque realmente reutilizan el código provisto. En smalltalk este tipo de código de procedimiento se considera como un pecado. –

+0

Bueno, ninguno de los dos métodos anteriores hace lo que él pidió, por cómo lo interpreté; eliminar la última parte de una cadena, comenzando en la última aparición de otra cadena. readStream upToAll: devuelve una cadena con todo después de la primera aparición de 'Tres' eliminada. copyReplaceAll: devuelve la cadena con todas las apariciones de 'Tres' eliminadas, y nada más. Así que mientras reutilizan para lo que otros han creado métodos de conveniencia, eso en realidad no ayuda si no es lo que está tratando de hacer :) – Rydier

+0

BTW; si considera que ese tipo de código es un "pecado", intente ver las implementaciones reales de copyReplaceAll: with: y upToAll:;) – Rydier

2

En el proyecto Moose, no debería ser un método #removeSuffix: que elimina un sufijo dado, si presente.

Cuestiones relacionadas