我听说Smalltalk不支持块中的局部变量。这是真的?如果是,为什么Smalltalk不支持局部变量?我还能认为它与闭包相同吗?
答案 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支持他们。