Ruby - где здесь определение атрибута? - PullRequest
0 голосов
/ 25 января 2012

Где здесь определен атрибут @color? Предположительно задание в конструкторе? Если это так, что, если тип имеет несколько конструкторов, один из которых не присваивает значение @color?

class Baz
  def initialize(color)
    @color = color
  end

  def color
    @color
  end

  def color=(value)
    @color = value
  end
end

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Переменные экземпляра в ruby ​​не «определены» как таковые. Они появляются, когда их используют.

Когда вы в первый раз назначаете что-то переменной экземпляра, это ближе всего к «определению» (но на самом деле это скорее «инициализация»). Если вы ссылаетесь на переменную экземпляра, которой еще не присвоено значение, ее значение будет nil.

Так что, если ваш конструктор не присваивает значение @color, то @color просто останется неинициализированным (и, таким образом, вернет nil в любом месте класса, который ссылается на него ..., если ему не назначено значение в другом месте вне конструктора).

Смотрите здесь для получения дополнительной информации: http://www.rubyist.net/~slagell/ruby/instancevars.html

Соответствующая цитата из статьи:

Переменные экземпляра не нужно объявлять. Это указывает на гибкая структура объекта; фактически каждая переменная экземпляра динамически добавляется к объекту при его первом назначении.

И

Как и в случае глобальных переменных, переменные экземпляра имеют значение nil до инициализируется.

2 голосов
/ 25 января 2012

что если тип имеет несколько конструкторов, один из которых не присваивает значение @ color

Что ж, тогда у этих экземпляров не будет переменной экземпляра @color, и операции с этой переменной, скорее всего, завершатся неудачей.

Надеюсь, хороший дизайн и тестирование сократят количество таких случаев до нуля, но это не тот язык, от которого сам язык защищает вас.

Обратите внимание, что в вашем конкретном примере это не должно быть проблемой, потому что единственными операциями являются установка (что явно хорошо) и получение, что также хорошо - извлечение переменных экземпляра вернет nil, если переменная никогда не была установлен.

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