Поддерживает ли Smalltalk локальную переменную в блоках?Если нет, то почему? - PullRequest
6 голосов
/ 14 июня 2011

Я слышал, что Smalltalk не поддерживает локальные переменные в блоках.Это правда?Если это так, почему Smalltalk не поддерживает локальные переменные?И могу ли я все еще считать его равным замыканиям ?

Ответы [ 4 ]

12 голосов
/ 14 июня 2011

Это зависит от выбранной вами платформы smalltalk. В основном у вас есть блочные локальные переменные на всех платформах smalltalk Есть ИМХО два вида реализаций. Если поддержка полного замыкания отсутствует, локальные переменные делятся с локальными переменными метода, окружающего этот блок. Для этого вам нужно знать, как обойти некоторые проблемы. Для полной поддержки закрытия существуют локальные переменные, которые работают, как и следовало ожидать.

У Squeak и Pharo раньше были местные жители, которые делятся с методом. В настоящее время существует виртуальная машина с полной поддержкой закрытия, и Pharo поддерживает ее полностью, и я думаю, что Squeak тоже. Я думаю, что драгоценный камень не имеет полной поддержки закрытия. Я не знаю о VaST и VisualWorks.

Вы всегда можете проверить это, выполнив что-то вроде следующего:

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

Здесь вы получите только

#(1 2 3 4 5)

, если есть полная поддержка закрытия и

#(5 5 5 5 5)

если | местный | поделился с методом.

3 голосов
/ 14 июня 2011

Вы имеете в виду локальную переменную блока, например today в этом примере:

10 timesRepeat: 
  [| today | 
  today := Date today. 
  Transcript cr; show: today printString]
0 голосов
/ 14 июня 2011

Да, VA Smalltalk поддерживает их.

0 голосов
/ 14 июня 2011

да?Где ты это слышал?попробуйте этот код:

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

block value.

он должен вывести 10.

...