2017-06-21 36 views
2

如果我定義這個魅影類訪問Fantom類成員從一個構造函數中的成員函數它塊?

const class Mixed 
{ 
    const Int whole 
    const Int numerator 
    const Int denominator 

    const | -> Int[]| convertToFrac 

    new make(|This| func) { func(this) } 
} 

我想創建一個實例定義convertToFrac功能,像這樣:

class Example 
{ 
    Void main(Str args) 
    { 
    mixed := Mixed { 
     whole = 2 
     numerator = 3 
     denominator = 8 
     convertToFrac = |->Int[]| { 
     return [ whole * denominator + numerator, denominator ] 
     } 
    } 
    } 
} 

編譯器會抱怨說:

  • Unknown variable 'numerator'
  • Unknown variable 'denominator'
  • Unknown variable 'whole'

是否有任何方式來指代對象「混合」正在從函數「convertToFrac」內產生,也被限定,而不通過「混合」對象作爲函數的參數?

如果我在前面加上 「混合」 的各變量,像這樣:

return [ mixed.whole * mixed.denominator + mixed.numerator, mixed.denominator ] 

編譯器抱怨:Unknown variable 'mixed'

使用this.whole沒有意義,因爲它指的是Example類。 使用it.whole沒有意義,因爲它指的是功能。

任何人都可以請建議的方式來訪問「convertToFrac」功能內的「混合」的對象?

回答

2

正如你正確評估,問題是,您使用的是it-blockit-block裏面,因爲你使用的是隱it(即你沒有任何it預選賽)有混亂,什麼被引用。

我會寫出來的it預選賽了長手,所以你可以看到發生了什麼事情:

mixed := Mixed { 
    // 'it' is the Mixed instance 
    it.whole = 2 
    it.numerator = 3 
    it.denominator = 8 

    it.convertToFrac = |->Int[]| { 
     // 'it' is now the func param 

     // 'it.whole' doesn't exist, because there is no func param 
     return [ it.whole * it.denominator + it.numerator, it.denominator ] 
    } 
} 

您使用mixed變量預選賽的想法是好的,但是,遺憾的是,雖然處理變量mixed變量尚未創建,因此無法引用。

但是你可以在它塊創建自己的mixed變量,下面的編譯和運行相當愉快:

mixed := Mixed { 
    // 'mixed' doesn't exist here yet, because we're still creating a value to assign to it 
    it.whole = 2 
    it.numerator = 3 
    it.denominator = 8 

    // assign `it` to our own `mixed` variable 
    mixed := it 
    it.convertToFrac = |->Int[]| { 
     // use our own `mixed` variable 
     return [ mixed.whole * mixed.denominator + mixed.numerator, mixed.denominator ] 
    } 
} 
相關問題