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

可能重复:
|| =操作符在红宝石中代表什么?

我对在Rails中使用||=运算符感到困惑。 我在网络上找不到任何有用的信息。 谁能指导我?

请让我知道您是否知道任何网络链接。

我希望以下陈述意味着什么:

@_current_user ||= session[:current_user_id] &&
      User.find(session[:current_user_id])
geeky_monster asked 2020-07-26T22:44:16Z
4个解决方案
81 votes

让我们分解一下:

@_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
Mike Lewis answered 2020-07-26T22:45:02Z
13 votes

这是缓存功能。

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]

c2h2 answered 2020-07-26T22:45:31Z
9 votes

这是Ruby的“代码模式”。

a ||= b

是相同的

a = a || b

如果a为nil,它将a初始化为b。 如果我们要使用a的值,这很重要。 假设我们想要一个类似a ||= ""的操作。如果a为零,该操作将失效,因此我们可以首先使用a ||= ""

DigitalRoss answered 2020-07-26T22:46:00Z
2 votes

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

manojlds answered 2020-07-26T22:46:51Z
translate from https://stackoverflow.com:/questions/5691390/when-do-we-use-the-operator-in-rails-what-is-its-significance