试图解决这个问题,
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代表0)。有人可以帮助我理解这个问题。
答案 0 :(得分:9)
看看这段代码:
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。 Person#initialize
神奇地私密:
A.initialize( 'Fred' )
NoMethodError: private method `initialize' called for #<Person:0xb7c66044 @name="Abhinay">
你知道,你不能只为'弗雷德'重新初始化自己。除非另有规定,否则所有其他方法都是公开的:
A.greet "Arup"
Hi Arup, I'm Abhinay
#=> nil
答案 1 :(得分:4)
您需要调用对象上的方法(而不仅仅是调用方法),并在创建新对象时自动调用initialize:
p = Person.new("ak")
p.greet("aks") #=> "Hi aks, my name is ak"
答案 2 :(得分:3)
问题是要创建新对象,您需要在类上调用方法new
,而不是在对象上调用initialize
。
所以代码看起来像这样:
p = Person.new("John")
答案 3 :(得分:1)
请看下面的代码:
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