2011-04-17 18 views
31

Olası Çoğalt:
What does the operator ||= stands for in ruby?Rails'de "|| =" operatörünü ne zaman kullanıyoruz? Önemi nedir?

ben Rails ||= operatörün kullanımı ile karıştı. Web’de faydalı bir şey bulamadım. Lütfen bana rehberlik edebilir mi?

Farkında olduğunuz herhangi bir web bağlantısının olup olmadığını bana bildirin.

aşağıdaki deyimi ne anlama geldiğini istiyorum:

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

Bu, bir standart Ruby operatörü "Raylar" şey değildir. –

+0

@ The Tin Man - Katılıyorum. Teşekkürler . –

cevap

61

onu yıkmak Lets nil, false ise veya tanımlanmamışsa. Aksi halde @_current_user'a ayarlayın ya da başka bir deyişle hiçbir şey yapmayın. Genişletilmiş bir form: Şimdi sağ tarafta, şimdi. Tamam, şimdi sağ tarafta.

session[:current_user_id] && 
     User.find(session[:current_user_id]) 

Genellikle ancak Ruby bunu yapmak zorunda değilsiniz, boolean sadece değerlerle && görüyoruz. Burada hile session[:current_user_id] nil değilse ve User.find(session[:current_user_id]) nil değilse, ifade User.find(session[:current_user_id]) aksi takdirde sıfır olacaktır.

Yani sahte kodda hep birlikte koyarak: Bu yeteneklerini önbelleğe

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

Teşekkürler Mike. Bu çok açık hale getirir. –

+0

Sevindim @ mad.geek'e yardım edebilirim. İyi Şanslar :) Unutmayın, eğer bu doğru bir şekilde sorunuzu yanıtlamış gibi hissediyorsanız, doğru olarak işaretlediğinizden emin olun. –

+7

Pedantik olmak için, 'a || = b' aslında bir || a = b '. –

8

Bir Ruby "kod paterni" var.

a ||= b 

a = a || b 

Ve ne yapar başlatmak olduğu gibi aynı olan bir birnil olupeğer b için. değerini kullanacaksak bu önemlidir. a += " and more text" gibi bir işlem istediğimizi varsayalım. bir nil ise, bu ölecektir, bu yüzden önce kullanabiliriz. C# deneyiminiz varsa

+0

Teşekkürler! :) –

+0

'Ross' :)) – Aleks

+0

- np mon :)) - – DigitalRoss

1

, bunu

int? y = x ?? -1 

x x ise y atanan C# null kaynaşması (??) operatörü benzer (ama Ruby-trick daha fazlası) olduğuna inanıyoruz boş değil, aksi takdirde -1'in "varsayılan" değeri kullanılır.

Benzer şekilde, || = inanıyorum T kare operatör olarak adlandırılır.

a || = b 

veya

,

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

Temelde açıklamaya Coming @_current_user nil olup olmadığını da görür. Eğer bir değeri varsa, onu yalnız bırakın (mevcut kullanıcı). Diğerse, geçerli kullanıcıyı kullanıcı kimliğini kullanarak oturumdan alın. İlk önce kimliğin oturumda olup olmadığını ve ardından Kullanıcıdan geldiğini görür."T-kare" operatör üzerinde daha fazla bilgi için aşağıdaki blog

Görünüş: Bu söylediğini

@_current_user ||= {SOMETHING} 

, {SOMETHING} için @_current_user ayarlayın:

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 

bu önceki yüklü ise u DB'den geçerli kullanıcı yüklediğinizde bu faydalıdır, deyim KURU, bu nedenle u önbelleğe alma operatörü olarak düşünebilirsiniz denklemin, sağ kısmını değerlendirmek denemez.

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

İlgili konular