Отражение времени компиляции над членами типа

Я хотел бы написать макрос, который позволит мне выполнять некоторые операции с каждым атрибутом записи, например десериализовать строку CSV в экземпляр записи с правильным приведением типов. С чего мне начать?


person kyku    schedule 08.06.2019    source источник


Ответы (1)


Это очень широкий вопрос. Я отвечу на два разных вопроса.

Как избежать дублирования кода с помощью макросов?

Просто используйте петлю!

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)
person Jonne Haß    schedule 10.06.2019