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”函数中访问“混合”对象的方法?

4

1 回答 1

2

正如您正确评估的那样,问题在于您使用的是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 块中创建你自己的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 ]
    }
}
于 2017-06-21T12:40:38.827 回答