首页 > 解决方案 > 在 ruby​​ 中使方法动态化

问题描述

定义一个类如下。我想one_method动态调用。默认情况下,wow.one_method调用第一个one_method. 如果我想改变方法的行为,只需调用redefine.

我可以将该方法实现为函数类型属性,但这不是我想要的。

如果我直接使用下面的代码,会报错。能不能稍微修改一下。

class Wow

    def one_method
        puts "hello Ruby"
    end

    def redefine(what="none")
        define_method :one_method do 
        puts what
        end
    end
end

wow = Wow.new
wow.redefine("Whatever I want.")

标签: rubyoopdynamic

解决方案


您可以通过class_eval或来实现instance_eval

class Wow

  def one_method
    puts "hello Ruby"
  end

  def redefine(what="none")
    self.class.class_eval do
      define_method :one_method do 
        puts what
      end
    end
  end
end

wow = Wow.new
wow.one_method #=> hello Ruby

wow.redefine("Whatever I want.")
wow.one_method #=> Whatever I want.

原因是它define_method在接收器上定义实例方法并且是类的实例方法,因此您必须在要重新定义方法的对象的特征类上调用它。


推荐阅读