尝试创建 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_name
和 set_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_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
在初始化方法中,您正在调用接受 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
我正在努力提高我的 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_name
和 set_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_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
在初始化方法中,您正在调用接受 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