- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试理解 smalltalk 中的方法“withArgs: executeMethod:”,吱。
<强>1。我试图了解该方法的作用是什么?2. 需要传递什么参数才能执行?
最佳答案
理解此方法的一个好方法是将其视为一般表达式的句法变体
object msg: arg (*)
哪里object
是带有选择符 msg:
的消息的接收者和 arg
它的论点。当然也有没有参数或有多个参数的变体,但思路是一样的。
当 object
收到此消息 (*) 虚拟机 (VM) 查找 CompiledMethod
带选择器 msg:
在object
的层次结构,并将控制权转移给它,绑定(bind) self
至 object
以及该方法的正式参数 arg
.
请注意,此调用 由 VM 管理,而不是由虚拟镜像 (VI) 管理。那么,我们如何才能在 VI 中反射(reflect)相同的内容呢?好吧,这个行为有两个步骤:(1) 找到方法和 (2) 将它的正式接收者和参数绑定(bind)到实际的接收者和参数并让它运行。
步骤 (1) 是所谓的查找 算法。它在 Smalltalk 中很容易实现:只需询问接收者它的类,检查该类是否包含选择器 #msg:
如果没有,则转到父类(super class)并重复。如果所有检查都失败,发出 doesNotUnderstand:
消息。
步骤 (2) 确实需要什么 #withArgs:executeMethod:
提供。它允许我们说
object withArgs: {arg} executeMethod: method
哪里method
是CompiledMethod
在步骤(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/
我正在尝试理解 smalltalk 中的方法“withArgs: executeMethod:”,吱。 1。我试图了解该方法的作用是什么?2. 需要传递什么参数才能执行? 最佳答案 理解此方法的一个好
我尝试使用 Apache 的 HTTP 客户端和 MultipartRequests 上传文件,但出现错误,这是我的代码: PostMethod filePost = new PostMethod("
我有一个 java 程序,它创建多个线程,每个线程都发出 POST 请求。它大部分时间都工作正常,但在重负载下它会抛出连接重置异常。例如,当我同时发出 40 个请求时,有几次出现连接重置异常。 Cau
我是一名优秀的程序员,十分优秀!