我们什么时候在Rails中使用"|| ="运算符?它的意义是什么?

gee*_*ter 43 ruby operators

可能重复:
运算符|| =在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)

  • 要迂腐,`a || = b`实际上相当于`a || a = b`. (8认同)

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


Dig*_*oss 9

这是一个Ruby"代码模式".

a ||= b
Run Code Online (Sandbox Code Playgroud)

是相同的

a = a || b
Run Code Online (Sandbox Code Playgroud)

而它的作用是初始化一个b,如果一个.这是很重要的,如果我们要使用的值一个.假设我们想要一个类似的操作a += " and more text".这将死,如果一个,所以我们可能会使用a ||= ""第一.

  • -1. 这个答案实际上并不正确。`a ||= b` 不等价于 `a = a || 乙`。请参阅 http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html 甚至已接受的答案。这是一个普遍的误解。接受的答案实际上是正确的。`a ||= b` 等价于 `a || a = b`,即如果 `a` 不是 *falsy*(`false` 或 `nil`),则将 `a` 设置为 `b` 的值。 (2认同)

man*_*lds 5

如果您有 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