编译时对类型成员的反射
Compile time reflection over type members
我想编写一个宏,让我对记录的每个属性执行一些操作,例如通过适当的类型转换将 CSV 行反序列化到记录实例中。我从哪里开始?
这是一个非常宽泛的问题。所以我会回答两个不同的问题。
如何使用宏避免代码重复?
很简单,只需要一个循环!
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)
我想编写一个宏,让我对记录的每个属性执行一些操作,例如通过适当的类型转换将 CSV 行反序列化到记录实例中。我从哪里开始?
这是一个非常宽泛的问题。所以我会回答两个不同的问题。
如何使用宏避免代码重复?
很简单,只需要一个循环!
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)