ruby-on-rails - Ruby 中方法名与@的混淆

【字号: 日期:2022-10-18浏览:17作者:雯心

问题描述

module SessionsHelper . . . # Returns the user corresponding to the remember token cookie def current_user if (user_id = session[:user_id]) @current_user ||= User.find_by(id: user_id) elsif (user_id = cookies.signed[:user_id]) user = User.find_by(id: user_id) if user && user.authenticated?(cookies[:remember_token])log_in user@current_user = user end end end # Returns true if the user is logged in, false otherwise def logged_in? !current_user.nil? end # Logs out the current user def log_out forget(current_user) session.delete(:user_id) @current_user = nil endend

最后两个 def 中的 current_user 到底指的是什么?是上面定义的 current_user 方法吗?而以上代码中的 @current_user 又指的是什么?感觉有点混淆了,求解答。

问题解答

回答1:

@current_user 是一个实例变量,current_user是这个module中的方法,最后两个方法调用current_user是指调用上面的current_user这个方法。 在同一个类中实例方法直接是可以直接用方法名来实现调用的。@current_user是current_user方法中的一个返回值。最后两个方法调用current_user方法,实际就是得到实例变量@current_user.

回答2:

@current_user 是全局类的变量,current_user 是方法名,在ruby中对方法的调用可以省略(),所以初学者容易混淆,@current_user 的值是nil(@xxx 初始化的值为nil)或者current_user返回的值。

回答3:

补偿一下,current_user实际上代指current_user这个方法返回的@current_user实例变量。因为这里我们获得的是current_user调用后的返回值。

相关文章: