Ruby self, приоритет оператора и вызов метода экземпляра - PullRequest
0 голосов
/ 31 октября 2018

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

  class Year
    attr_reader :number

    def initialize(number)
      @number = number
    end

   def a(str)
     puts str
   end

   def %(other)
     number % other # why number instead of @number
   end

   def my_func()
     (self a "hello") # error
   end

   private

   def divisible_by?(i)
     (self % i) == 0 #Operator precedence binding self and % together?
   end
end

Я хочу понять, почему:

  1. вызов (self % i) не требует пробела между self и %, я предполагаю, что это как-то связано с приоритетом оператора?

  2. Почему в определении метода для %(other) метод ссылается на number, я ожидал, что он должен ссылаться на переменную экземпляра @number.

Буду признателен за любую помощь и / или ссылки на рубиновые документы, которые помогут мне объяснить это. Ты заранее

1 Ответ

0 голосов
/ 31 октября 2018

почему number вместо @number

Поскольку вы определили читатель / получатель, вы можете использовать его. Сегодня метод number поддерживается переменной экземпляра, завтра он вычисляется (или лениво создается и т. Д.). Используя метод, а не его внутренние компоненты, вы защищаете себя от каскадных изменений. Это называется «инкапсуляция». Но вы могли бы использовать переменную, просто это не очень хорошая практика.

вызов (self% i) не требует пробела между self и%, я полагаю, это как-то связано с приоритетом оператора?

Нет. Ничего общего с приоритетом. В незаполненной форме не было никакой двусмысленности, и ruby ​​смог успешно ее проанализировать, поэтому он разрешен.

...