在Crystal中,是否可以在编译时查看类型方法的元数据?例如,要确定该方法接受的参数数量,对参数的类型限制是什么,等等。
通过API,编译器的Def
和Arg
宏具有应该返回此元信息的方法,但是我看不到访问它们的方法。我怀疑元信息只能由编译器访问。
答案 0 :(得分: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}}
仅返回参数名称会引起一个有趣的问题,因为在宏解释器将其粘贴到程序中之后,编译器会将名称解释为变量(这很有意义)。
但是 real 值发生在能够看到方法参数的类型限制
class Public < Person
def name(a : String)
a
end
def max
{{@type.methods.first.args.first.restriction}}
end
end
Person.new.max # => String
答案 1 :(得分:0)
我怀疑元信息只能由编译器访问。
完全正确。 Crystal没有运行时反射。您可以在编译时对宏做很多事情,但是一旦宏被编译,类型和方法信息就不再可用。
但是,由于程序中的所有内容都是编译时,所以您实际上不需要运行时反射。