如果我定义这个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"内的对象功能
答案 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 ]
}
}