我对Rails中||=
运算符的使用感到困惑。我在网上找不到任何有用的东西。有人可以指导我吗?
如果您有任何您知道的网络链接,请告诉我。
我想要以下陈述的含义:
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
答案 0 :(得分:77)
让我们分解:
@_current_user ||= {SOMETHING}
这就是说,如果它是@_current_user
,{SOMETHING}
或未定义,请将nil
设置为false
。否则将其设置为@_current_user
,换句话说,什么都不做。扩展形式:
@_current_user || @_current_user = {SOMETHING}
好的,现在在右边。
session[:current_user_id] &&
User.find(session[:current_user_id])
您通常会看到&&
仅使用布尔值,但在Ruby中您不必这样做。这里的诀窍是,如果session[:current_user_id]
不是nil且User.find(session[:current_user_id])
不是nil,则表达式将评估为User.find(session[:current_user_id])
,否则为nil。
所以把它们放在伪代码中:
if defined? @_current_user && @_current_user
@_current_user = @_current_user
else
if session[:current_user_id] && User.find(session[:current_user_id])
@_current_user = User.find(session[:current_user_id])
else
@_current_user = nil
end
end
答案 1 :(得分:12)
这是缓存技能。
a ||= 1 # a assign to 1
a ||= 50 # a is already assigned, a will not be assigned again
puts a
#=> 1
当你从DB加载当前用户时这很有用,如果这是先加载的,语句将不会尝试评估等式的右边部分,因为你可以将它视为缓存操作符。
REF: http://railscasts.com/episodes/1-caching-with-instance-variables
答案 2 :(得分:9)
这是一个Ruby“代码模式”。
a ||= b
与
相同a = a || b
如果 a nil ,它的作用是将 a 初始化为 b 。如果我们要使用 a 的值,这很重要。假设我们想要一个像 a += " and more text"
这样的操作。如果 a nil ,那将会死亡,因此我们可能首先使用 a ||= ""
。
答案 3 :(得分:2)
如果你有C#经验,我相信它与C#中的null-coalescing(??)运算符相似(但更多的是Ruby技巧)
int? y = x ?? -1
如果x不为空,则将指定给y,否则使用“默认”值-1。
同样,|| =被称为T-square算子我相信。
a || = b
或
a || a = b
来到你的陈述
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
基本上,它会看到@_current_user是否为零。如果它有一些值,请不要管它(当前用户。)否则,使用用户ID从会话中获取当前用户。它首先看到id是否在会话中,然后从用户获取。
请查看下面的博客,了解有关“T-square”运营商的更多信息:
http://blogs.oracle.com/prashant/entry/the_ruby_t_square_operator