我只是想弄清楚当你在底部有.new时你的代码会发生什么。实施什么方法?
如果我理解你在说什么,name.rb
底部的Name.new
将简单地创建一个Name
类的新实例。调用的方法可以是 new
类方法(如果在 Name
类中定义了方法),要么是Class
类中定义的new
方法。
举个例子:
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
方法可以调用allocate
或initialize
或任何其他方法,但在调用Class.new
时调用的是new
方法。
当你在 Ruby 中调用new
一个类时,它会为你创建一个该对象的新实例,该实例使用提供给new
的参数初始化。如果你来自Java世界,你可能会认为这是一个构造函数,但这是不正确的,它是新创建的对象所具有的值的初始值设定项。
new
方法调用您调用new
的类的initialize
。如果你还没有实现这个方法,Ruby 会在其超类中查找它。
一个非常人为的例子:
class Monkey
def initialize(name)
puts "Hello #{name}"
end
end
Monkey.new("Peter")
>> Hello Peter
您的部分困惑可能是由于您没有定义名为 new
的方法。
我从你的问题中推断出你有一个名为Name
的类,所以让我们把它当作给定的;在Ruby中,类是一等对象,是类Class
的实例;因此,Name
是类Class
的实例,你可以很容易地看到new
是类Class
的实例方法。 这已经在 Ruby 中定义过了(你当然可以覆盖它)。
当您调用 new
创建新对象(如 Name.new
中所示)时,将调用 Class
中new
的方法;它调用 allocate
为新对象分配空间,然后调用已分配对象的 initialize
方法,将调用new
的参数(如果有)传递给它。