检查方法元数据(即arity,arg类型等)

问题描述 投票:3回答:2

在Crystal中,是否可以在编译时查看类型方法的元数据?例如,要确定方法接受的参数数量,参数的类型限制是什么,等等。

通过API,编译器的DefArg宏有可能返回此元信息的方法,但我看不到访问它们的方法。我怀疑元信息只能由编译器访问。

crystal-lang
2个回答
3
投票

我发现了怎么做。我正在寻找API的错误位置。 Crystal::Macros::TypeNode有一个methods宏,它返回一个方法Def的数组(这是你可以访问它们的方法)。看起来TypeNode类是很多好宏的入口点。

用法示例

class Person
  def name(a)
    "John"
  end

  def test
    {{@type.methods.map(&.name).join(', ')}}
  end
end

要么

{{@type.methods.first.args.first.name}}

简单地返回参数名称会产生一个有趣的问题,因为在宏解释器将其粘贴到程序中之后,编译器会将名称解释为变量(这是有意义的)。

但真正的价值在于能够看到方法参数的类型限制

class Public < Person
  def name(a : String)
    a
  end

  def max
    {{@type.methods.first.args.first.restriction}}
  end
end

Person.new.max # => String

0
投票

我怀疑元信息只能由编译器访问。

究竟。 Crystal没有运行时反射。您可以在编译时使用宏做很多事情,但是一旦编译完成,类型和方法信息就不再可用了。

但是,由于程序中的所有内容都是编译时知道的,因此您不应该真正需要运行时反射。

© www.soinside.com 2019 - 2024. All rights reserved.