2016-12-04 67 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()