ArgumentError:Ruby中的参数数量错误

时间:2014-03-10 07:18:22

标签: 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)。有人可以帮助我理解这个问题。

4 个答案:

答案 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

不仅这个方法不期望任何参数,而且根本不需要你调用它。实际上,除了特殊情况之外,您不应该自己在任何对象上调用#initializeClass#new方法为您处理Person#initialize方法的调用:

A = Person.new( 'Abhinay' )
Initializing Person instance -605867998 
#=> #<Person:0xb7c66044 @name="Abhinay">

Person.new处理了新实例的创建并自动调用了其#initialize方法。此外,#initialize方法是私有的,即使您没有明确指定它。这种不正常行为的技术术语是magicPerson#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