簡體   English   中英

ArgumentError:Ruby中的參數數量錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM