Possible Duplicate:
What does the operator ||= stands for in ruby?

我对Rails中||=运算符的用法感到困惑.我在网上找不到任何有用的东西.谁能给我指路吗?

如果你知道有任何网络链接,一定要告诉我.

我想知道下面这句话的意思:

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

推荐答案

让我们把它分解一下:

@_current_user ||= {SOMETHING}

也就是说,如果是nilfalse或未定义,则将@_current_user设置为{SOMETHING}.否则,将其设置为@_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

Ruby相关问答推荐

删除带括号的子表达式

有人可以解释 Ruby 在块中使用管道字符吗?

确保 Capybara 不存在元素

为什么 Ruby 中的 `a = a` `nil`?

在 YAML 变量中包含 jekyll / liquid 模板数据?

使用正则表达式在第一个逗号之前提取文本

Rails - RSpec - let和let!之间的区别

如何用 Ruby 覆盖 shell 中的打印行?

仅针对特定参数的 Rspec 存根方法

将 Ruby 哈希转换为 YAML

如何在 ruby​​ 中针对正则表达式测试整个字符串?

如何在Ruby中获取终端窗口的宽度

Ruby 多维数组

使用 Ruby,我如何迭代一个 for 循环 n.times

将数组分成 n 组 m 大小?

Ruby数组限制方法

条件子句中的赋值是好的Ruby风格吗?

如何在课堂上使用 Enumerable mixin?

当我将参数传递给脚本时,使用 gets() 会出现没有这样的文件或目录错误

如何在器上下文中运行 ruby​​ 脚本?