可能重复:
运算符|| =在ruby中代表什么?
我||=对Rails 中运算符的使用感到困惑.我在网上找不到任何有用的东西.有人可以指导我吗?
如果有任何您知道的网络链接,请告诉我.
我想要以下声明的含义:
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
Run Code Online (Sandbox Code Playgroud)
Mik*_*wis 81
让我们分解一下:
@_current_user ||= {SOMETHING}
Run Code Online (Sandbox Code Playgroud)
这是说,设定@_current_user到{SOMETHING}如果是nil,false或不确定.否则设置为@_current_user,或换句话说,什么也不做.扩展形式:
@_current_user || @_current_user = {SOMETHING}
Run Code Online (Sandbox Code Playgroud)
好的,现在在右侧.
session[:current_user_id] &&
User.find(session[:current_user_id])
Run Code Online (Sandbox Code Playgroud)
您通常&&只看到布尔值,但在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
Run Code Online (Sandbox Code Playgroud)
c2h*_*2h2 13
这是缓存技能.
a ||= 1 # a assign to 1
a ||= 50 # a is already assigned, a will not be assigned again
puts a
#=> 1
Run Code Online (Sandbox Code Playgroud)
当你从DB加载当前用户时,这是有用的,如果这是先加载的,语句将不会尝试评估等式的正确部分,哪个DRY,因此你可以将其视为缓存操作符.
参考:http: //railscasts.com/episodes/1-caching-with-instance-variables
这是一个Ruby"代码模式".
a ||= b
Run Code Online (Sandbox Code Playgroud)
是相同的
a = a || b
Run Code Online (Sandbox Code Playgroud)
而它的作用是初始化一个到b,如果一个是零.这是很重要的,如果我们要使用的值一个.假设我们想要一个类似的操作a += " and more text".这将死,如果一个是零,所以我们可能会使用a ||= ""第一.
如果您有 C# 经验,我相信它与 C# 中的空合并 (??) 运算符类似(但更像是 Ruby 技巧)
int? y = x ?? -1
Run Code Online (Sandbox Code Playgroud)
如果 x 不为空,则将 x 分配给 y,否则使用“默认”值 -1。
同样,我相信 ||= 被称为 T 方运算符。
a || = b
Run Code Online (Sandbox Code Playgroud)
或者
a || a = b
Run Code Online (Sandbox Code Playgroud)
来到你的陈述
@_current_user ||= session[:current_user_id] &&
User.find(session[:current_user_id])
Run Code Online (Sandbox Code Playgroud)
基本上,它查看@_current_user 是否为零。如果它有一些价值,就不要管它(当前用户)。否则,使用用户 ID 从会话中获取当前用户。它首先查看 id 是否在会话中,然后从用户那里获取。
查看下面的博客,了解有关“T-square”运算符的更多信息:
http://blogs.oracle.com/prashant/entry/the_ruby_t_square_operator