在尝试创建 ruby 类的实例时获取 ArgumenError



我正在努力提高我的OO红宝石技能。我创建了一个类,当调用并尝试创建它的实例时,我收到错误。

这是代码。

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

当我加载我在上面写的文件并尝试创建此类的实例时

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方法在尝试实例化时需要多少个参数?一个参数还是没有参数?

我想

说,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

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

def set_first_name(name)
    @first_name = name
end
def set_last_name(name)
    @last_name = name
end

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

def initialize(name)
    set_name(name)
end

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

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

相关内容

  • 没有找到相关文章

最新更新