当我在irb中执行以下操作时,我得到此输出:
>> class TestMe
>> def new
>> puts 'hi!'
>> end
>> end
=> nil
>> TestMe.new.new
hi!
此外:
>> class TestMe
>> end
=> nil
>> TestMe.new.new
NoMethodError: undefined method `new' for #<TestMe:0x00000101038750>
但是当我在我选择的文本编辑器中编写一些代码时,调用名为new
的实例方法(但不是实例化新对象的Object
方法new
)它突出显示new
,好像它是一个保留关键字:
@page = current_user.locations.new
请注意locations
这里返回一个委托者类,它通过这个new
方法做了一些繁重的工作,并最终返回一个Location.new
实例,其中包含一些基本的设置数据,但new
本身并不是在类对象上调用的。这是方法名称的可接受使用,还是会遇到问题?
答案 0 :(得分:3)
第一次调用.new
将调用构造函数,并返回类的实例。对.new
的第二次调用将调用该对象上的实例方法。定义new
实例方法完全可以接受。
为了干扰构造函数,您必须定义名为new
的类级方法。该方法可以调用super#new
(调用Class#new
)来执行对象的实际创建:
class Test
def self.new
puts "hi!"
super
end
end
x = Test.new # outputs "hi"
在实例和类级别覆盖new
是完全有效的,只要您定义自定义new
方法来执行 sane 。