从构造函数 it 块中的成员函数访问 Fantom class' 成员?

Accessing Fantom class' members from a member function in a constructor it-block?

如果我定义这个Fantom class

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 ]
      }
    }
  }
}

编译器抱怨说:

是否有任何方法可以引用从函数 "convertToFrac" 中创建的对象 "mixed",也被定义,而不将 "mixed" 对象作为函数的参数传递?

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

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

编译器抱怨:Unknown variable 'mixed'

使用 this.whole 没有意义,因为它指的是示例 class。 使用 it.whole 也没有意义,因为它指的是函数。

任何人都可以建议从 "convertToFrac" 函数中访问 "mixed" 对象的方法吗?

正如您正确评估的那样,问题是您在 it-block 中使用了 it-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 变量限定符的想法很好,但不幸的是,在处理 ctor 时,mixed 变量尚未创建,因此无法引用。

但是你可以在it-block中创建你自己的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 ]
    }
}