2

Ruby でシングルトン パターンを実装しようとしましたが、Ruby でプライベート クラス メソッドにアクセスできない理由を知りたいだけです

class Test

    private_class_method :new
    @@instance = nil
    def self.getInstance
            if(!@@instance)
                    @@instance = Test.new
            end

            return @@instance
    end
end

「new」をプライベート クラス メソッドとして宣言し、シングルトン メソッド「getInstance」で「new」を呼び出そうとします。

テスト出力

>> require "./test.rb"
=> true
>> Test.getInstance
NoMethodError: private method `new' called for Test:Class
from ./test.rb:7:in `getInstance'
from (irb):2
>> 
4

2 に答える 2

3

はプライベート メソッドであるため::new、クラス定数にメッセージを送信してアクセスすることはできません。selfただし、レシーバーを省略して暗黙的に送信するだけで機能します。

さらに、これはクラス メソッドであるため、そのインスタンス変数のスコープは既にクラス レベルであるため、クラス変数を使用する必要はありません@@。インスタンス変数はここで問題なく機能します。

class Test
  private_class_method :new

  def self.instance
    @instance ||= new
  end
end


puts Test.instance.object_id
puts Test.instance.object_id
# => 33554280
# => 33554280
于 2013-07-15T09:00:58.317 に答える
2
private_class_method :new

NoMethodError: private method `new' called for Test:Class

それが理由です。プライベート メソッドは、明示的なレシーバーで呼び出すことはできません。を使ってみてくださいsend

@@instance = Test.send(:new)

または暗黙のレシーバーを使用 ( selfis であるためTest)

@@instance = new
于 2013-07-15T09:00:14.610 に答える