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