Ruby:没有课程的'新'

时间:2012-11-14 03:05:52

标签: ruby

我对Ruby的理解是'new'关键字总是与类名组合以创建一个新的类实例。在下面的代码中,https://gist.github.com/e9c0da1a6e92dd12cbc7找到了作为新手编程挑战的解决方案提交,作者使用'new'关键字三次而不实例化一个类。

在一种情况下,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

3 个答案:

答案 0 :(得分:6)

在Ruby中,new 是运算符或关键字。它是Class实例的实例方法。例如,对象OpenHours是一个类,因此是Class的实例,因此具有实例方法new

答案 1 :(得分:5)

当接收器为self时,可以省略接收器。您正在质疑的前两个new来电是在OpenHours的上下文中调用的,这意味着self设置为OpenHours。因此,没有明确接收者的new相当于self.newOpenHours.new。在第三个示例中,上下文是OpenHours的实例。 self引用该实例,self.class引用OpenHours,因此self.class.new相当于OpenHours.new。在所有情况下,创建的对象都是OpenHours的实例。

答案 2 :(得分: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