我只想弄清楚当底部有.new时你的代码会发生什么。实施了什么方法?
答案 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
方法可能会调用allocate
或initialize
或任何其他方法,但它是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
(如果有的话)。