Frage Unterstützt Smalltalk lokale Variable in Blöcken? Wenn nicht, warum?


Ich habe gehört, dass Smalltalk lokale Variable in Blöcken nicht unterstützt. Ist das wahr? Wenn dies der Fall ist, warum unterstützt Smalltalk lokale Variablen nicht? Und kann ich immer noch damit gleichsetzen Verschlüsse?


5
2018-06-14 08:38


Ursprung


Antworten:


Es hängt von der Smalltalk-Plattform ab, die Sie wählen. Grundsätzlich haben Sie lokale Variablen auf allen Smalltalk-Plattformen blockiert. Es gibt IMHO zwei Arten von Implementierungen. Wenn es keine vollständige Closure-Unterstützung gibt, werden die lokalen Variablen mit den lokalen Variablen der Methode geteilt, die diesen Block umgibt. Dafür müssen Sie wissen, wie Sie einige Probleme lösen können. Für die vollständige Schließung Unterstützung lokale Variablen sind da und funktionieren wie Sie vielleicht erwarten.

Squeak und Pharo pflegten Einheimische zu haben, die mit der Methode geteilt wurden. Heutzutage gibt es eine VM mit Full-Closure-Unterstützung und Pharo unterstützt dies vollständig und ich denke, Squeak tut es auch. Ich denke, Edelstein hat keine vollständige Schließungsunterstützung. Ich weiß nichts über VaST und VisualWorks.

Sie können es immer testen, indem Sie Folgendes tun:

((1 to: 5) collect: [:i| 
    [ | local | local := i ]])
        collect: [:each| each value]

Hier bekommst du nur

#(1 2 3 4 5)

wenn es eine vollständige Schließungsunterstützung gibt und

#(5 5 5 5 5)

wenn die | lokal | wird mit der Methode geteilt.


11
2018-06-14 08:55



Meinst du eine Block lokale Variable, wie today in diesem Beispiel:

10 timesRepeat: 
  [| today | 
  today := Date today. 
  Transcript cr; show: today printString]

3
2018-06-14 09:10



nicht wahr? wo hast du das gehört? probiere diesen Code aus:

block := [
  x := 10.
  x printNl.
].

block value.

es sollte 10 ausgeben.


0
2018-06-14 08:54



Ja, VA Smalltalk unterstützt sie.


0
2018-06-14 16:20