尝试创建 ruby class 实例时出现 ArgumenError

Getting ArgumenError while trying to create instance of a ruby class

我正在努力提高我的 OO ruby 技能。我创建了一个 class,当调用并尝试创建它的 ans 实例时,出现错误。

这是代码。

class EncapsulatedPerson
    def initialize(name)
        set_name(name)
    end

    def name
        @first_name + " "+ @last_name
    end

    def set_name
        first_name, last_name = name.split(/\s+/)
        set_first_name(first_name)
        set_last_name(last_name)
    end

    def set_first_name
        @first_name = name
    end

    def set_last_name
        @last_name = name
    end

end

当我加载我在上面写入的文件并尝试创建此 class

的实例时
2.2.0 :004 > ep = EncapsulatedPerson.new('William Wallace')
ArgumentError: wrong number of arguments (1 for 0)
  ... # 

根据我的错误理解,我应该在创建新实例时传递 0 个参数(但是我相信 def initialize(name) ... 需要一个(名称)参数'

2.2.0 :003 > ep = EncapsulatedPerson.new
ArgumentError: wrong number of arguments (0 for 1)

我完全糊涂了。 new 方法在尝试实例化时需要多少个参数?有争论还是没有争论?

哦,亲爱的,你的 class 定义是错误的,像这样改变 EncapsulatedPerson 中的 set_first_nameset_last_name 方法。

def set_first_name(name)
    @first_name = name
end

def set_last_name(name)
    @last_name = name
end

我会说,number of arguments (1 for 0) 的错误是由您的 set_first_nameset_last_name 方法引起的,它们声明不接受任何参数:

class EncapsulatedPerson
  # ...

    def set_first_name
        @first_name = name
    end

    def set_last_name
        @last_name = name
    end

end

尝试更新它们,让它们接受参数:

class EncapsulatedPerson
  # ...

    def set_first_name(name)
        @first_name = name
    end

    def set_last_name(name)
        @last_name = name
    end

end

希望对您有所帮助!

编辑

完整代码应如下所示:

class EncapsulatedPerson
  attr_reader :first_name, :last_name

  def initialize(name)
    set_name(name)
  end

  def name
    @first_name + " "+ @last_name
  end

  def set_name(name)
    first_name, last_name = name.split(/\s+/)
    set_first_name(first_name)
    set_last_name(last_name)
  end

  def set_first_name(name)
    @first_name = name
  end

  def set_last_name(name)
    @last_name = name
  end

end

epa = EncapsulatedPerson.new('William Wallace')
puts epa.first_name

在初始化方法中,您正在调用接受 1 个参数的 set_name 方法:

def initialize(name)
    set_name(name)
end

而您的 set_name 方法定义不接受任何参数:

def set_name
    first_name, last_name = name.split(/\s+/)
    set_first_name(first_name)
    set_last_name(last_name)
end

根据您的设计,由于方法 name 已作为实例方法创建,因此无需将其作为参数传递给 set_name

但我会说你应该修改你的 class 如下所示。

要解决您的问题,请像这样更改 class:

class EncapsulatedPerson
  def initialize(name)
    @first_name, @last_name = name.split(/\s+/)
    set_name(@first_name, @last_name)
  end

  def name
    @first_name + " "+ @last_name
  end

  def set_name(first_name, last_name)
    set_first_name(first_name)
    set_last_name(last_name)
  end

  def set_first_name(first_name)
    @first_name = first_name
  end

  def set_last_name(last_name)
    @last_name = last_name
  end

end