Рельсы используют define_method для метода назначения не работает - PullRequest
0 голосов
/ 28 мая 2018

У меня есть константа

TYPES = %w(car truck)

Я хочу определять пользовательские методы назначения двоично

TYPES.each do |type|
  define_method "#{type}s=(objects)" do

Но это не работает, когда я вызываю

myobject.cars=objects

Я получаю сообщение об ошибке: метод не существует, хотя я могу его отследить

puts myobject.methods

имеет метод

cars=(objects)

Ответы [ 3 ]

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

define_method ожидает имя метода, а не подпись.

define_method "#{type}s=" do |objects|
  puts objects
end
0 голосов
/ 28 мая 2018

define_method(symbol) { block } → symbol Фактический метод находится в блоке, а параметры блока - это параметры фактического метода.Вот описание из Ruby документов.Определяет метод экземпляра в получателе.Параметр метода может быть объектом Proc, Method или UnboundMethod.Если указан блок, он используется как тело метода.Этот блок оценивается с использованием instance_eval, что сложно продемонстрировать, поскольку define_method является закрытым.(Вот почему мы прибегаем к хаку отправки в этом примере.)

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

Вы должны написать что-то вроде этого, чтобы оно заработало:

define_method "#{type}s=" do |objects|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...