gpt4 book ai didi

closures - Smalltalk:上下文无法返回

转载 作者:行者123 更新时间:2023-12-04 17:48:55 25 4
gpt4 key购买 nike

下面的Smalltalk代码如果我一一执行它们,会返回错误“上下文无法返回”。请问有人有解释吗?

  f := [ :x :y | ^x + y].
sum:= f value: 3 value: 6.

如果我一次性执行它们,它会起作用并返回 9正如预期的那样。

最佳答案

你可能想写

f := [ :x :y | x + y].
sum:=f value: 3 value: 6.

为什么?

让我告诉你

非本地退货。

当你想从一个方法中返回一些东西时,你可以使用 ^插入符号的方法:
doSomethingUseful
^ self calculate + 1

这是正常的返回。一切还好。现在输入块。

你总是隐式地从一个块中返回一些东西,它的最后一个表达式的值。
所以,这个块会返回 42 ,执行时:
[1 + someObject invert.
anotherObject * 4.
42].

您可以在方法中使用它:
doSomethingUseful: someObject to: anotherObject
| myValue |
myValue := [1 + someObject invert.
anotherObject * 4.
42] value.
^ self calculate + myValue

但是,有时您必须从函数块中返回。
一个典型的例子是像这样的保护子句:
doThis
self someValueSatisfied ifFalse: [^ self]
self calculate.
^ self someValueComputed.

#someValueSatsified返回 false ,该方法立即返回并且从不执​​行 #calculate#someValueComputed .这种效果被称为 非本地返回 因为你不是从块返回到它的调用上下文(这将是本地的),而是形成它在(!)中定义的方法。

为什么它一次起作用?

这是由于“Do-its”的处理方式,例如。吱吱声或法罗。当您按下 Ctrl-D(或等效键)时,当前选定的代码会被 secret 编译为一个方法(好吧,还有一点,但让我们忽略它)。你可以看到,如果你执行 1 halt并查看调试器。

因此,逐行执行代码将执行以下操作:
DoIt
f := [ :x :y | ^(x+y). ]. "! f is now defined in the work space"

DoIt
sum:=f value: 3 value: 6.

首先,块被创建并存储在您的工作区中的某处,名称为 f .然后这个do-it退出并执行下一个。 Smalltalk 发现 f在您的工作区中,作为存储块。它尝试执行它并遇到非本地返回。但是,非局部返回仅从不再执行的定义函数返回,因此我们无法从中返回。

当您一口气执行所有内容时,这将类似于:
DoIt
f := [ :x :y | ^(x+y). ].
sum:=f value: 3 value: 6.

几乎和上面一样,除了现在 f执行后,非本地返回可以工作,因为我们仍然在定义块的函数中。所以我们可以从中返回。在这种情况下,非本地返回有效。

关于closures - Smalltalk:上下文无法返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22772549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com