首页 > 解决方案 > Ruby prepend 不适用于类方法

问题描述

我正在尝试在 ruby​​ 中使用 prepend 方法来覆盖类的方法,这是我的代码的工作方式:

module PrependedModule
  def self.klass_method
    puts 'PrependedModule klass_method'
  end

  def instance_method_a
    puts 'PrepenedModule instance method'
  end
end

class SomeClass
  prepend PrependedModule

  def self.klass_method
    puts 'SomeClass klass_method'
  end

  def instance_method_a
    puts 'SomeClass instance_method'
  end
end

SomeClass.klass_method
SomeClass.new.instance_method_a

#output:
#SomeClass klass_method
#PrependedModule instance method

#expected:
#PrependedModule klass_method
#PrependedModule instance method

该脚本的输出如上所示,我们可以看到,实例方法instance_method_a被 module 覆盖PrependedModule,但没有被 class 方法覆盖klass_method,当我调用klass_methodSomeClass,它仍然执行它的 origin 方法,而不是在PrependedModule.

我对此感到困惑,不知道使用前置时类方法发生了什么。如果有人能为我解决这个问题,那将是一个很大的帮助。

标签: ruby

解决方案


单例类不是这样工作的。您需要明确prepend的特征类的方法SomeClass

module PrependedModule
  module ClassMethods
    def klass_method
      puts 'PrependedModule klass_method'
    end
  end

  def instance_method_a
    puts 'PrepenedModule instance method'
  end
end

class SomeClass
  # prepending to the class
  prepend PrependedModule
  class << self
    # prepending to the eigenclass
    prepend PrependedModule::ClassMethods
  end

  def self.klass_method
    puts 'SomeClass klass_method'
  end

  def instance_method_a
    puts 'SomeClass instance_method'
  end
end

推荐阅读