2012-11-14 4 views
6

Rubyについての私の理解は、クラスの新しいインスタンスを作成するために、 'new'キーワードが常にクラス名と結合されていることでした。 Ruby Programming Challenge for Newbiesコンテストの解決策として提出されたhttps://gist.github.com/e9c0da1a6e92dd12cbc7のコードで、著者はクラスをインスタンス化せずに3回「new」キーワードを使用します。Ruby:クラスなしで '新規'

あるケースでは、新しい(0,0)が定数CLOSEDに割り当てられます。別のケースでは、new(open、close)は関数からの戻り値です。それはなぜこの方法ですか?このように使われたとき、「新しい」ことは何ですか?それは何を作成していますか? Rubyで

class OpenHours 

    attr_reader :open, :close 

    def initialize(open, close) 
     @open, @close = open, close 
    end 

    def duration 
     @duration ||= @open < @close ? @close - @open : 0 
    end 

    CLOSED = new(0, 0)    #first new 


    def self.parse(open, close) 
     open = Time.parse(open) 
     close = Time.parse(close) 


     open = TimeUtils::seconds_from_midnight(open) 
     close = TimeUtils::seconds_from_midnight(close) 


     new(open, close)      #second new 

    end 

    def offset(seconds) 
     self.class.new([@open, seconds].max, @close)  #third new 
    end 

    end 

答えて

5

に割り当てられます。あなたが質問している最初の2つのnewコールは、OpenHoursのコンテキスト内で呼び出されます。つまり、selfOpenHoursに設定されています。したがって、明示的な受信者のないnewself.newOpenHours.newに相当します。 3番目の例では、コンテキストはOpenHoursのインスタンスです。 selfはそのインスタンスを指し、self.classOpenHoursを指すので、self.class.newOpenHours.newに相当します。すべての場合、作成されたオブジェクトはOpenHoursのインスタンスです。

6

newないオペレータまたはキーワードです。それはClassインスタンスのインスタンスメソッドです。たとえば、オブジェクトOpenHoursはクラスであるため、Classのインスタンスであるため、インスタンスメソッドnewがあります。

0

OpenHours :: CLOSEDは、正直に言うとOpenHours

irb(main):034:0> OpenHours::CLOSED 
=> #<OpenHours:0x3ee2e85d @open=0, @close=0> 
irb(main):035:0> OpenHours::CLOSED.class 
=> OpenHours 

のインスタンスである、私は彼らがここでやっているのか分かりません。私はそれが悪いコードだと思う。をコメントする

返信:あなたがfoo = OpenHours.parse(open, close)を行う場合は、受信機が受信機を省略することができ、selfあるときは、そのインスタンスがfoo

+0

OpenHoursのインスタンスnew(open、close)を返すself.parseメソッドもありますか?何かに割り当てられてはいけませんか? – BrainLikeADullPencil

関連する問題