我刚开始使用ruby
,刚刚开始学习oop
,在上课后,我正在尝试打印到控制台,但我一直收到此错误。有谁知道什么是错的?
未定义的方法`set_brand_name =' #(NoMethodError)
以下是导致此错误的代码:
class Laptop
def set_brand_name(brand_name)
@brand = brand_name
end
def get_brand_name
return @brand
end
def set_color(color)
@color = color
end
def get_color
return @color
end
def set_processor(processor)
@processor = processor
end
def get_processor
return @processor
end
def set_storage(hard_drive)
@storage = hard_drive
end
def get_storage
return @storage
end
def set_memory(ram)
@memory = ram
end
def get_memory
return @memory
end
end
my_laptop = Laptop.new
my_laptop.set_brand_name = "HP"
my_laptop.set_processor = 'i7-4700k'
my_laptop.set_memory = '16gb'
my_laptop.set_storage = '750gb'
my_laptop.set_color = 'Silver'
brand = my_laptop.get_brand_name
color = my_laptop.get_color
processor = my_laptop.get_processor
memory = my_laptop.get_memory
storage = my_laptop.get_storage
这应输出消息:
"""我想要的笔记本电脑是#{品牌},它有一个#{处理器}, ram的#{memory},#{storage},#{color} !!!"""
我做错了什么?
答案 0 :(得分:1)
问题是你没有调整方法名称,因为你已经定义了它们。您定义了set_brand_name
没有等号,因此请使用:
my_laptop.set_brand_name("HP")
我只想得到这样的吸气剂和装置者:
class Laptop
def brand_name=(brand_name)
@brand_name = brand_name
end
def brand_name
@brand_name
end
end
甚至更好:
class Laptop
attr_accessor :brand_name
end
然后你可以用同样的方式使用它:
my_laptop = Laptop.new
my_laptop.brand_name = "HP"
puts my_laptop.brand_name # => "HP"
答案 1 :(得分:1)
在第45行中,您正在调用方法set_brand_name=
,但您的Laptop
类没有具有该名称的方法。您需要调用做所拥有的方法(set_brand_name
),或将set_brand_name
方法重命名为set_brand_name=
。
请注意,这两者都不是惯用语。在惯用法中,该方法应命名为brand_name=
(没有set_
前缀,=
符号已隐含“设置”部分),您不应手动定义,但以编程方式使用Module#attr_writer
方法。
您的整个代码可以压缩为:
Laptop = Struct.new(:brand_name, :color, :processor, :storage, :memory)
my_laptop = Laptop.new('HP', 'Silver', 'i7-4700k', '750gb', '16gb')
brand = my_laptop.brand_name
color = my_laptop.color
processor = my_laptop.processor
memory = my_laptop.memory
storage = my_laptop.storage
puts "The Laptop I want is an #{brand}, it has a #{processor}, #{memory} of ram, a #{storage}, and it's #{color}!!!"
答案 2 :(得分:1)
您的setter方法定义不正确。
以下是您对set_brand_name
方法的定义:
def set_brand_name(brand_name)
@brand = brand_name
end
以下是你如何称呼它:
my_laptop.set_brand_name = "HP"
您正在正确调用该方法。如果您想保留您的定义,您应该这样称呼它:
my_laptop.set_brand_name("HP")
或者,如果你想使用等号,你应该像这样定义你的方法:
def set_brand_name=(brand_name)
@brand = brand_name
end
注意方法定义中的equals?当您希望setter看起来像常规作业时,您需要使用它。
但是,对于大多数琐碎的案例,您不需要手动定义getter和setter。您可以在类上使用attr_accessor
并将其传递给您要定义的属性。以下是attr_accessor
:
class Laptop
attr_accessor: :brand_name, :color, :processor, :storage, :memory
end
my_laptop = Laptop.new
my_laptop.brand_name = "HP"
my_laptop.processor = 'i7-4700k'
my_laptop.memory = '16gb'
my_laptop.storage = '750gb'
my_laptop.color = 'Silver'
brand = my_laptop.brand_name
color = my_laptop.color
processor = my_laptop.processor
memory = my_laptop.memory
storage = my_laptop.storage
puts """The Laptop I want is an #{brand}, it has a #{processor},
#{memory} of ram, a #{storage}, and it #{color}!!!"""
我鼓励你试试。