0

irbで次のことを行うと、次の出力が得られます。

>> class TestMe
>>   def new
>>     puts 'hi!'
>>   end
>> end
=> nil
>> TestMe.new.new
hi!

さらに:

>> class TestMe
>> end
=> nil
>> TestMe.new.new
NoMethodError: undefined method `new' for #<TestMe:0x00000101038750>

しかし、選択したテキストエディタで、という名前のインスタンスメソッドを呼び出すコードを記述している場合new(ただし、新しいオブジェクトをインスタンス化するObjectメソッドではありません) 、予約済みのキーワードであるかのように強調表示されます。newnew

@page = current_user.locations.new

ここlocationsでは、(このメソッドを介してnew)手間のかかる作業を行い、最終的にはLocation.new基本的なセットアップデータの準備ができているインスタンスを返しますが、newそれ自体はクラスオブジェクトで呼び出されていないデリゲータークラスを返します。これはメソッド名の許容できる使用法ですか、それとも問題が発生しますか?

4

1 に答える 1

3

の最初の.new呼び出しはコンストラクターを呼び出し、クラスのインスタンスを返します。の2番目の呼び出し.newは、そのオブジェクトのインスタンスメソッドを呼び出します。newインスタンスメソッドを定義することは完全に許容されます。

コンストラクターに干渉するには、と呼ばれるクラスレベルのメソッドを定義する必要がありますnew。そのメソッドは、オブジェクトの実際の作成を実行するために呼び出すことができsuper#newます(これはを呼び出します)。Class#new

class Test
  def self.new
    puts "hi!"
    super
  end
end


x = Test.new # outputs "hi"

何か正しいことをするようにカスタムメソッドをnew定義する限り、インスタンスレベルとクラスレベルの両方で上書きすることは完全に有効です。new

于 2012-10-26T19:01:57.660 に答える