खाली नहीं: सरणी के लिए जाँच करें?


190

यदि विधि का उपयोग करके कोई सरणी खाली नहीं है, तो यह जांचना बुरा है any??

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

या इसका उपयोग करना बेहतर है unless a.empty??

जवाबों:


247

any?not empty?कुछ मामलों में ऐसा नहीं है ।

>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false

प्रलेखन से:

यदि ब्लॉक नहीं दिया जाता है, तो रूबी एक निहित ब्लॉक जोड़ता है {| obj | obj} (यह किसी भी है? अगर कम से कम संग्रह सदस्यों में से एक गलत या शून्य नहीं है तो यह सच होगा)।


8
क्या इसके विपरीत कोई कार्य है empty??
राकेट

12
@RocketR आप चेकआउट present?विधि करना चाह सकते हैं ।
दंतेता

15
@ डांटास्टिक #present?केवल रेल है। शुद्ध रूबी में आपको मिलेगा NoMethodError: undefined method 'present?' for Array
राकेट 21

6
केवल रेल-ही नहीं, सक्रिय समर्थन का उपयोग रेल के बिना किया जा सकता है, बस जरूरत है require 'activesupport'
सर्जियो ए।

83

किसी सरणी के बीच का अंतर उसके मानों का मूल्यांकन करता है 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

31

विस्मयादिबोधक चिह्न के साथ कथन को उपसर्ग करने से आपको पता चल जाएगा कि सरणी खाली नहीं है। तो आपके मामले में -

a = [1,2,3]
!a.empty?
=> true

27
दोहरा नकार? क्या आप गंभीर हैं?
एल्विस

29
वह इतना गंभीर नहीं है!
अलेक्जेंडर बर्ड

5
हेहे। दोहरा नकार आदर्श नहीं है, बस इस विशिष्ट मामले में अधिक पठनीय लगता है।
डेनी अब्राहम चेरियन

11
दोहरा नकारात्मक मूल प्रश्न "खाली नहीं चेक के लिए सरणी" का हिस्सा था। यह सवाल का जवाब देता है।
मैटफ़िट्ज़गेराल्ड

30

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?विधि की तरह है
डेविड कोस्टा

4

मैं उपयोग करने का सुझाव दूंगा unlessऔर blankजांचना खाली है या नहीं।

उदाहरण :

unless a.blank?
  a = "Is not empty"
end

इससे 'a ’खाली पता चलेगा या नहीं। यदि 'क' खाली है तो नीचे वाला कोड नहीं चलेगा।


4
#blank?रेल का हिस्सा है। यदि वे पहले से ही रेल का उपयोग कर रहे हैं, #present?तो #blank?वैसे भी नकारात्मक है ।
इवा

0

मुझे नहीं लगता कि इसका इस्तेमाल करना बुरा है 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 की आवश्यकता नहीं है। और इसे बनाना आसान है।

कुछ अतिरिक्त के बारे में सोचने के लिए:

  1. यह present?ActiveSupport से समान नहीं है ।
  2. आप एक कस्टम संस्करण चाहते हैं String, जो व्हाट्सएप को अनदेखा present?करता है (जैसे करता है)।
  3. आप अन्य प्रकारों के length?लिए नाम चाहते हैं Stringजहां यह अधिक वर्णनात्मक हो सकता है।
  4. आप इसे Integerऔर अन्य Numericप्रकारों के लिए कस्टम चाहते हैं , ताकि एक तार्किक शून्य रिटर्न हो false
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.