调用Name.new时会发生什么?什么新方法被调用?

时间:2014-02-24 17:11:08

标签: ruby

我只想弄清楚当底部有.new时你的代码会发生什么。实施了什么方法?

3 个答案:

答案 0 :(得分:2)

如果我了解您的目标,Name.new底部的name.rb将只创建Name类的新实例。如果您在new类中定义了一个方法,或者Name类中定义的new方法,则调用的方法将是Class类方法。

举个例子:

class Name

  class << self
    def new
      puts "In new method in Name class"
      super
    end
  end
end

使用此类调用Name.new将导致:

in new method in Name class
=> #<Name:0x007fa3b2b34360>

正如Jörg在对此问题的评论中所述,new方法可能会调用allocateinitialize或任何其他方法,但它是new方法在调用Class.new时调用。

答案 1 :(得分:1)

当您在Ruby中的某个类上调用new时,它将为您创建一个新对象,该对象使用提供给new的参数进行初始化。 如果您来自Java世界,您可能会将其视为构造函数,但这不正确,它是新创建的对象具有的值的初始值。

new方法调用您调用initialize的类的new。 如果您尚未实现此方法,Ruby将在其超​​类中查找它。

一个非常人为的例子:

class Monkey
    def initialize(name)
        puts "Hello #{name}"
    end
end

Monkey.new("Peter")
>> Hello Peter

答案 2 :(得分:0)

部分原因可能是您没有定义名为new的方法。

我从你的问题中推断出你有一个名为Name的类,所以让我们把它当作给定的;在Ruby中,类是第一类对象,是类Class的实例;因此,Name是类Class的一个实例,您可以很容易地看到new是类Class实例方法,已经是在Ruby中定义(你当然可以覆盖它)。

当您致电new创建新对象时(如Name.new中所述),new中的方法Class会被调用;它调用allocate为新对象分配空间,然后调用已分配的对象的initialize方法,并将调用的参数传递给new(如果有的话)。