2016-12-04 63 views
2

它看起来并不像Pony language做出了许多大举堆栈溢出,但你的宝贝,开始的地方......小马构造函数是如何工作的?

Here's约小马构造非常有限的信息,这是不是帮助我了解什么我正在看。

这里有一个初步方案:

class Wombat 
    let name: String 
    var _hunger_level: U64 

    new anon() => 
    name = "Anon" 
    _hunger_level = 0 

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

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

actor Main 
    new create(env: Env) => 

    env.out.print("Started.") 

    let wombat: Wombat = Wombat("Ernie") 
    let w: Wombat = createWombat() 

    env.out.print("Name: "+wombat.name) 
    env.out.print("Name: "+w.name) 

    fun createWombat(): Wombat => 
    let w: Wombat = Wombat("Bert") 
    w 

让我们重命名 “创造” 的构造,以 “命名”:

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

...我看到错误:

Error: 
/src/main/main.pony:22:26: couldn't find 'create' in 'Wombat' 
    let wombat: Wombat = Wombat("Ernie") 

......这表明所有的构造函数都不是平等的。咦......?

所以,让我们撤销这一改变。

现在让我们尝试使用零参数的构造函数:

let wombat: Wombat = Wombat() 
    let w: Wombat = createWombat() 

...现在我明白了:

Error: 
/src/main/main.pony:22:33: not enough arguments 
    let wombat: Wombat = Wombat() 
          ^

它忽略了构造函数。

那么,让我们重命名前两个构造函数:

new create() => 
    name = "Anon" 
    _hunger_level = 0 

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

...现在我明白了:

Error: 
/src/main/main.pony:22:26: couldn't find 'apply' in 'Wombat' 
    let wombat: Wombat = Wombat() 

不知道这意味着什么。

回答

0

谢谢你在Pony邮件列表中的Chris Double。

答案在Syntactic Sugar文档中。我们只需要指定我们正在运行的构造函数。所以我改变了匿名实例化为:

let wombat: Wombat = Wombat.anon()