Es ist unmöglich, eine Karte in einen Senkenkontext zu stellen

8

Ich versuche herauszufinden, wie man eine Karte in einen Sink-Kontext wirft. In diesem Code

class Sunk {
    has $.titanic;
    method sink {
        say "Sinking $!titanic";
    }
}

Sunk.new( :titanic($_) ) for 1..3;

(1..3).map: { Sunk.new( :titanic($_) ) };

Die forSchleife versenkt effektiv alle erstellten, die mapnicht. Irgendeine Idee warum?

Dieser Test in Braten: https://github.com/perl6/roast/blob/b9bfe1844db25f65a4aeb351a0107f83689cb5c2/S04-statements/sink.t#L27-L32 soll als Test dafür dienen. Und die Karte befindet sich effektiv in einem Senkenkontext, aber ich sehe nicht, wie sie "als versunken ausgeführt" wird. Es läuft einfach.

jjmerelo
quelle

Antworten:

6

In Ihrem Beispiel das mapliefert eine Seqmit SunkObjekten darin. Das Ganze Seqist versenkt, was effektiv aufruft Seq.iterator.sink-all, was nicht alle seine Elemente versenkt : Es zieht nur das SeqLeere durch Aufrufen, pull-onebis IterationEndes zurückgegeben wird.

Elizabeth Mattijsen
quelle
5

Ich werde nicht viel erklären, während ich gehe, und den Großteil davon bis zum Ende belassen.

Ich versuche herauszufinden, wie man eine Karte in einen Sink-Kontext wirft.

Das Hinzufügen --> Nilals Rückgabewert des Blocks bewirkt Folgendes:

(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }

Die forSchleife versenkt effektiv alle erstellten, die mapnicht.

Standardmäßig werden Blöcke ausgeführt mit:

  • Alle Aussagen bis auf die letzte im Senkenkontext.

  • Die letzte Aussage nicht im Senkenkontext. (Die letzte Anweisung ist der Rückgabewert des Blocks, daher wird angenommen, dass es unangemessen ist, ihn in die Spüle zu werfen.)

Ihr Code hat diese Standardeinstellung für Ihren mapAufruf nicht geändert , sodass sich die letzte Anweisung des Blocks - seine einzige Anweisung - nicht im Senkenkontext befand. (Durch Hinzufügen --> Nilzur Signatur des Blocks wird die letzte Anweisung wieder in den Senkenkontext versetzt.)

Ausnahmen von diesem Standardschema betreffen eine Art Anweisungsschlüsselwort. forist eine davon - es setzt seine Anweisung oder die letzte Anweisung in seinem Block in den Senkenkontext. (Um dies rückgängig zu machen, damit die letzte Anweisung nicht im Senkenkontext steht, können Sie so etwas schreiben $ = do for ....)

Dieser Test in Braten soll als Test dafür dienen. Und mapist effektiv in einem Sink-Kontext, aber ich sehe nicht, wie es "als versunken laufen". Es läuft einfach.

Das entsprechende Ticket und der Test verwirren mich . Tut mir leid, ich kann hier nicht helfen.


Ich habe stundenlang nachgeforscht, um diese Antwort vorzubereiten. Einige der Stücke, die ich gefunden und auf die ich mich verlassen habe, folgen zusammen mit kurzen Notizen von mir.

Viele der folgenden Links führen zu bestimmten Zeilen von IRC-Protokollen. Meine Absicht für die meisten davon ist, dass Sie ein wenig des Dialogs lesen, der jeder Zeile folgt, um das zu maximieren, was Sie daraus erhalten (auch wenn es Verwirrung ist, weil ich denke, dass selbst das hilfreich sein könnte, wie ich als nächstes erkläre).

Bitte lesen Sie mindestens die folgenden Zusammenfassungen und klicken Sie auf einige der Links. Veröffentlichen Sie dann Kommentare unter dieser Antwort, um hier weitere Diskussionen anzuregen und zu prüfen, ob wir uns in Richtung Klarheit bewegen können.

Raiph
quelle
Vielen Dank für die Antwort, aber in Ihrem Beispiel wird jedes von der Karte zurückgegebene Element in einen Senkenkontext geworfen, nicht die Karte selbst. Ich denke, die Antwort von @ elizabeth-mattijsen trifft es.
jjmerelo