Ruby konusunda deneyimli değilim, bu yüzden kodum "çirkin" geliyor ve deyimsel değil:
def logged_in?
!user.nil?
end
Gibi bir şeyi tercih ederim
def logged_in?
user.not_nil?
end
Ama zıtlıkların olduğu böyle bir yöntem bulamıyorum nil?
Yanıtlar:
ActiveSupport kullanırken, yalnızca sıfır olmayanları kontrol etmek için user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-present%3F var , neden kullanmayasınız?
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
Booleanlarla fazlasıyla ilgileniyor gibisin.
def logged_in?
user
end
Kullanıcı nil ise, logged_in? bir "yanlış" değeri döndürür. Aksi takdirde, bir nesne döndürür. Ruby'de, JavaScript'te olduğu gibi "doğru" ve "yanlış" değerlere sahip olduğumuz için doğru veya yanlış döndürmemize gerek yoktur.
Güncelleme
Rails kullanıyorsanız, present?
yöntemi kullanarak bunu daha güzel bir şekilde okumasını sağlayabilirsiniz :
def logged_in?
user.present?
end
?
bir boole döndürmesidir. !!value
herhangi bir şeyi mantıksal değere dönüştürmenin klasik yoludur. Tam olarak aynı değil, ancak bu durumda Object#present?
RoR'da da iyi.
present?
Sorunuzun cevabı olarak sunulan diğer cevaplara dikkat edin .
present?
blank?
rayların tersidir .
present?
anlamlı bir değer olup olmadığını kontrol eder. Bunlar bir present?
kontrolde başarısız olabilir :
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
Bir !nil?
çek ise:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
bir nesnenin gerçekten olup olmadığını kontrol eder nil
. Başka herhangi bir şey: boş bir dize 0
,false
, neyse değildir nil
.
present?
çok kullanışlıdır, ancak kesinlikle tersi değildir nil?
. İkisini karıştırmak beklenmedik hatalara yol açabilir.
Kullanım durumunuz present?
işe yarayacaktır, ancak farkın farkında olmak her zaman akıllıca olacaktır.
false.blank?
ile aynı değilfalse.nil?
present?
veritabanınızı sorgulayacak nil?
, buna dikkat etmeyecek
Belki bu bir yaklaşım olabilir:
class Object
def not_nil?
!nil?
end
end
!self.nil?
daha ziyade olmamalı mı !nil?
yoksa self
üstü kapalı mı?
!
Yöntemden elde edilen sonuç üzerine Ruby-esque yöntemini sunabilir miyim nil?
?
def logged_in?
user.nil?.!
end
O kadar ezoterik ki RubyMine IDE bunu bir hata olarak işaretleyecektir. ;-)
Aşağıdakileri kullanabilirsiniz:
if object
p "object exists"
else
p "object does not exist"
end
Bu sadece nil için değil, aynı zamanda yanlış vb. İçin de işe yarar, bu nedenle kullanım durumunuzda işe yarayıp yaramadığını test etmelisiniz.
Bu soruya bir nesne yöntemi arayarak ulaştım, böylece bir blok yerine Symbol#to_proc
steno kullanabilecektim ; Ben arr.find(&:not_nil?)
biraz daha okunaklı buluyorum arr.find { |e| !e.nil? }
.
Bulduğum yöntem Object#itself
. Kullanımımda, anahtarın karma değerini bulmak istedim name
, bazı durumlarda bu anahtarın yanlışlıkla büyük harfle yazıldığı Name
. Bu tek satırlık şu şekilde:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
Diğer yanıtlarda da belirtildiği gibi , bu, bir mantıksal değeri test ettiğiniz durumlarda olağanüstü bir şekilde başarısız olacaktır.
my_hash.values_at("Name", "name").find
?
map
, bu örnekte basitlik sağlamak için çıkardığım başka bir mantığım vardı , bu nedenle burada yazıldığı gibi değiştirilebilir values_at
. Önemli olan, neyin aktarılacağıdır find
.
present?
boş olmayan bir dize gerektirir.! "".nil?
true döndürür, ancak"".present?
false döndürür.