在Ruby元编程中避免使用class_eval

时间:2010-05-22 18:36:16

标签: ruby metaprogramming

我想在Ruby中使用return_empty_set类方法,类似于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 个答案:

答案 0 :(得分:6)

使用define_method

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