【问题标题】:Avoiding class_eval in Ruby metaprogramming在 Ruby 元编程中避免使用 class_eval
【发布时间】:2010-05-22 18:36:16
【问题描述】:

我想在 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: {}>

但诉诸字符串似乎是一种 hack。有没有更干净或更好的方法来写这个,也许避免class_eval?或者这是最好的方法?

【问题讨论】:

    标签: ruby metaprogramming


    【解决方案1】:

    使用define_method:

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

    【讨论】:

    • 太好了,谢谢。你说得对,应该在Module下,以后我就可以include这个功能了。
    • 不确定这是否是您的意思,但将其放在Module 下的原因是您可以在Module 定义(稍后包含)以及@ 987654327@'.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2012-03-22
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多