我想了解下面的方法究竟是如何工作的以及它在说什么,我知道它做了什么,但我想掌握它的确切工作方式。我想我理解= ||运营商,但我对如何在“如果”在等式的下半年工作并不清楚100%。红宝石Rails方法评估查询
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
的方法检查是否当前用户登录
要我理解它评估为真或假,但我不确定如何!
我想了解下面的方法究竟是如何工作的以及它在说什么,我知道它做了什么,但我想掌握它的确切工作方式。我想我理解= ||运营商,但我对如何在“如果”在等式的下半年工作并不清楚100%。红宝石Rails方法评估查询
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
的方法检查是否当前用户登录
要我理解它评估为真或假,但我不确定如何!
@current_user ||= User.find(session[:user_id]) if session[:user_id]
相当于
if session[:user_id]
if [email protected]_user
@current_user = User.find(session[:user_id])
end
@current_user
end
此表达导致
session[:user_id]
session[:user_id]
session[:user_id]
,但它的确如此不对应于DB中的任何现有用户。不用'if @ @ current_user',你可能想用'if @ current_user.nil?' –
不用担心,我在想如果OP在使用非布尔型变量时,对布尔型返回值会产生混淆,那么这将有助于避免这种表达式。我喜欢简化整个表达式的方式 - 除了'!'用法。 –
@WandMaker:顺便提一下,你提出的代码并不是'|| ='操作符实际做的事情。 :) –
它的基本意思是设置@current_user,但是如果它不存在,则设置当前用户(||=
部分)。接下来的部分是说,如果当前会话附有一个user_id,即if session[:user_id]
,则根据该user_id找到此会话的用户,并将它们存储在@current_user实例变量中。
希望帮助
贾斯汀
修饰符if在条件赋值之前被评估,即如果c'等于'(a || = b)则表达式'a || = b'如果c',而不是'a || =(b if c)'。 – Stefan
你的答案很难理解 - 你可能想再次阅读它,看看你是否想为了清晰起见而重新使用它。 –
有一个看看这篇文章[什么Ruby的|| =(双管/或等于)确实(http://www.rubyinside.com/what- ruby-double-pipe-or-equals-really-does-5488.html) –