Соглашение по синтаксису переменной экземпляра Ruby - PullRequest
2 голосов
/ 24 ноября 2011

Что такое соглашение Ruby для ссылки на переменные экземпляра внутри метода экземпляра?

Рассмотрим следующие варианты:

def MyClass
    attr_accessor :q

    def initialize(z)
        @q = z
    end

    def method_one
        puts q
    end

    def method_two
        puts @q
    end

    def method_three
        puts self.q
    end
end

Какое соглашение q, @q или self.q является предпочтительным?

Ответы [ 2 ]

4 голосов
/ 24 ноября 2011

Причина, по которой 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 всегда будет устанавливать вместо него локальную переменную.

3 голосов
/ 24 ноября 2011

self.q используется при установке переменной

self.q = 'Some value.'

, тогда как q используется при получении переменной

puts q
do_something_with_variable(q)

Конечно, это чисто условности. Вы можете заменить self.q на q, когда получит переменную в любое время (хотя рекомендуется согласованность).

Я нахожу это обсуждение весьма поучительным в отношении использования @q.

...