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

Eon*_*nil 6 closures smalltalk block

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

Nor*_*rtl 12

这取决于您选择的smalltalk平台.基本上你在所有smalltalk平台上都有阻塞局部变量.有恕我直言两种实现.如果没有完全闭包支持,则局部变量将与该块周围方法的局部变量共享.为此,您需要知道如何解决一些问题.对于完全闭包支持,局部变量就在那里并且可以正常工作.

Squeak和Pharo曾经拥有与该方法共享的本地人.现在有一个完全关闭支持的虚拟机,Pharo完全支持这个,我认为Squeak也是如此.我认为宝石没有全封闭支持.我不知道VaST和VisualWorks.

您可以通过执行以下操作来测试它:

((1 to: 5) collect: [:i| 
    [ | local | local := i ]])
        collect: [:each| each value]
Run Code Online (Sandbox Code Playgroud)

在这里你只能得到

#(1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)

如果有完全关闭支持和

#(5 5 5 5 5)
Run Code Online (Sandbox Code Playgroud)

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

  • VisualWorks和ST/X实现完全闭包 (2认同)