如何在方法存在之前重新定义方法?

时间:2016-07-04 02:46:09

标签: ruby homebrew monkeypatching

在OS X的自制软件中,有一个DownloadStrategyDetector课程,我正在进行点击,需要覆盖此课程中的几个方法以添加其他下载策略(他们是'非常小众,所以不被接受进入核心)。

我尝试简单地重新定义(见下文)我的Formula类上面的类,试图覆盖默认定义,但是仍然使用该类的常规版本。

class DownloadStrategyDetector
  def self.detect_from_url(url)
    # ...
  end

  def self.detect_from_symbol(symbol)
    # ...
  end
end

有没有办法强制将某个类的所有用途用于特定的定义?这是使用类的默认定义结束调用的回溯。

我的代码位于tester.rb,并间接调用加载resource.rb的{​​{1}},这会覆盖我对download_strategy.rb的定义。

回溯:

DownloadStrategyDetector

我也尝试了另一种策略,我在这里添加了一个挂钩到我的/usr/local/Library/Homebrew/download_strategy.rb:963:in `detect_from_symbol' /usr/local/Library/Homebrew/download_strategy.rb:916:in `detect' /usr/local/Library/Homebrew/resource.rb:144:in `url' /usr/local/Library/Homebrew/software_spec.rb:62:in `url' /usr/local/Library/Homebrew/formula.rb:1666:in `url' /Users/camdennarzt/Developer/Ruby/homebrew-core/formula/tester.rb:68:in `<class:Tester>' /Users/camdennarzt/Developer/Ruby/homebrew-core/formula/tester.rb:63:in `load_formula' /usr/local/Library/Homebrew/formulary.rb:25:in `module_eval' /usr/local/Library/Homebrew/formulary.rb:25:in `load_formula' /usr/local/Library/Homebrew/formulary.rb:42:in `load_formula_from_path' /usr/local/Library/Homebrew/formulary.rb:91:in `load_file' /usr/local/Library/Homebrew/formulary.rb:82:in `klass' /usr/local/Library/Homebrew/formulary.rb:78:in `get_formula' /usr/local/Library/Homebrew/formulary.rb:215:in `factory' /usr/local/Library/Homebrew/extend/ARGV.rb:29:in `block in resolved_formulae' /usr/local/Library/Homebrew/extend/ARGV.rb:27:in `map' /usr/local/Library/Homebrew/extend/ARGV.rb:27:in `resolved_formulae' /usr/local/Library/Homebrew/cmd/reinstall.rb:10:in `reinstall' /usr/local/Library/brew.rb:87:in `<main>' 类,并尝试使用别名交换方法:

DownloadStrategyDetector

但它只打印了以下内容,就好像该类从未重新打开一样:

class DownloadStrategyDetector
  def self.singleton_method_added(name)
    puts name
    alias_method :detect_from_url, :detect_from_url_2 if name == :detect_from_url
    alias_method :detect_from_symbol, :detect_from_symbol_2 if name == :detect_from_symbol
  end

  def self.detect_from_url_2(url)
    # ...
  end

  def self.detect_from_symbol_2(symbol)
    # ...
  end
end

0 个答案:

没有答案
相关问题