self.x
/ self.x=y
- это всегда вызовы метода.
(self.x
- это просто сахар для self.__send__(:x)
, а self.x = y
действительнопросто сахар для self.__send__(:x=, y)
)
@x
, с другой стороны, относится только к переменной экземпляра .
Использование @x
не будет работать с ассоциациями AR, поскольку AR определяет только x/x=
(, которые являются методами ) для его магической операции.(По сути, AR просто «захватывает» намеренный доступ через эти методы и направляет через свои собственные внутренние структуры данных, которые не связаны с любыми переменными экземпляра с аналогичным именем.)
attr_accessor
позволяет "обращаться к обоим путям" , потому что и только потому, что использует в качестве своей основы переменную экземпляра с тем же именем (она должна где-то хранить значение).Учтите, что attr_accessor :x
эквивалентно:
def x; @x; end
def x= (y); @x = y; end
Счастливого кодирования.