试图解决这个问题,
class Person
def initialize(name)
@name=name
end
def greet(other_name)
puts "Hi #{other_name}, my name is #{name}"
end
end
initialize("ak")
greet("aks")
Run Code Online (Sandbox Code Playgroud)
但我得到的错误如下:
ArgumentError: wrong number of arguments calling `initialize` (1 for 0)
Run Code Online (Sandbox Code Playgroud)
我不明白在这里问什么,如果它只是争论那么为什么错误就像(1为0).有人可以帮助我理解这个问题.
看看这段代码:
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
Run Code Online (Sandbox Code Playgroud)
当你initialize没有明确的接收者写作时:
initialize( "ak" )
Run Code Online (Sandbox Code Playgroud)
您的信息得到了认可,这只是运气问题.看看谁回复了:
method( :initialize ).owner
#=> BasicObject
Run Code Online (Sandbox Code Playgroud)
BasicObject所有Object实例的前任,她都通过责骂错误的论点来回应你的电话,因为:
method( :initialize ).arity
#=> 0
Run Code Online (Sandbox Code Playgroud)
不仅这个方法不期望任何参数,而且你根本不需要调用它.实际上,#initialize除了特殊情况之外,您不应该自己调用任何对象.Class#new方法Person#initialize为您处理方法调用:
A = Person.new( 'Abhinay' )
Initializing Person instance -605867998
#=> #<Person:0xb7c66044 @name="Abhinay">
Run Code Online (Sandbox Code Playgroud)
Person.new处理新实例的创建并自动调用其#initialize方法.此外,#initialize方法是私有的,即使您没有明确指定它.这种不规则行为的技术术语是神奇的.Person#initialize是神奇的私人:
A.initialize( 'Fred' )
NoMethodError: private method `initialize' called for #<Person:0xb7c66044 @name="Abhinay">
Run Code Online (Sandbox Code Playgroud)
你知道,你不能只是将自己重新初始化为'弗雷德'.除非另有规定,所有其他方法均为公开:
A.greet "Arup"
Hi Arup, I'm Abhinay
#=> nil
Run Code Online (Sandbox Code Playgroud)