我下面ruby on rails教程由迈克尔·哈特尔和他是如何使用赋值运算符中,如果condintion我不明白:Ruby on Rails的教程,如果(USER_ID =会话[:USER_ID])
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
end
可有人请解释它背后的逻辑?
我下面ruby on rails教程由迈克尔·哈特尔和他是如何使用赋值运算符中,如果condintion我不明白:Ruby on Rails的教程,如果(USER_ID =会话[:USER_ID])
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
end
可有人请解释它背后的逻辑?
这是Ruby的语法糖之一。
红宝石让你在条件语句分配变量,并返回到
user_id = session[:user_id]
if user_id
@current_user ||= User.find_by(id: user_id)
end
值
x = true #=> returns true
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
end
相当于为您节省了线。 如果session[:user_id]
是虚假的,它会将假值赋给user_id
并且不执行该块。
您可以在if
语句中使用赋值运算符,因为赋值是一个表达式。赋值表达式的结果是您分配的值。
在这种情况下,如果session[:user_id]
不是nil
或false
,该if
分支的结果将被调用,user_id
将被设置为session[:user_id]
结果。如果session[:user_id]
是nil
或false
它仍将被分配到user_id
,但if
内的逻辑将不会评估。
我相信这就是赋值运算符试图说...这是说如果@current_user值为空,然后设置等于user_id。否则,请保留@current_user值。你可以把它读作@current_user = @current_user || User.find_by(id: user_id)
这相当于这样做:
user_id = session[:user_id]
if user_id
@current_user ||= User.find_by(id: user_id)
end
这不完全相同。在第一个例子中,user_id的作用域就是if的主体。在后者中,user_id是在if之后定义的。 – Ursus
@Ursus:错误。试试irb。 '如果'不是Ruby中的范围门。无论何时定义类,模块或方法,都会创建一个新的作用域。在这里阅读Scope Gate部分的更多内容 - http://hopsoft.github.io/blog/ruby-metaprogramming-idioms/ – kiddorails
在回答之前,我在irb中尝试过。嗯。 – Ursus