访问Fantom课程'来自构造函数中的成员函数的成员it-block?

时间:2017-06-21 09:25:11

标签: fantom

如果我定义这个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",也被定义,而不通过"混合" object作为函数的参数?

如果我在每个变量前加上"混合",就像这样:

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

编译器抱怨:Unknown variable 'mixed'

使用this.whole,因为它引用了Example类,所以没有意义。 使用it.whole并不是因为它引用了函数。

任何人都可以建议访问"混合"来自" convertToFrac"内的对象功能

1 个答案:

答案 0 :(得分:2)

正如您正确评估的那样,问题是您在it-block内使用了it-block,并且因为您使用的是隐式it(即您不是' t有任何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变量限定符的想法很好,但不幸的是,在处理ctor时,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 ]
    }
}