0

我正在努力提高我的 OO Ruby 技能。我创建了一个类,当调用并尝试创建它的 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

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

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

4

3 回答 3

1

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

def set_first_name(name)
    @first_name = name
end

def set_last_name(name)
    @last_name = name
end
于 2015-06-11T08:19:15.130 回答
1

我想说,错误number of arguments (1 for 0)是由您的set_first_nameandset_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
于 2015-06-11T08:19:17.463 回答
1

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

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 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
于 2015-06-11T08:40:38.503 回答