IO语言:消息send、do和doMessage之间有什么区别



虽然有可用的文档,但我更困惑,而不是开明。让我们考虑一个例子:
我有一个myObject实例,它有myMethod方法,我从大厅调用它:

myObject myMethod

在这个方法的主体中,完成了以下操作:

myObject1 anotherMethod //1
msg := message(anotherMethod)
myObject2 do(msg) //2
myObject3 doMessage(msg) //3

那么,有人能解释一下12和3之间的区别吗
这些案件的实际主叫人是谁?方法的locals对象,方法对象还是myObject?发送方和调用者之间有区别吗(我想在doMessage的情况下有区别,发送方是myMethod的locals对象,但"调用者"是myObject3)

好吧,按顺序:

  1. 消息anotherMethod由名为myObject的实例接收。这是在调用上下文中完成的(可能是大厅,除非包装在另一个do()
  2. do()引入了一个新的作用域,并且对调用作用域不做任何操作。也就是说,您不能引用do()内部调用范围中的任何内容,除非它恰好在Protos层次结构中或在do()中引入。do()也有一个消息树,所以你所做的是有效地发送message(msg),在myObject的上下文中进行评估,这没有多大意义,因为由于范围不可用,第一次无法找到msg,即使是,也没有多大的意义。一般来说,如果你发现自己想写myObject do(msg),你想做一些类似的事情:msg doInContext(myObject)
  3. 在功能上等于上面的#1。事实上,如果你要为Io代码编写一个编译器,直到消息,这或多或少就是你从#1的编译步骤中得到的。在这个简短的例子中,它们是等价的

最新更新