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

时间:2011-04-17 04:05:21

标签: ruby operators

  

可能重复:
  What does the operator ||= stands for in ruby?

我对Rails中||=运算符的使用感到困惑。我在网上找不到任何有用的东西。有人可以指导我吗?

如果您有任何您知道的网络链接,请告诉我。

我想要以下陈述的含义:

@_current_user ||= session[:current_user_id] &&
      User.find(session[:current_user_id])

4 个答案:

答案 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

相关问题