带有宏的水晶类未编译

时间:2019-05-17 23:36:53

标签: crystal-lang

static

我知道了

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

为什么?并将@a设置为nil确实解决了问题,但是我认为这不是一个好的解决方法。

是错误,设计限制还是只是我没有做正确的事?

1 个答案:

答案 0 :(得分:1)

是的,当前这是设计限制。用https://github.com/crystal-lang/crystal/issues/2731

引用Ary
  

是的,这是预期的行为。初始化必须足够简单,以便编译器进行分析。宏可能会在子类中重新定义,因此解析init对于初次通过而言并不简单。

     

这对我来说是“无法解决”的,或者我们可以将其标记为增强功能,但不会很快发生(也许永远不会发生)

     

我引入了一种技巧,可以通过宏进行初始化:如果提到{{@type}},则编译器将延迟检查调用的方法。但是,没有记录。它有几个错误。但是现在可能还可以。