Techioz Blog

Rubyのインスタンスからプライベートクラスメソッドを呼び出す方法はありますか?

概要

もちろん、self.class.send :method、args 以外にも。コードを複製せずに、クラス レベルとインスタンス レベルの両方で使用できるかなり複雑なメソッドを作成したいと考えています。

アップデート:

@Jonathan Branam: それは私の推測でしたが、他の誰も回避方法を見つけていないことを確認したかったのです。 Ruby の可視性は Java の可視性とは大きく異なります。また、private がクラス メソッドでは機能しないこともまったく正しいですが、これはプライベート クラス メソッドを宣言します。

class Foo
  class <<self
    private
    def bar
      puts 'bar'
    end
  end
end

Foo.bar
# => NoMethodError: private method 'bar' called for Foo:Class

解決策

質問に関連するコードスニペットを次に示します。クラス定義での「private」の使用は、クラス メソッドには適用されません。次の例のように「private_class_method」を使用する必要があります。

class Foo
  def self.private_bar
    # Complex logic goes here
    puts "hi"
  end
  private_class_method :private_bar
  class <<self
    private
    def another_private_bar
      puts "bar"
    end
  end
  public
  def instance_bar
    self.class.private_bar
  end
  def instance_bar2
    self.class.another_private_bar
  end
end

f=Foo.new
f=instance_bar # NoMethodError: private method `private_bar' called for Foo:Class
f=instance_bar2 # NoMethodError: private method `another_private_bar' called for Foo:Class

これを回避する方法がわかりません。ドキュメントには、プライベート メソッドの受信を指定できないと記載されています。また、プライベート メソッドには同じインスタンスからのみアクセスできます。クラス Foo は、Foo の特定のインスタンスとは異なるオブジェクトです。

私の答えを最終的なものとして受け取らないでください。私は確かに専門家ではありませんが、回答しようとする他の人が適切なプライベート クラス メソッドを使用できるように、コード スニペットを提供したいと思いました。