Как определить методы внутри модуля на основе переданного массива строк? - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь определить методы с помощью макроса.Когда я пытаюсь построить методы (см. Ниже), я вижу синтаксическую ошибку for expression must be an array, hash or tuple literal, not Var:.

module Test
  def self.get_from_outside(methods)
    build_methods(methods.to_a)
  end

  macro build_methods(methods)
    {% for method in methods %}
      def self.{{method.id}}_present?
        true
      end
    {% end %}
  end
end

t = Test
t.get_from_outside(["method_a", "method_b", "method_c"])

https://carc.in/#/r/45o7

ОК, узел имеет тип Var, а макрос не разрешает передачуэтот тип, но если я передаю массив напрямую, программа успешно компилируется.Теперь я не могу передать параметры снаружи.

module Test
 METHODS = ["method_a", "method_b", "method_c"]

 {% for method in METHODS %}
   def self.{{method.id}}
     true
   end
 {% end %}
end

t = Test
p t.responds_to?(:method_a)
#=> true

https://carc.in/#/r/45o8

Можно ли определить методы внутри модуля с внешним массивом?

1 Ответ

0 голосов
/ 29 мая 2018

При работе с макросами, вероятно, наиболее важной концепцией для получения прав является выполнение во время компиляции в сравнении с выполнением во время выполнения.

Макросы выполняются во время компиляции как интерпретируемый язык компилятором.Весь другой код выполняется при запуске сгенерированного двоичного файла.

Поэтому макросы не могут получить доступ к каким-либо данным времени выполнения, таким как параметры определения обычного метода.Вы можете перейти от макроса к среде выполнения, сгенерировав код, который помещает данные туда, где среда выполнения ожидает их, например, к определенной переменной.Но очевидно, что вы не можете пойти другим путем.

Так что, как правило, вы можете передавать данные из макроса в метод, но не наоборот.

...