2011-04-17 68 views
31

可能重复:
What does the operator ||= stands for in ruby?什么时候在Rails中使用“|| =”运算符?它的意义是什么?

我很困惑与||=运营商的在轨使用。我找不到任何有用的网页。任何人都可以请指导我?

请让我知道是否有任何你知道的网站链接。

我想什么,下面的语句是指:

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

这是不是一个 “导轨” 的东西,它是一个标准的Ruby操作。 – 2011-04-17 04:47:00

+0

@锡匠 - 我同意。谢谢 。 – 2011-04-17 04:52:15

回答

61

让我们把它分解:

@_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]不是零,并且User.find(session[:current_user_id])不是零,则表达式将评估为User.find(session[:current_user_id])否则为零。

所以把他们放在一起在伪代码:

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 
+0

谢谢迈克。这很清楚。 – 2011-04-17 04:30:54

+0

很高兴我可以帮助@ mad.geek。祝你好运:)请记住,如果你觉得这个问题好像正确回答了你的问题,请确保你标记为正确。 – 2011-04-17 04:36:51

+7

要迂腐,'a || = b'实际上等价于'a || a = b'。 – 2011-04-17 04:48:24

8

这是一个红宝石“代码模式”。

a ||= b 

相同

a = a || b 

而且它的作用是初始化一个b如果一个。如果我们打算使用a的值,这很重要。假设我们需要像a += " and more text"这样的操作。如果a,那么将会死亡,所以我们可以首先使用a ||= ""

+0

谢谢老板:)) – 2011-04-17 04:42:21

+0

这是'Ross':)) – Aleks 2014-11-28 11:33:32

+0

- np mon :)) - – DigitalRoss 2016-01-15 23:25:06

1

如果你有C#经验,我相信这是类似(但更多的是Ruby的伎俩),以空 - 结合(?)运算符在C#

int? y = x ?? -1 

x被分配到y如果x不为空,否则使用-1的“默认”值。

同样,|| =被称为T平方算子,我相信。

a || = b 

来到你的陈述

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

基本上,它认为如果@_current_user是零或不是。如果它有一定的价值,就让它保持不变(当前用户)。否则,使用用户标识从会话中获取当前用户。它首先看到该ID是否在会话中,然后从用户获取。

看看下面的博客上的 “T-广场” 运营商的详细信息:

http://blogs.oracle.com/prashant/entry/the_ruby_t_square_operator

7

这是缓存的能力。

a ||= 1 # a assign to 1 
a ||= 50 # a is already assigned, a will not be assigned again 

puts a 
#=> 1 

当u从数据库加载当前用户,如果这是之前加载,这是有用的,语句不会尝试评估方程,干燥,因此美国可以把它作为高速缓存操作的右半部分。

REF: http://railscasts.com/episodes/1-caching-with-instance-variables

相关问题