在仅将方法分配给一个实例之前,如何同时将其分配给多个实例?

问题描述

| 在我的假设应用程序中,用户可以提出问题,然后以“ 0”回答。您可以使用
Predictor.predictor
方法获得适当的ѭ​​0ѭ,然后您可以向其提出问题。当您对问题“ 3”回答时,您会得到一个答案,以及对它的回答“ 0”的确定性(0..1范围内的浮点数)。
class BaSEOracle; def ask(question); ...; end; end
class UnreliableOracle < BaSEOracle; ...; end

module Predictor
  def self.predictor
    @predictor ||= UnreliableOracle.new
  end
end

Predictor.predictor.ask(\"How many fingers am I holding up?\")
 # => [\"three fingers\",0.2]
在此实现中,您每次都会获得一个UnreliableOracle实例相同的Oracle。我想做的就是更改Predictor.predictor的实现,以便将在其上调用方法委托给一组Oracle,其中一些优于其他Oracle。换句话说,我希望它能像这样工作:
class BaSEOracle; ...; end
class UnreliableOracle < BaSEOracle; ...; end
class PopCultureOracle < BaSEOracle; ...; end
class ScienceOracle < BaSEOracle; ...; end
class LiteraryOracle < BaSEOracle; ...; end
class FingerCountingOracle < BaSEOracle; ...; end

module Predictor
  def self.predictor
    ############## What goes here?
  end
end

# This actually asks several oracles for an answer and picks the best one.
Predictor.predictor.ask(\"How many fingers am I holding up?\")
 # => [\"four fingers\",1.0]
最好的方法是什么?     

解决方法

这本质上是策略设计模式,其中每个Oracle实际上都是回答问题的策略。 最简单(也许最干净)的方法是构造一个“ 7”,询问其他预言者正确的答案是什么,并选择最佳答案:
class MetaOracle
  def oracles
    @oracles ||= [ScienceOracle.new,LiteraryOracle.new,# ...
  end

  def ask(question)
    oracles.map { |o| o.ask question }.        # Ask each Oracle a question ...
      sort_by { |answer| -answer.certainty }.  # sort by the best answers ...
      first                                    # ... and pick the best one.
  end
end

module Predictor
  def self.predictor
    @predictor ||= MetaOracle.new
  end
end
现在,具有最佳答案的Oracle将赢得胜利,它将成为您所看到的答案。