Каков обычный способ доступа к переменным экземпляра внутри объекта в Ruby? - PullRequest
1 голос
/ 18 января 2011

Рассмотрим следующий код:

class Dog
  attr_accessor :name, :color

  def initialize(name, color)
  end
end

Внутри объекта Ruby существует соглашение о прямом доступе к переменной экземпляра (например, @name = name) или использовании методов установки / получения (например, name = name).)?

Первый вариант для меня более понятен, но если вы реализуете свои собственные методы установки / получения (например, для одновременного увеличения переменной класса), то в конечном итоге вам придется использовать оба подхода (т.е. @name = name ; color = color).

Что такое соглашение в сообществе Ruby?Как мне написать свой код, чтобы он был понятен другим, кто будет его читать?

Ответы [ 3 ]

6 голосов
/ 18 января 2011

Использование name = value является ошибкой, поскольку при этом создается локальная переменная с именем name.Вы должны использовать self.name = value.

Что касается соглашения, вы можете отказаться от использования @name, только если можете гарантировать, что средства доступа всегда будут легкими attr_accessor с.Во всех других случаях использование @name сверх self.name нарушит инкапсуляцию и вызовет головную боль.Вы указали точную причину в своем вопросе - если в getter / setter есть дополнительная логика, вы должны дублировать ее, если вы обращаетесь к переменной экземпляра напрямую.

1 голос
/ 18 января 2011

Я считаю, что то, что вы сделали, - самый обычный способ.

На самом деле attr_accessor создает два метода экземпляра для чтения и записи.Он создает 2 метода, таких как:

def color() #getter
  @color
end

и

def color=(color) #setter
  @color = color
end

И что-то вроде color = color не сработает, потому что тогда цвет будет рассматриваться как локальная переменная, если он найден слеваназначения.Вы можете использовать self.color = color, хотя.Опять же, если цвет не находится в левой части какого-либо выражения, он будет работать нормально, как показано ниже:

def show_color
  puts color
end
1 голос
/ 18 января 2011

Это будет @name.Это больше, чем просто соглашение.Знак @ определяет область действия переменной с точностью до экземпляра объекта, для которого она определена.

...