62
class A
private
  def initialize
    puts "wtf?"
  end
end

A.new #still works and calls initialize

class A
private
  def self.new
    super.new
  end
end

まったく機能しません

では、正しい方法は何ですか?newプライベートにして、ファクトリメソッドで呼び出したいです。

4

3 に答える 3

95

これを試して:

class A
  private_class_method :new
end

APIDock の詳細

于 2009-10-14T16:33:53.070 に答える
13

試したコードの 2 番目のチャンクは、ほぼ正しいものです。問題はprivate、クラス メソッドではなくインスタンス メソッドのコンテキストで動作していることです。

取得privateまたはprivate :new機能させるには、次のようなクラス メソッドのコンテキスト内に強制する必要があります。

class A
  class << self
    private :new
  end
end

newまたは、本当に再定義して呼び出したい場合super

class A
  class << self
    private
    def new(*args)
      super(*args)
      # additional code here
    end
  end
end

クラス レベルのファクトリ メソッドは、privatenewに問題なくアクセスできますが、private を使用して直接インスタンス化しようとするnewと失敗しますnew

于 2015-09-30T18:50:42.330 に答える