Ruby class_eval方法

前端之家收集整理的这篇文章主要介绍了Ruby class_eval方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图找出如何动态创建方法
class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.class_eval do
        def m(*value) 
          puts value
        end
      end
    }
    end
end

tmp = MyClass.new ['method1','method2','method3']

不幸的是,这只是创建了方法m,但是我需要创建基于m的价值的方法,想法?

解决方法

有两种接受的方式:

>使用define_method

@arr.each do |method|
  self.class.class_eval do
    define_method method do |*arguments|
      puts arguments
    end
  end
end

>使用class_eval与字符串参数:

@arr.each do |method|
  self.class.class_eval <<-EVAL
    def #{method}(*arguments)
      puts arguments
    end
  EVAL
end

第一个选项将闭包转换为方法,第二个选项计算字符串(heredoc)并使用常规方法绑定.第二个选项在调用方法时具有非常轻微的性能优势.第一个选择是(可以说)更可读.

原文链接:https://www.f2er.com/ruby/272125.html

猜你在找的Ruby相关文章