使用oop(类)时出错

时间:2015-02-18 19:35:42

标签: ruby

我刚开始使用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} !!!"""

我做错了什么?

3 个答案:

答案 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}!!!"""

我鼓励你试试。