Причина, по которой Ruby использует переменные экземпляра и методы доступа (с синтаксическим сахаром выглядит как будто вы получаете прямой доступ к свойствам), заключается в том, что вы можете проводить рефакторинг ваших классов и внешних потребителей вашего интерфейса
puts musicObj.minutes
не нужно знать, есть ли у вас внутри:
attr_accessor :minutes
или
def minutes
@seconds / 60.0
end
Это то же самое рациональное применение одинаково хорошо применимо к вашему собственному коду.Если у вас есть класс с 100 методами, которые все ссылаются на ваш @minutes
, и вы решаете, что вам действительно следует хранить @seconds
, вам нужно будет изменить 100 методов.С другой стороны, если бы вы использовали взамен minutes
(ваш «method_one»), ни один из ваших методов не нуждался бы в изменении.
Существует небольшое снижение производительности для использования нотации вызова метода вместопрямой доступ к переменной экземпляра.Если скорость критическая , вы можете рассмотреть возможность прямого доступа;в противном случае, я призываю вас есть ваш собственный корм для собак и использовать любые общедоступные интерфейсы, которые вы предоставляете, когда они существуют.
И, как ответил @Alex, вы должны использовать запись self.foo = 42
, когдавызывая метод 'setter', так как foo = 42
всегда будет устанавливать вместо него локальную переменную.