无法访问类属性

时间:2018-11-03 19:00:05

标签: ruby

我做到了:

class Animal
  attr_accessor :color

  def color(color)
    @color = color
    # TODO: what should this method return?
  end

tiger =  Animal.new
tiger.color("red")
tiger.color

我希望不会看到"red",但是它表示给出了错误的参数数量。

如何查看tiger.color的值?如果color是initialize方法的一部分,是否可以只看到颜色,而不能看到其他属性?

2 个答案:

答案 0 :(得分:3)

因为是对的:您的color方法采用一个参数。您无需定义任何参数即可color。所以

def color
  @color
end

attr_reader :color

后者是相同的,但更为简洁。

最后一件事:您定义了setter方法,这没关系,但是命名法是错误的(或者至少是误导性的)。我建议

def color=(color)

并称呼他们

obj.color = color

答案 1 :(得分:1)

attr_accessor为您设置读取器和写入器方法。 attr_accessor :color等同于...

def color
  @color
end

def color=(value)
  @color = value
end

因此,您无需编写任何方法即可获取基本属性方法。

class Animal
  attr_accessor :name, :color, :species, :natural_habitat
end

请注意,设置器是thing=,被称为obj.thing = value而不是obj.thing(value)obj.thing = value确实是object.thing=(value)

tiger = Animal.new
tiger.color=(:red)
puts tiger.color    # red

tiger.color = :blue
puts tiger.color    # blue

最后,如果要将它们传递给new,则必须自己编写该部分,方法是定义initialize以接受参数并设置实例变量。

class Animal
  attr_accessor :name, :color, :species, :natural_habitat

  def initialize(name: , color:, species:, natural_habitat:)
    @name = name,
    @color = color,
    @species = species,
    @natural_habitat = natural_habitat
  end
end

tiger = Animal.new(
  name: "Hobbes",
  color: :orange,
  species: :tiger,
  natural_habitat: :jungle
)
puts tiger.color