我正在努力提高我的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_name
和set_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_name
和set_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