Отражение времени компиляции над членами типа - PullRequest
1 голос
/ 08 июня 2019

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

1 Ответ

3 голосов
/ 10 июня 2019

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

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

Просто, просто используйте цикл!

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)
...