试图解决此问题,
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")
但是我遇到的错误如:
ArgumentError: wrong number of arguments calling `initialize` (1 for 0)
我不明白在这里问什么,如果只是参数,那么为什么错误是(1 for 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
当您不明确接收器编写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
方法也是私有创建的。这种不规则行为的技术术语是魔术。Person#initialize
是神奇的私人:
A.initialize( 'Fred' )
NoMethodError: private method `initialize' called for #<Person:0xb7c66044 @name="Abhinay">
您知道,您不仅可以重新开始"弗雷德"。除非另有规定,否则所有其他方法都是公开的:
A.greet "Arup"
Hi Arup, I'm Abhinay
#=> nil
您需要调用对象上的方法(不仅调用方法),并且在创建新对象时会自动调用初始化:
p = Person.new("ak")
p.greet("aks") #=> "Hi aks, my name is ak"
问题是要创建新对象,您需要在类上调用方法new
,而不是对象上的initialize
。
所以代码看起来像这样:
p = Person.new("John")
,请查看下面的代码:
class Person
attr_reader :name
def initialize(name)
@name = name
end
def greet(other_name)
puts "Hi #{other_name}, my name is #{name}"
end
end
person = Person.new("ak")
person.greet("aks")
#=> Hi aks, my name is ak