用于在ruby中编写类的attr_accesor方法

时间:2018-08-03 02:03:07

标签: ruby

需要帮助,我想使用“ attr_accesor”方法来节省代码中的空间,并使用它代替“ get_value”和“ set_value”,但是如何?

如果代码是:

class Thing
    def initialize(aName, aDescription)
        @name = aName
        @description = aDescription
    end

    def get_name
        return @name
    end

    def set_name(aName)
        @name = aName
    end

    def get_description
        return @description
    end

    def set_description(aDescription)
        @description = aDescription
    end
end

class Treasure < Thing
    def initialize(aName, aDescription, aValue)
        super(aName, aDescription)
        @value = aValue.to_f
    end

    def get_value
        return @value
    end

    def set_value(aValue)
        @value = aValue.to_f
    end
end

t1 = Thing.new("Rock", "costless thing")
puts "Name: #{t1.get_name}"
puts "Description: #{t1.get_description}"

puts ""
puts "Treasure"
t2 = Treasure.new("Nugget", "A gold Nugget", "50000")
puts "Name: #{t2.get_name}"
puts "Description: #{t2.get_description}"
puts "Value: #{t2.get_value}"

您能告诉我们如何使用attr_accesor方法重写Thing和Treasure类吗?

2 个答案:

答案 0 :(得分:1)

您只需将它们添加到您的类定义中,对于Thing类,您需要添加

attr_accessor :name, :description

对于您需要的Treausre类,

attr_accessor :value

,它将在您的类中公开getter和setter方法,

如果您只需要定义getter或setter,则可以使用以下内容,

attr_reader -> getter method
attr_writer -> setter method

您的班级现在应该看起来像

class Thing
  attr_accessor :name, :description

  def initialize(name, description)
    @name = name
    @description = description
  end
end

class Treasure < Thing
  attr_accessor :value

  def initialize(name, description, value)
    super(name, description)
    @value = value.to_f
  end
end

现在您可以做类似的事情

t1 = Thing.new("Rock", "costless thing")
puts "Name: #{t1.name}"
puts "Description: #{t1.description}"

puts ""
puts "Treasure"
t2 = Treasure.new("Nugget", "A gold Nugget", "50000")
puts "Name: #{t2.name}"
puts "Description: #{t2.description}"
puts "Value: #{t2.value}"

答案 1 :(得分:1)

attr_accessor只不过是为您定义这些getter和setter方法的快捷方式。

此:

attr_accessor :index

从字面上将为您执行此操作,而无需任何其他代码:

def index
  return @index
end

def index=(value)
  @index = value
end

如果您熟悉C语言,可以将其视为无需额外输入即可为您定义基本getter和setter的宏。如前所述,attr_reader仅会定义一个吸气剂,attr_writer仅会定义一个吸气剂,而attr_accessor会同时定义一个吸气剂。

请注意,所有这些都不会简单地通过将实例变量@index放在代码中来定义,这仍然需要在代码的其他位置(例如{{1})中的@index = -1进行定义。 }方法(或代码中最合适的位置),如果您需要一个“默认”值。