Рубин должен использовать я. или @
Вот мой код ruby
class Demo
attr_accessor :lines
def initialize(lines)
self.lines = lines
end
end
В приведенном выше коде я мог бы использовать
@lines = lines
В основном я вижу людей, использующих метод инициализации @. Есть ли предпочтительный способ сделать среди этих двух и почему?
Ответы
Ответ 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
пусто).