Почему в учебнике Rails по Hartl (Rails 5, раздел 8.2.3) почему переменная экземпляра, определенная в методе, может быть вызвана без @? - PullRequest
1 голос
/ 28 сентября 2019

Я новичок, прорабатывая учебник Hartl по Rails 5, когда натолкнулся на этот запутанный код, перечисленный ниже.Похоже, что @current_user определяется внутри метода как переменная экземпляра, поэтому его можно использовать вне метода.Тем не менее, в logged_in?метод, символ @ не требуется для вызова.На самом деле, если я добавлю rewrite logged_in?чтобы использовать @current_user, он больше не работает как положено!

module SessionsHelper

  # Logs in the given user.
  def log_in(user)
    session[:user_id] = user.id
  end

  # Returns the current logged-in user (if any).
  def current_user
    if session[:user_id]
      @current_user ||= User.find_by(id: session[:user_id])
    end
  end

  # Returns true if the user is logged in, false otherwise.
  def logged_in?
    !current_user.nil?
  end
end

Когда я пытаюсь сделать это в ruby, я не могу использовать переменную экземпляра таким образом.Пример, который я попробовал, ниже.Когда я вызываю method2, я получаю ошибку, которая не исправлена, пока я не добавлю символ @ перед var1.Может ли кто-нибудь помочь мне понять это?Спасибо !!

def method1
    @var1 = 2
    @var1
end

def method2
    @var1 == 2
end

puts method1
puts method2

1 Ответ

0 голосов
/ 28 сентября 2019

current_user определяется как метод, а затем внутри метода определяется переменная экземпляра @current_user, которая используется только внутри метода.Метод logged_in? вызывает метод current_user, он не обращается напрямую к переменной @current_user.Обратите внимание, что в ruby ​​@, $ или @@ фактически являются частью имени переменной и не являются модификаторами .Следовательно, current_user и @current_user не являются одной и той же сущностью.

...