2011-04-17 32 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

相關問題