【发布时间】:2012-06-27 05:37:17
【问题描述】:
我无法在 SmallTalk 中获取消息的发件人。我想要完成的是从第一个方法(A)调用的另一个方法(B)修改方法(A)的返回值。再次... A 调用 B,我希望 B 从 A 的上下文中返回一个值。
示例代码:
这将是 A:
A
| aResult aPartialResult |
aPartialResult := self B.
"do things with aPartialResult"
^aResult.
这将是 B:
B
| aResult |
[ aResult := "do something" ]
on: Exception
do: ["make A return something"].
^aResult.
问题是我希望 B 中可能引发的异常也可以在 B 中处理。这就是为什么我不只是在 B 中引发异常以在 A 中处理它并轻松地从那里返回。
我以为我可以使用 thisContext 来做到这一点,但发件人是 nil。也可以得到一个关于为什么会这样的答案......
提前致谢!
【问题讨论】:
-
这不是打破了封装,为什么 B 应该知道关于 A 的任何事情?
-
B 和 A 是 同一个对象上的方法。
-
@Guillermo 我仍在努力思考您正在尝试的内容...除了指定返回值之外,您是否在 B 的错误处理程序中做任何事情?这是您的目标,即您是否坚持 A/B 部门,还是那么灵活?如果你能以一种不那么以实现为中心的方式来陈述具体问题,那真的很棒。我们可以很容易地回答你的问题,但这在 Smalltalk 中似乎很罕见,直觉告诉我们有更好的方法来解决它......
-
如果您使用
A和B以外的其他名称作为方法名称,它可能会使您的眼睛更容易一些。 Smalltalk 有很强的约定性,按照约定,方法名称以小写字母开头,并且缩写不是要走的路,即使在一次性示例中也是如此。试着打电话给他们methodOne和methodTwo,它看起来会好很多。此外,使用冠词“a”(或“an”)作为前缀的变量通常用于方法参数,而不是临时变量。这背后的原因是为了强调传入的内容是一个可能的值。只是我的 2 美分 ;-) -
我会回复一个答案,因为我在这里无法容纳足够的字符...
标签: reflection exception-handling metaprogramming smalltalk pharo