2011-09-26 393 views
8

我在我的应用程序位指示保护的方法|| =是什么意思?

def current_user 
    @current_user ||= User.find_by_id(session[:user_id]) 
end 

我想知道什么||=手段? 我一直在努力寻找和发现,但无济于事。

+0

不知道该名称是否适用,但在C#中被称为空合并运算符http://msdn.microsoft.com/en-us/library/ms173224.aspx – kenny

+0

谢谢大家帮助我,让我在正确的方向! – pka

+3

重复:[在Ruby中'|| ='是什么意思?](http://StackOverflow.Com/q/995593/),[在Ruby中'|| ='是什么意思?](http:// StackOverflow (http://stackOverflow.Com/q/3945711/),[在Ruby变量赋值中的双重管道符号?](http://q/3800957 /),[红宝石中的'|| ='是什么? /StackOverflow.Com/q/4500375/),[“|| ='”操作数在Ruby中的含义是什么](http://StackOverflow.Com/q/5124930/),[什么是“||” ='意味着在Ruby语言中?](http://StackOverflow.Com/q/5230162/),[是红宝石运算符'|| ='智能?](http://StackOverflow.Com/q/2989862/)也许还有其他许多人。 –

回答

11

基本上,a ||= b表示assign b to a if a is null or undefined or false (i.e. false-ish value in ruby),它是a = b unless a的快捷方式。

+1

还可以查看[Ruby编程/语法/运算符]上的*条件赋值*(http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Operators#1._Assignment)。 – rdvdijk

+1

重要的是要实现短路 - 如果'a'为'false-ish','b'不会运行(例如,通过不进行昂贵的db查询节省时间)。 –

+1

它不是'a = b除非a'。请参阅http://www.rubyinside.com/what-rubys-double-pipe-or-equals-really-does-5488.html以更好地了解其实际工作原理。 – Sigurd

3

|| =是一个红宝石成语。这意味着如果@current_user是零(或false),然后尝试通过id找到它并将其分配给@current_user,否则什么都不做。

请参阅这些relatedquestions

3

这是Ruby的一部分。

如果@current_user是零还是假的,它将被a += b,这相当于a = a + b设置为User.find_by_id(session[:user_id])

0

通知的相似之处。因此a ||= b相当于a = a || b。正如其他人所提到的,这与a = b unless a相同。

+1

事实上,如果'a'不是'false-ish',那么Ruby不应该分配,以便'a = a || b'不严格等同于'a = b除非a'。有人可能会特别想到,例如'a'碰巧是一个'Hash'。 – Romain

+0

不,它已经在SO上多次讨论过了,几十次在Ruby邮件列表中,并且在无数博客文章中几百次。 –

+0

哦,对。你能否举个例子说明什么时候不是这种情况? – grifaton

0

ruby​​'a || = b'被称为“或 - 等于”运算符。如果a的布尔值为true(如果它既不是假也不是nil),它就是a的简短方式。如果不是,则它的值为b。

0

基本上,|| = B意味着分配B到A,如果是空的或未定义的或 假(在红宝石即假肥胖型值),它是一个快捷方式A = B,除非 一个。

份额|回答09月26日'11编辑在14:48

罗曼6,9711330

除了这个答案here`s一个例子 -

arr = nil || [] 
arr0 ||= [] 

arr <=> arr0 *#=> 0* 

这意味着表达式和arr0表达式是相等的。

希望这有助于更好地理解||=运营商。