7

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

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

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
4

3 に答える 3

6

Ruby では、演算子またはキーワードでnewはありません。インスタンスのインスタンスメソッドですClass。たとえば、オブジェクトOpenHoursはクラスであり、したがって のインスタンスでありClass、したがってインスタンス メソッドがありますnew

于 2012-11-14T03:09:09.403 に答える
6

レシーバーが の場合、レシーバーはself省略できます。質問している最初の 2 つのnew呼び出しは、 のコンテキスト内で呼び出されます。OpenHoursつまり、selfが に設定されOpenHoursます。したがって、明示的なレシーバーがないと、および とnew同等です。3 番目の例では、コンテキストは のインスタンスです。はそのインスタンスを参照し、 を参照するため、と同等です。いずれの場合も、作成されたオブジェクトは のインスタンスです。self.newOpenHours.newOpenHoursselfself.classOpenHoursself.class.newOpenHours.newOpenHours

于 2012-11-14T03:16:24.247 に答える
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)、インスタンスはに割り当てられますfoo

于 2012-11-14T03:09:39.000 に答える