1

我正在研究一种基于新类的动态类型编程语言,其中函数是一流的对象。在类中定义的函数(也称为方法)称为传递self作为第一个参数,而全局定义的函数不需要具有 self 参数。

在如下代码中:

func foo(a) {
    return a*2;
}

class c3 {
    var p1 = 555;
    func init() {
        p1 = foo;
    }
}

class c2 {
    var p1 = 333;
    func init() {
        p1 = c3();
    }
}

class c1 {
    var p1 = 111;
    func init() {
        p1 = c2();
    }
}

func main() {
    return c1().p1.p1.p1(1234);
}

编译器如何决定是否需要将self作为第一个参数传递给 p1(1234)?在这种情况下 p1 指向 foo 这是一个不需要self参数的全局函数。

4

2 回答 2

0

在 Python 中,这是由描述符协议在运行时处理的。

Java 通过不允许使用 () 调用对象来处理这个问题。一切都是用方法语法调用的,编译器知道它是静态方法还是虚拟方法。函数对象的 Java 等效项要求您调用对象上的特定方法(foo.call() 而不是 foo())

我相信 C++ 通过类型系统来处理这个问题。如果名称是一个方法,那么它就是一个方法调用。如果是静态方法,就是静态方法调用。否则,您将访问字段上的 () 运算符。

于 2016-06-15T13:16:36.313 回答
0

很简单:c3.p1 是成员变量,而不是 c3 的方法。因此,当您调用c3.p1它时,根本不会self指向任何c3.

但是,您可能希望支持绑定方法:

class c3 {
    var p1 = 555;
    func bar() { print "Hello, world"; }
    func init() {
        p1 = self.bar; // NOT self.bar()
    }
}

在这种情况下,编译器仍然不会传递对的c3 self引用,c3.p1()但这在调用站点不是必需的,因为selfself.bar分配给p1.

于 2016-06-15T13:37:17.773 回答