gpt4 book ai didi

smalltalk:关于方法 - "withArgs:executeMethod:"

转载 作者:行者123 更新时间:2023-12-05 03:22:50 26 4
gpt4 key购买 nike

我正在尝试理解 smalltalk 中的方法“withArgs: executeMethod:”,吱。

<强>1。我试图了解该方法的作用是什么?2. 需要传递什么参数才能执行?

最佳答案

理解此方法的一个好方法是将其视为一般表达式的句法变体

  object msg: arg                      (*)

哪里object是带有选择符 msg: 的消息的接收者和 arg它的论点。当然也有没有参数或有多个参数的变体,但思路是一样的。

object收到此消息 (*) 虚拟机 (VM) 查找 CompiledMethod带选择器 msg:object的层次结构,并将控制权转移给它,绑定(bind) selfobject以及该方法的正式参数 arg .

请注意,此调用 由 VM 管理,而不是由虚拟镜像 (VI) 管理。那么,我们如何才能在 VI 中反射(reflect)相同的内容呢?好吧,这个行为有两个步骤:(1) 找到方法和 (2) 将它的正式接收者和参数绑定(bind)到实际的接收者和参数并让它运行。

步骤 (1) 是所谓的查找 算法。它在 Smalltalk 中很容易实现:只需询问接收者它的类,检查该类是否包含选择器 #msg:如果没有,则转到父类(super class)并重复。如果所有检查都失败,发出 doesNotUnderstand:消息。

步骤 (2) 确实需要什么 #withArgs:executeMethod:提供。它允许我们说

   object withArgs: {arg} executeMethod: method

哪里methodCompiledMethod在步骤(1)中找到。 [我们必须使用 {arg}而不是 arg因为 withArgs: 中的复数形式建议该方法需要一个 Array参数。]

我们为什么要这个?

一般来说,赋予 VI 模仿 VM 中实现的行为的能力是一件好事,因为它使元编程更容易(也更自然)。

更实际地,使用此功能的一个相关示例是方法包装器的实现。简而言之,给定任何特定方法,您可以将它(作为 wrappee )包装在 wrapper 中方法,它也有一个 preBlock .如果您随后替换 MethodDictionary 中的原始方法它属于哪里,带有wrapper , 你可以让 wrapper首先执行 preBlock然后是预期的方法。第一项任务很简单:只需发送消息 preBlock value .对于第二个,我们有方法(wrappee)、接收者和参数(如果有的话)。所以,要完成任务你只需要发送给接收者 withArgs:executeMethod:与实际参数和 wrappee .

啊!我们不要忘记提及使用方法包装器的原因之一是测量测试覆盖率。

另请注意 withArgs:executeMethod:不需要第二个参数,即要执行的方法,在任何类中,更不用说接收者的类了。特别是,您可以创建一个 CompiledMethod即时并在任何给定对象上执行它。当然,由您来确保执行不会使 VM 崩溃,例如,如果接收者只有两个 ivar,则使用接收者的第三个 ivar 等。创建 CompiledMethod 的简单方法。不在任何类中安装它是通过要求 Smalltalk 编译器这样做(寻找 newCompiler 的发件人以了解如何做到这一点)。

关于smalltalk:关于方法 - "withArgs:executeMethod:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72613604/

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