参数:Ruby中的错误数量

  • 本文关键字:错误 Ruby 参数 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 for 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实例的先驱,她自己对您的电话做出了回应,通过责骂您的参数数量错误,因为:

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

您需要调用对象上的方法(不仅调用方法),并且在创建新对象时会自动调用初始化:

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

最新更新