2011-09-26 471 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表達式是相等的。

希望這有助於更好地理解||=運營商。