2016-04-16 2 views
3

Keinerlei Smalltalk Dialekt etwas auf den Linien vonGibt es eine Methode zum Aufzählen eines Objekts und dann einer Sammlung?

implementieren
Object >> #andThen: aCollection do: aBlock 
    self value: aBlock. 
    aCollection do: aBlock 

Der Grund, warum ich gefragt habe, ist, weil dieses Muster hier und da erscheint, und ich verbringe immer Zeit nachzudenken, ob eine neue Sammlung zu erstellen und dann #do: oder ob der Code aus Gründen der Effizienz in den Client eingebunden werden soll.

UPDATE

Hier ist ein Beispiel für eine Situation, in der das Element nicht in der Sammlung ist.

Sie haben eine Liste von Strings und einen Titel:

FOOD 
nuts 
apples 
seeds 
beans 
tomatoes 
algae 
mushrooms 
sprouts 

und Sie versuchen, etwas mit ihnen zu tun. Nehmen wir an, Sie möchten die maximale Breite berechnen oder sie alle auf dem Bildschirm anzeigen lassen.

Der Titel gehört nicht in die Sammlung, aber für einige der Operationen, die wir damit machen wollen, müssen wir Betrachte sowohl den Titel als auch die Gegenstände.

+0

ich neugierig sein würde zu wissen, warum das Objekt nicht Teil der Sammlung ist, da es offensichtlich ein Muss ähnlicher Typ und muss dieselbe Aktion verarbeiten. –

+0

@MaxLeske danke für den Kommentar. Ich habe ein Beispiel hinzugefügt. –

+0

Danke, das macht Sinn. –

Antwort

2

Was ist damit?

{ self }, aCollection do: aBlock 

Sie könnten auch machen dies noch deutlicher:

(aCollection copyWithFirst: self) do: aBlock 
+0

Abhängig von der Art der Sammlung, die Sie verwenden (zB growbare Sammlungen wie 'OrderedCollection', könnten Sie auch' 'aCollection addFirst: self) tun: aBlock'. Der Unterschied besteht natürlich darin, dass Sie keine Kopie des Die Antwort von Tobias ist jedoch generischer: –

+1

@ MaxLeske & Tobias In beiden Fällen (sagen wir 'Array' und' OrderedCollection') muss der Code etwas anderes tun, als nur 'aBlock' mit dem Element zu evaluieren wo der Mathematiker das Wasser abkühlt und dann die vorhergehende Prozedur anwendet –

+0

Beachten Sie, dass '#copyWithFirst:' den Nebeneffekt hat, die Sammlung zu modifizieren, was in vielen Fällen schlecht sein könnte –

0

Was ist, wenn Nahrung der Schlüssel für einen Wörterbucheintrag mit der zugehörigen Sammlung war?

+0

Ich fürchte, das würde das Problem nicht lösen, da Sie immer noch "aBlock" mit dem Schlüssel und dann mit der zugehörigen Sammlung auswerten müssten, die genau das Muster repliziert, das ich in einer Methode erfassen möchte. –

0

Es tut jetzt - danke. Mit einer leichten Veränderung - zu einer symmetrischen Implementierung

>>andThen: anotherObject do: a1block 
    self do: a1block. 
    ^anotherObject do: aCollection 
1

Die ursprüngliche Frage stellt, „ist dies eine gute Idee?“
und gibt einen Code.

Ja, es ist eine gute Idee, aber hat einen Tippfehler.
weil die zweite Zeile davon rückwärts geschrieben wird.

Hier ist eine korrigierte Version.
(Korrektur nur den Tippfehler in der ursprünglichen Frage).

>>andThen: aCollection do: ablock 
    ablock value: self. 
    ^aCollection do: ablock 


Next:

Meine frühere Antwort hatte auch einen Tippfehler.
Und brauchte einen besseren Kommentar.

Also hier ist eine korrigierte Version von diesem (die Antwort von 9/11/16).

" 
This version also works for 
    any combination of parameters, 
    and in any order. 
" 
>>andThen: anotherObject do: a1block 
    self do: a1block. 
    ^anotherObject do: a1block 

Hinweis: Die oben auf einer anderen Definition abhängt,
, die in Ihrem Bild nicht vorhanden sein können.

Objekt müßte auch #do :, wie folgt definieren ...

Object>>do: a1block 
    ^a1block value: self 
+0

Ha! Du hast recht. 'self value: aBlock' ergibt keinen Sinn. Ich hätte statt dessen "aBlock value: self" schreiben sollen. Guter Fang. Vielen Dank! –

Verwandte Themen