ponylang:在另一个构造函数中调用构造方法?
问题描述:
ENV:ponylang 0.9.0ponylang:在另一个构造函数中调用构造方法?
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)
哪里得到一个确切的解释?
答
在小马构造函数调用总是会创建一个新的对象,没有委托构造函数。
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)
正确的'create'构造函数的伪代码是怎么样的? “this”算作别名吗? “this”的确切类型是什么?鉴于“构造函数总是返回一个短暂类型,因为它是一个新对象。” – dobedo
在构造函数内部,'this'总是被视为'Type ref'。任何引用都是别名,而'this'是构造函数开头的唯一对象的别名。即使构造函数返回一个唯一类型(即'new iso create()'或'new trn create()'),这是安全的,因为这样的构造函数必须有可发送参数,这意味着'this'的'ref'别名' t构造函数的“外部泄漏”:不能将其存储在'val'或'tag'参数中,并且如果将其存储在'iso'参数中,则由于隔离而在对象外部不可见'iso'的边界。 –