在Ruby元编程中避免使用class_eval

Pet*_*ter 3 ruby metaprogramming

我想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
Run Code Online (Sandbox Code Playgroud)

和示例用法:

class Foo
  return_empty_set :one
end
Foo.new.one  # returns #<Set: {}>
Run Code Online (Sandbox Code Playgroud)

但是使用一个字符串似乎是一个非常黑客.是否有更清洁或更好的方式来写这个,也许避免class_eval?或者这是最好的方式吗?

Mar*_*une 6

用途define_method:

class Module
  def return_empty_set *names
    names.each do |name|
      define_method(name){Set.new}
    end
  end
end
Run Code Online (Sandbox Code Playgroud)