20

クラスメソッドから呼び出すことができるプライベートインスタンスメソッドを作成できますか?

class Foo
  def initialize(n)
    @n = n
  end
  private # or protected?
  def plus(n)
    @n += n
  end
end

class Foo
  def Foo.bar(my_instance, n)
    my_instance.plus(n)
  end
end

a = Foo.new(5)
a.plus(3) # This should not be allowed, but
Foo.bar(a, 3) # I want to allow this

これがかなり初歩的な質問である場合はお詫びしますが、私は解決策への道をグーグルで検索することができませんでした。

4

3 に答える 3

20

Ruby では、private や protected を使用してもあまり効果がありません。任意のオブジェクトで send を呼び出し、その任意のメソッドを使用できます。

class Foo
  def Foo.bar(my_instance, n)
    my_instance.send(:plus, n)
  end
end
于 2009-01-07T15:54:19.920 に答える
10

サミュエルが示したように実行できますが、実際にはOOチェックをバイパスしています...

Ruby では、同じオブジェクトに対してのみプライベート メソッドを送信でき、同じクラスのオブジェクトに対してのみ保護されます。静的メソッドはメタ クラスに存在するため、別のオブジェクト (および別のクラス) に存在するため、private または protected のいずれかを使用して希望どおりに行うことはできません。

于 2009-01-07T20:37:56.477 に答える
7

使用することもできますinstance_eval

class Foo
  def self.bar(my_instance, n)
    my_instance.instance_eval { plus(n) }
  end
end
于 2009-01-08T00:51:02.333 に答える