红宝石-我们什么时候在Rails中使用“ || =”运算符? 它的意义是什么?
可能重复:
|| =操作符在红宝石中代表什么?
我对在Rails中使用||=
运算符感到困惑。 我在网络上找不到任何有用的信息。 谁能指导我?
请让我知道您是否知道任何网络链接。
我希望以下陈述意味着什么:
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
让我们分解一下:
@_current_user ||= {SOMETHING}
这就是说,如果它是User.find(session[:current_user_id])
、User.find(session[:current_user_id])
或未定义,则将&&
设置为session[:current_user_id]
。 否则,将其设置为@_current_user
,或者说什么也不做。 扩展形式:
@_current_user || @_current_user = {SOMETHING}
好的,现在到右侧。
session[:current_user_id] &&
User.find(session[:current_user_id])
您通常会看到&&
仅带有布尔值,但是在Ruby中,您不必这样做。 这里的技巧是,如果29840926064786886810不为nil,并且User.find(session[:current_user_id])
不为nil,则表达式的计算结果为User.find(session[:current_user_id])
091,否则为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
这是缓存功能。
a ||= 1 # a assign to 1
a ||= 50 # a is already assigned, a will not be assigned again
puts a
#=> 1
当您从数据库加载当前用户时,此功能很有用,如果此属性是在先加载的,则语句将不会尝试评估方程式的正确部分DRY,因此您可以将其视为缓存运算符。
参考:[http://railscasts.com/episodes/1-caching-with-instance-variables]
这是Ruby的“代码模式”。
a ||= b
是相同的
a = a || b
如果a为nil,它将a初始化为b。 如果我们要使用a的值,这很重要。 假设我们想要一个类似a ||= ""
的操作。如果a为零,该操作将失效,因此我们可以首先使用a ||= ""
。
如果您有C#的经验,我相信它与C#中的null-coalescing(??)运算符相似(但更多的是Ruby技巧)。
int? y = x ?? -1
如果x不为null,则将x分配给y,否则将使用“默认”值-1。
同样,|| =被称为T平方运算符。
a || = b
要么
a || a = b
来到你的声明
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
基本上,它会查看@_current_user是否为nil。 如果它具有某些值,则不要管它(当前用户)。否则,使用用户ID从会话中获取当前用户。 它首先查看ID是否在会话中,然后从User获取。
请查看下面的博客,以获取有关“ T平方”运算符的更多信息:
[HTTP://blogs.Oracle.com/PRA汕头/entry/他和_Ruby_他_square_operator]