0

コードは次のとおりです。

module A
  class C1
    def self.grovel(x)
      return A::helper(x) + 3
    end
  end

  class C2
    def self.grovel(x)
      return A::helper(x) + 12
    end
  end
  private
  def helper(y)
    y + 7
  end
  module_function :helper
end

f = A::C1.grovel(7)
puts f
puts A::C2.grovel(25)

あまり変更しないように、レガシー コードを使用しています。各クラスには共通のコードを持つメソッドが 1 つしか含まれていないため、同じメソッドで 2 つの別個のクラスを作成したかどうかはわかりません。A のメソッドのみが参照できるメソッドに共通コードを抽出したいのですが、完全修飾名 ("A::helper") で呼び出す必要があります。

これを行うより良い方法はありますか?理想的には、修飾なしでクラス grovel メソッド内から呼び出すことができるメソッド (「ヘルパー」と呼びましょう) で共通コードをラップしたいと思いますが、モジュール A の外部のコードでは簡単に利用できません。

ありがとう。

4

2 に答える 2

1

別のモジュールを作成するのはどうですか?

module A
  module Helper
    def helper(y)
      y + 7
    end
  end  

  class C1
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 3
      end
    end
  end

  class C2
    class << self
      include A::Helper    

      def grovel(x)
        return helper(x) + 12
      end
    end
  end


end

puts A::C1.grovel(7)
puts A::C2.grovel(25)

A のサブモジュールを作成し、Mixin としてクラスに含めます。そうすれば、これらのクラスだけがメソッドにアクセスできます。

http://rubyfiddle.com/riddles/31313で動作しているのを見ることができます

于 2014-01-17T07:26:37.557 に答える
0

Minix は、適切な継承を適用​​できない場合に便利です。たとえば、クラスは他の 2 つのクラスのプロパティを継承する必要があるため、ここで継承メカニズムを使用できます。

module A
  class C
    def self.helper(y)
      y + 7
    end
  end

  class C1 < C
    def self.grovel(x)
      return self.helper(x) + 3
    end
  end

  class C2 < C
    def self.grovel(x)
      return self.helper(x) + 12
    end
  end
end

puts A::C1.grovel(7)
puts A::C2.grovel(25)
于 2014-01-17T08:12:37.547 に答える