在Ruby中定义名为“new”的实例方法是有效/可接受的吗?

时间:2012-10-26 18:52:06

标签: ruby

当我在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本身并不是在类对象上调用的。这是方法名称的可接受使用,还是会遇到问题?

1 个答案:

答案 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