Как избежать class_eval в метапрограммировании Ruby - PullRequest
3 голосов
/ 22 мая 2010

Я хочу иметь метод класса return_empty_set в Ruby, похожий на методы attr_reader. Моя предлагаемая реализация

class Class
  def return_empty_set *list
    list.each do |x|
      class_eval "def #{x}; Set.new; end"
    end
  end
end

и пример использования:

class Foo
  return_empty_set :one
end
Foo.new.one  # returns #<Set: {}>

но прибегнуть к струне похоже на хакера. Есть ли более чистый или лучший способ написать это, возможно, избегая class_eval? Или это лучший путь?

1 Ответ

6 голосов
/ 22 мая 2010

Использование define_method:

class Module
  def return_empty_set *names
    names.each do |name|
      define_method(name){Set.new}
    end
  end
end
...