2017-06-21 9 views
2

私はこれのFantomクラスFantomクラスのメンバにコンストラクタit-blockのメンバ関数からアクセスしますか?

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を使用することは、例のクラスを参照するので意味をなさない。 it.wholeを使用すると、関数を参照する意味がありません。

"convertToFrac"関数内から "mixed"オブジェクトにアクセスする方法をお勧めしますか?

答えて

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 ] 
    } 
} 
関連する問題