带有宏不编译的水晶类

  • 本文关键字:水晶 编译 crystal-lang
  • 更新时间 :
  • 英文 :


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}},则编译器会懒惰地检查呼叫的方法。不过,它没有记录下来。它有几个错误。但是现在可能还可以。

相关内容

  • 没有找到相关文章

最新更新