ArgumentError:Ruby中的参数数量错误

Abh*_*nay 4 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")
Run Code Online (Sandbox Code Playgroud)

但我得到的错误如下:

ArgumentError: wrong number of arguments calling `initialize` (1 for 0)
Run Code Online (Sandbox Code Playgroud)

我不明白在这里问什么,如果它只是争论那么为什么错误就像(1为0).有人可以帮助我理解这个问题.

Aru*_*hit 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
Run Code Online (Sandbox Code Playgroud)

当你initialize没有明确的接收者写作时:

initialize( "ak" )
Run Code Online (Sandbox Code Playgroud)

您的信息得到了认可,这只是运气问题.看看谁回复了:

method( :initialize ).owner
#=> BasicObject
Run Code Online (Sandbox Code Playgroud)

BasicObject所有Object实例的前任,她都通过责骂错误的论点来回应你的电话,因为:

method( :initialize ).arity
#=> 0
Run Code Online (Sandbox Code Playgroud)

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

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

Person.new处理新实例的创建并自动调用其#initialize方法.此外,#initialize方法是私有的,即使您没有明确指定它.这种不规则行为的技术术语是神奇的.Person#initialize是神奇的私人:

A.initialize( 'Fred' )
NoMethodError: private method `initialize' called for #<Person:0xb7c66044 @name="Abhinay">
Run Code Online (Sandbox Code Playgroud)

你知道,你不能只是将自己重新初始化为'弗雷德'.除非另有规定,所有其他方法均为公开:

A.greet "Arup"
Hi Arup, I'm Abhinay
#=> nil
Run Code Online (Sandbox Code Playgroud)