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



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

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

我找到了怎么做。我在 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

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

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

但是,由于程序中的所有内容都是编译时已知的,因此您实际上不需要运行时反射。

相关内容

  • 没有找到相关文章

最新更新