for
class Y
def initialize(@a : String)
end
getter a
end
class X
macro test(name)
@{{name}} = y.{{name}}
end
@a : String
def initialize(y : Y)
test a
end
end
我有
instance variable '@a' of X was not initialized directly in all of the 'initialize' methods, rendering it nilable. Indirect initialization is not supported.
为什么?并将@A设置为nil确实解决了问题,但我认为这不是一个很好的解决方法。
是一个错误,设计限制还是我不做正确的事情?
是的,目前这是一个设计限制。引用https://github.com/crystal-lang/crystal/issues/2731
是的,这是预期的行为。初始化必须足够简单,以便编译器进行分析。宏可能会在子类中重新定义,因此第一次通过的init并不是很琐碎的。
这是"不会解决的"对我来说,或者也许我们可以将其标记为一种增强功能,但是它不会很快发生(也许永远不会(
我引入了一个黑客,以通过宏来使初始化成为可能:如果提到了
{{@type}}
,则编译器会懒惰地检查呼叫的方法。不过,它没有记录下来。它有几个错误。但是现在可能还可以。