[英]ArgumentError: wrong number of arguments in Ruby
試圖解決這個問題,
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)。 有人可以幫助我理解這個問題。
看看這段代碼:
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
實例的BasicObject
,她通過責罵錯誤的參數數量來回應你的調用,因為:
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
您需要調用對象上的方法(而不僅僅是調用方法),並在創建新對象時自動調用initialize:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.