2016-12-07 175 views
0

ENV:ponylang 0.9.0ponylang:在另一个构造函数中调用构造方法?

ponylang tutorial

class Wombat 
    let name: String 
    var _hunger_level: U64 

    new create(name': String) => 
    name = name' 
    _hunger_level = 0 

    new hungry(name': String, hunger': U64) => 
    name = name' 
    _hunger_level = hunger' 

尝试以下,编译器抱怨:constructor with undefined fields

new create(name': String) => 
    hungry(name', 0) 

哪里得到一个确切的解释?

回答

1

在小马构造函数调用总是会创建一个新的对象,没有委托构造函数。

new create(name': String) => 
    hungry(name', 0) 

在您的例子中,调用hungry并不适用于create被初始化的对象,但对新Wombat分配。

在小马的伪代码,这是真实的情况。

new create(this: Wombat, name': String) => 
    let new_wombat = Wombat_Alloc() 
    hungry(new_wombat, name', 0) 
+0

正确的'create'构造函数的伪代码是怎么样的? “this”算作别名吗? “this”的确切类型是什么?鉴于“构造函数总是返回一个短暂类型,因为它是一个新对象。” – dobedo

+0

在构造函数内部,'this'总是被视为'Type ref'。任何引用都是别名,而'this'是构造函数开头的唯一对象的别名。即使构造函数返回一个唯一类型(即'new iso create()'或'new trn create()'),这是安全的,因为这样的构造函数必须有可发送参数,这意味着'this'的'ref'别名' t构造函数的“外部泄漏”:不能将其存储在'val'或'tag'参数中,并且如果将其存储在'iso'参数中,则由于隔离而在对象外部不可见'iso'的边界。 –

相关问题