जवाबों:
any?not empty?कुछ मामलों में ऐसा नहीं है ।
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
प्रलेखन से:
यदि ब्लॉक नहीं दिया जाता है, तो रूबी एक निहित ब्लॉक जोड़ता है {| obj | obj} (यह किसी भी है? अगर कम से कम संग्रह सदस्यों में से एक गलत या शून्य नहीं है तो यह सच होगा)।
present?विधि करना चाह सकते हैं ।
#present?केवल रेल है। शुद्ध रूबी में आपको मिलेगा NoMethodError: undefined method 'present?' for Array।
require 'activesupport'।
trueया यदि रिक्त है।विधि empty?ऐरे वर्ग से आती है
http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
यह देखने के लिए उपयोग किया जाता है कि सरणी में कुछ है या नहीं। इसमें ऐसी चीजें शामिल हैं जो मूल्यांकन करती हैं false, जैसे कि nilऔर false।
>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false
विधि any?Enumerable मॉड्यूल से आता है।
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
यह मूल्यांकन करने के लिए उपयोग किया जाता है कि क्या सरणी में "कोई" मूल्य का मूल्यांकन करता है true। इसके समान तरीके हैं none?, all?और one?, जहां वे सभी यह देखने के लिए जांचते हैं कि कितनी बार सच का मूल्यांकन किया जा सकता है। जो किसी सरणी में पाए गए मानों की गिनती से कोई लेना-देना नहीं है।
मामला एक
>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true
मामला 2
>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false
मामला 3
>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false
विस्मयादिबोधक चिह्न के साथ कथन को उपसर्ग करने से आपको पता चल जाएगा कि सरणी खाली नहीं है। तो आपके मामले में -
a = [1,2,3]
!a.empty?
=> true
any?बड़े सरणियों से बचें ।
any? है O(n)empty? है O(1)any? लंबाई की जाँच नहीं करता है लेकिन वास्तव में सत्य तत्वों के लिए पूरे सरणी को स्कैन करता है।
static VALUE
rb_ary_any_p(VALUE ary)
{
long i, len = RARRAY_LEN(ary);
const VALUE *ptr = RARRAY_CONST_PTR(ary);
if (!len) return Qfalse;
if (!rb_block_given_p()) {
for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue;
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
}
}
return Qfalse;
}
empty? दूसरी ओर केवल सरणी की लंबाई की जाँच करता है।
static VALUE
rb_ary_empty_p(VALUE ary)
{
if (RARRAY_LEN(ary) == 0)
return Qtrue;
return Qfalse;
}
अंतर प्रासंगिक है यदि आपके पास "विरल" सरणियां हैं जो बहुत सारे nilमूल्यों से शुरू होती हैं, उदाहरण के लिए एक सरणी जो अभी बनाई गई थी।
nilमूल्यों के साथ शुरू होती हैं, "सामान्य" सरणियों के any?बिना पहले तत्व पर ब्लॉक रिटर्न के साथ होती है, इसलिए जटिलता अभी भी ओ (1) empty?विधि की तरह है
मैं उपयोग करने का सुझाव दूंगा unlessऔर blankजांचना खाली है या नहीं।
उदाहरण :
unless a.blank?
a = "Is not empty"
end
इससे 'a ’खाली पता चलेगा या नहीं। यदि 'क' खाली है तो नीचे वाला कोड नहीं चलेगा।
#blank?रेल का हिस्सा है। यदि वे पहले से ही रेल का उपयोग कर रहे हैं, #present?तो #blank?वैसे भी नकारात्मक है ।
मुझे नहीं लगता कि इसका इस्तेमाल करना बुरा है any?। मैंने इसे बहुत इस्तेमाल किया है। यह स्पष्ट और संक्षिप्त है।
हालांकि अगर आप nilइसे फेंकने वाले सभी मूल्यों के बारे में चिंतित हैं , तो आप वास्तव में पूछ रहे हैं कि क्या सरणी है size > 0। उस स्थिति में, यह मृत सरल एक्सटेंशन (अनुकूलित नहीं, बंदर-शैली) आपको पास मिलेगा।
Object.class_eval do
def size?
respond_to?(:size) && size > 0
end
end
> "foo".size?
=> true
> "".size?
=> false
> " ".size?
=> true
> [].size?
=> false
> [11,22].size?
=> true
> [nil].size?
=> true
यह काफी वर्णनात्मक है, तार्किक रूप से पूछ रहा है "क्या इस वस्तु का आकार है?"। और यह संक्षिप्त है, और इसे ActiveSupport की आवश्यकता नहीं है। और इसे बनाना आसान है।
कुछ अतिरिक्त के बारे में सोचने के लिए:
present?ActiveSupport से समान नहीं है ।String, जो व्हाट्सएप को अनदेखा present?करता है (जैसे करता है)।length?लिए नाम चाहते हैं Stringजहां यह अधिक वर्णनात्मक हो सकता है।Integerऔर अन्य Numericप्रकारों के लिए कस्टम चाहते हैं , ताकि एक तार्किक शून्य रिटर्न हो false।
empty??