在类型成员上编译时间反射

时间:2019-06-08 10:48:44

标签: reflection crystal-lang

我想编写一个宏,该宏将允许我对记录的每个属性执行一些操作,例如使用适当的类型转换将CSV行反序列化为记录实例。我从哪里开始?

1 个答案:

答案 0 :(得分:3)

这是一个非常广泛的问题。因此,我将回答两个不同的问题。

如何避免使用宏进行代码重复?

简单,只需使用循环!

numbers = [5, 3, 2, 1]

{% for operator in [:*, :+, :/, :-] %}
  numbers.map! {|number| number {{operator.id}} 23 }
{% end %}

p numbers
[-17, -19, -20, -21]

如何在编译时获取类型的所有实例变量的列表?

通过TypeNode#instance_vars

struct Bag 
  property has_wallet : Bool = false
  property has_bottle : Bool = false
  property has_keys : Bool = false
end

def fill_bag(bag)
  {% for name in Bag.instance_vars %}
  bag.{{name.id}} = true
  {% end %}
  bag
end

p fill_bag(Bag.new)
Bag(@has_wallet=true, @has_bottle=true, @has_keys=true)