在Crystal 0.21.1中使用“宏继承”定义实例方法

时间:2017-04-07 10:38:38

标签: crystal-lang

据我了解,类型声明的作用类似kind_of ...

  

“所以类型不是严格意义上的类型,而是像is_a?kind_of?一样。”https://github.com/crystal-lang/crystal/issues/4232

所以我认为这部分代码可行。

但是当我使用宏来定义继承类的实例方法时,错误消息会抱怨错误对象中缺少该方法。

class Base
  macro inherited
    def name
      "Joe Smith"
    end
  end
end

class Context < Base; end

class Render
  def initialize(@inner_context : Base); end

  def display
    name
  end

  forward_missing_to inner_context

  private property inner_context
end

puts Render.new(Context.new).display

输出是:

Error in line 23: instantiating 'Render#display()'

in line 15: instantiating 'name()'

in macro 'forward_missing_to' /usr/lib/crystal/object.cr:1132, line 1:

>  1.     macro method_missing(call)
   2.       inner_context.{{call}}
   3.     end
   4.   

expanding macro
in macro 'method_missing' expanded macro: forward_missing_to:1, line 1:

>  1.       inner_context.name
   2.     

undefined method 'name' for Base (compile-time type is Base+)

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

@inner_context可以是Base类型,不会定义base方法。

一种解决方案是将Base标记为摘要:abstract class Base