Smalltalk是否支持块中的局部变量?如果没有,为什么?

时间:2011-06-14 08:38:26

标签: closures smalltalk block

我听说Smalltalk不支持块中的局部变量。这是真的?如果是,为什么Smalltalk不支持局部变量?我还能认为它与闭包相同吗?

4 个答案:

答案 0 :(得分:12)

这取决于您选择的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)

如果|当地的|与方法共享。

答案 1 :(得分:3)

你的意思是一个块局部变量,比如本例中的today

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

答案 2 :(得分:0)

是吗?你是从哪里听来的?试试这段代码:

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

block value.

它应输出10。

答案 3 :(得分:0)

是的,VA Smalltalk支持他们。