2010-06-16 5 views
7

Dans Smalltalk, si la chaîne 'OneTwoThree' est donnée, je voudrais supprimer la dernière partie 'Three', .e., Dans la notation finder de méthode Squeak: 'OneTwoThree' . 'Three' . 'OneTwo'.Élégante façon d'enlever la dernière partie d'une chaîne?

Le meilleur que je peux trouver est:

'OneTwoThree' allButLast: 'Three' size,

mais il ne se sent pas très Smalltalk-ish, car il utilise la longueur de chaîne, plutôt que la sous-chaîne elle-même. Comment le codez-vous?

+0

+1 pour «bon mot» collection! –

Répondre

8
'OneTwoThree' readStream upToAll: 'Three' 
6

J'utilise habituellement #copyReplaceAll: avec: méthode, si la dernière chaîne ne se répète pas ailleurs dans la chaîne d'origine bien sûr:

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

Oui, mais cela remplacera TOUTES les apparences de 'Trois'. Mais oui, c'est court et doux. – nes1983

+0

Mais juste pour votre cas, je pense que votre solution est toujours la meilleure. –

1

Si vous avez besoin tout après seulement la dernière occurence enlevée:

| original cutOut lastEnd récentet modifié |

original: = 'OneTwoThree'.
cutOut: = 'Trois'.
lastEnd: = 0.
[currentEnd: = lastEnd.
lastEnd: = index d'origineDepuis: cutOut startingAt: lastEnd +1.
lastEnd = 0 ] whileFalse.

modifié: = currentStart> 0 ifTrue: [original d'abord: currentEnd] ifFalse: [copie originale]

+0

Mmmm ce code n'est pas très orienté objet. Les options décrites ci-dessus sont bien meilleures car elles réutilisent le code fourni. Dans smalltalk, ce type de code de procédure est considéré comme un péché. –

+0

Eh bien, aucune des deux méthodes ci-dessus fait ce qu'il a demandé, de la façon dont je l'ai interprété; supprime la dernière partie d'une chaîne, en commençant à la dernière occurrence d'une autre chaîne. ReadStream upToAll: renvoie une chaîne avec tout après la suppression de la première occurrence de 'Three'. copyReplaceAll: renvoie la chaîne avec toutes les occurrences de 'Three' supprimées, et rien d'autre. Donc, alors qu'ils réutilisent ce que d'autres ont créé des méthodes de commodité, cela n'aide pas réellement si ce n'est pas ce qu'il essaie de faire :) – Rydier

+0

BTW; Si vous considérez ce type de code comme un "péché", essayez de regarder les implémentations réelles de copyReplaceAll: avec: et upToAll:;) – Rydier

2

Dans le projet Moose, il devrait y avoir une méthode #removeSuffix: qui supprime un suffixe donné, si présent.

Questions connexes