Невозможно получить доступ к атрибутам класса - PullRequest
0 голосов
/ 03 ноября 2018

Я сделал:

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? Можно ли увидеть только цвет, а не другие атрибуты, если цвет был частью метода инициализации?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

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
0 голосов
/ 03 ноября 2018

Потому что это правильно: ваш метод color принимает один параметр. Вам нужно определить color без параметров. Так

def color
  @color
end

или

attr_reader :color

последний такой же, но более лаконичный.

И последнее: вы определили методы установки, и это нормально, но номенклатура неверна (или, по крайней мере, вводит в заблуждение). Я предлагаю

def color=(color)

и назовите их как

obj.color = color
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...