Подтвердить что ты не робот

Рубин должен использовать я. или @

Вот мой код ruby ​​

class Demo
  attr_accessor :lines

  def initialize(lines)
    self.lines = lines
  end
end

В приведенном выше коде я мог бы использовать

    @lines = lines

В основном я вижу людей, использующих метод инициализации @. Есть ли предпочтительный способ сделать среди этих двух и почему?

4b9b3361

Ответ 1

Когда вы используете @lines, вы получаете доступ к самой переменной экземпляра. self.lines действительно проходит через метод lines класса; Аналогично, self.lines = x проходит метод lines=. Поэтому используйте @, если вы хотите получить доступ к переменной напрямую, и self., когда вы хотите получить доступ с помощью метода.

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

Ответ 2

self.lines - это метод, @lines - это переменная экземпляра. В вашем конструкторе вы захотите использовать self.lines, я бы сказал, но это для обсуждения. На самом деле это просто стилистическая разница. Если вы хотите более глубокое обсуждение прямого или косвенного доступа к переменным, прочитайте главу из лучших образцов практики Kent Beck Smalltalk.

Ответ 3

Я думаю, что есть небольшая разница, о которой еще не упоминалось. Переменная экземпляра @lines может быть доступна только внутри класса.

class Foo
 def initialize
   @lines = 1
 end
end

foo = Foo.new
foo.lines
>> NoMethodError: undefined method `lines' for #<Foo:0x1017cfb80 @lines=0>
foo.send(:lines)
>> 1

Если вы определяете attr_accessor: lines, все экземпляры этого класса могут обращаться к переменной строк:

class Foo
 attr_accessor :lines
 def initialize
   self.lines = 1
 end
end

foo = Foo.new
foo.lines
>> 1

Если вы хотите, чтобы ваша переменная была доступна для всех экземпляров, вы должны использовать attr_accessor.

Ответ 4

Основное отличие заключается в том, что вы переопределили lines= для выполнения чего-то другого, кроме @lines = lines.

Например, вы можете добавить проверку на атрибут (например, повышение, если lines пусто).