看这段代码:
class Person
attr_reader :name
def initialize( name )
puts "Initializing Person instance #{object_id}"
@name = name
end
def greet( name )
puts "Hi #{name}, I'm #{name()}"
end
end
当你写下initialize
没有明确的接收者:
initialize( "ak" )
您的消息被认可只是运气问题。看看谁回复了:
method( :initialize ).owner
#=> BasicObject
BasicObject
,一切的始祖Object
例如,她自己回应了你的电话,因为参数数量错误而责骂你,因为:
method( :initialize ).arity
#=> 0
该方法不仅不需要任何参数,而且您根本不需要调用它。事实上,您不应该打电话#initialize
除特殊情况外,您可以自行处理任何物体。Class#new
方法处理调用Person#initialize
适合您的方法:
A = Person.new( 'Abhinay' )
Initializing Person instance -605867998
#=> #<Person:0xb7c66044 @name="Abhinay">
Person.new
处理新实例的创建并自动调用它#initialize
方法。还,#initialize
方法被创建为私有的,即使您没有明确指定它。这种不规则行为的技术术语是magic http://odetocode.com/Blogs/scott/archive/2010/07/13/ruby-initialize-and-super.aspx. Person#initialize
神奇地是私有的:
A.initialize( 'Fred' )
NoMethodError: private method `initialize' called for #<Person:0xb7c66044 @name="Abhinay">
你知道,你不能只是将自己重新初始化为“Fred”。除非另有规定,所有其他方法都是公开的:
A.greet "Arup"
Hi Arup, I'm Abhinay
#=> nil