रूबी में शून्य बनाम खाली बनाम खाली कैसे समझें


1129

मैं अपने आप को बार-बार के मतभेदों की स्पष्ट परिभाषा की तलाश में लगता है nil?, blank?और empty?पर रूबी में। यहाँ मैं आया हूँ निकटतम:

  • blank?ऑब्जेक्ट झूठे, खाली या एक व्हाट्सएप स्ट्रिंग हैं। उदाहरण के लिए, "", " ", nil, [], और {}खाली कर रहे हैं।

  • nil? ऑब्जेक्ट्स NilClass के उदाहरण हैं।

  • empty?ऑब्जेक्ट क्लास-विशिष्ट हैं, और परिभाषा क्लास से क्लास तक भिन्न होती है। यदि कोई वर्ण नहीं है, तो एक स्ट्रिंग खाली है, और यदि कोई आइटम नहीं है, तो एक सरणी खाली है।

क्या कुछ भी गायब है, या एक तंग तुलना की जा सकती है?


26
एक गेटा एक खाली सरणी है, जिसके लिए गलत रिटर्न है present?। ऐसा इसलिए है क्योंकि blank?खाली सरणी के लिए रिटर्न सही है।
क्रिश

4
एक अच्छी बात यह है यह देखने के लिए कि है :nil?पर परिभाषित किया गया है ::Kernelऔर पर ओवरराइट ::NilClassजबकि, :empty?कई वर्गों पर अलग से कार्यान्वित किया जाता है (मूल रूप से पर ::String, ::Array, ::Hash, और गैर देशी रूप की तरह अन्य वर्गों पर ::Setstdlib से और ::ActiveRecord::Relationरेल से)। तो :nil?सभी उपवर्गों में ::Objectऔर प्रत्येक वर्ग में भी उपलब्ध है ::Kernelजो अपने आप में शामिल है, जहाँ :empty?इसे लागू किया जाना चाहिए या विशेष रूप से आपकी कक्षाओं में शामिल किया जाना चाहिए।
फिर से लिखा

यदि आप पूरी nilअवधारणा को समझने की कोशिश यहाँ से शुरू करते हैं
तात्यामेली

[1] pry(main)> [].blank? => true
माइकल

जवाबों:


1437

.nil? किसी भी वस्तु पर इस्तेमाल किया जा सकता है और यह सत्य है यदि वस्तु शून्य है।

.empty? तार, सरणियों और हैश पर इस्तेमाल किया जा सकता है और अगर सही है:

  • स्ट्रिंग की लंबाई == 0
  • ऐरे की लंबाई == ०
  • हैश की लंबाई == 0

.empty?शून्य है कि कुछ पर चल रहा है एक फेंक देंगे NoMethodError

यह वह जगह है जहां .blank?यह रेल द्वारा कार्यान्वित किया जाता है और किसी भी वस्तु पर काम करेगा और साथ ही .empty?तार, सरणियों और राख पर काम करेगा ।

nil.blank? == true
false.blank? == true
[].blank? == true
{}.blank? == true
"".blank? == true
5.blank? == false
0.blank? == false

.blank? उन स्ट्रिंग्स पर भी सही मूल्यांकन करता है जो गैर-रिक्त हैं लेकिन उनमें केवल व्हाट्सएप शामिल हैं:

"  ".blank? == true
"  ".empty? == false

रेल भी प्रदान करता है .present? , जो की नकारात्मकता लौटाता है .blank?

ऐरे गेचा: एरे के सभी तत्व खाली होने blank?पर falseभी वापस आ जाएंगे । इस मामले में ख़ालीपन, उपयोग यह निर्धारित करने के साथ , उदाहरण के लिए:all?blank?

[ nil, '' ].blank? == false
[ nil, '' ].all? &:blank? == true 

27
जैसा कि प्रश्न में उल्लेख किया गया है, कुछ गैर-रिक्त तार रिक्त के रूप में गिने जाते हैं।
एंड्रयू ग्रिम

1
उन्होंने नील के .empty को अधिलेखित क्यों नहीं किया है? अगर वे जोड़ सकते हैं।
मरदा

6
इसके अलावा:false.blank? == true
शैनन

2
मैं उल्लेख करूँगा presence!
मार्क-आंद्रे लाफोर्ट

2
टॉम ने अपने जवाब में जिस ऑल-ब्लैंक ऐरे गैचा का जिक्र किया है, उसके अतिरिक्त, इस बात से अवगत रहें कि इससे सुरक्षा संबंधी समस्याएं हो सकती हैं, जहां एक हमलावर बिना कोड वाले कोड का उपयोग कर सकता है, जब तक कि params.nil की जाँच नहीं हो जाती? या जब तक params.blank ?, और वर्तमान में रेल में बहुत चर्चा और काम का कारण है। अधिक जानकारी के लिए यहां देखें: github.com/rails/rails/issues/13420
Houen

675

मैंने सभी मामलों के साथ यह उपयोगी तालिका बनाई:

यहां छवि विवरण दर्ज करें

blank?, present?रेल द्वारा प्रदान की जाती हैं।


57
यह ध्यान दिया जाना चाहिए कि रिक्त? और यहाँ? केवल रेल हैं। वे अपवाद लौटाते हैं: रूबी 2.0.0 में NoMethodError।
लोनी प्रत्येक

17
any?यदि आप कभी तालिका अपडेट करते हैं तो जोड़ने पर विचार करें ।
डेनिस

blank?और present?" रेल्स-ओनली " नहीं हैं, वे स्वचालित रूप से रेल द्वारा शामिल किए गए हैं लेकिन ActiveSupport के कोर एक्सटेंशन का उपयोग करके आसानी से गैर-रेल कोड में शामिल किया जा सकता है। देखें stackoverflow.com/questions/4238867/…
टिन मैन २ 18:

215

जूलियन की तालिका का विस्तार करें:

यहां छवि विवरण दर्ज करें

रेफरी: खाली? खाली? नील???


1
@ सिबविन वांग, मैंने इस तालिका को डाउनलोड किया है और अपने कुछ उत्तरों में इसका उपयोग आपके क्रेडिट जोड़ने में किया है। आशा है कि आप बुरा नहीं मानेंगे :) इस महान प्रयास के लिए यश!
लाहिरु

1
Enumerable#any?वेनिला रूबी है, इसे "रेल्स ओनली" के तहत सूचीबद्ध नहीं किया जाना चाहिए
डेनियरियो

1
@daniero आपके अनुस्मारक के लिए धन्यवाद, तालिका अपडेट की गई है।
सिबविन वांग

न्यूमेरिक प्रकार भी हैं .zero?और.nonzero?
डेवमॉन्गोज

63

जल्द सलाह: !obj.blank? == obj.present?

कुछ भावों में आंखों पर आसान / आसान हो सकता है


वहाँ obj.nil के बराबर कुछ है?
कर्क

present?active_support का हिस्सा है, इसे प्राप्त करने के लिए क्या करना है पर यहां देखें: stackoverflow.com/a/4648704/1569
फैक्टर मिस्टिक

2
@Kirk: !! obj बराबर है? Obj.nil?
मोहम्मद हाफिज

4
@MohamedHafez नहीं यह नहीं है। !!false
अजादि 32

Agh, @ Ajedi32 अच्छी पकड़! उस एक अपवाद के बराबर।
मोहम्मद हाफिज

52

एक अंतर यह है कि .nil?और .empty?तरीकों कि प्रोग्रामिंग भाषा रूबी द्वारा प्रदान की जाती हैं, जबकि .blank?कुछ है जोड़ा वेब विकास रूपरेखा रेल द्वारा।


49

यहां छवि विवरण दर्ज करें

  • जो कुछ भी nil?हैblank?
  • जो कुछ भी empty?हैblank?
  • वह कुछ भी नहीं empty?हैnil?
  • वह कुछ भी नहीं nil?हैempty?

tl; डॉआर - केवल उपयोग करें blank?और present?जब तक आप ""और के बीच अंतर नहीं करना चाहते हैं" "


2
ओह! आपको
बजे

16

एक विशेष मामला तब होता है जब यह आकलन करने की कोशिश की जाती है कि बूलियन मान शून्य है:

false.present? == false
false.blank? == true
false.nil? == false

इस मामले में सिफारिश का उपयोग करना होगा .nil?


14

बस any?सिफारिश के बारे में थोड़ा ध्यान दें : वह सही है जो आम तौर पर इसके बराबर है !empty?। हालांकि, सिर्फ व्हॉट्सएप (अला ) के एक स्ट्रिंग पर any?वापस आ जाएगा ।true" "

और हां, ऊपर 1.9 टिप्पणी भी देखें।


रेल में, व्हाट्सएप वर्णों वाले किसी भी तार को "रिक्त": "\ n \ r \ t" .blank? # => सच
लोनी एवरी

13

any?जो आम तौर पर है मत भूलना !empty?। रेल में मैं आमतौर पर किसी स्टेटमेंट के अंत में किसी चीज की मौजूदगी की जांच करता हूं if somethingया unless somethingफिर blank?जहां जरूरत होती है, वहां इस्तेमाल करता हूं क्योंकि वह हर जगह काम करता है।


4
।कोई भी? रूबी में तार के साथ काम नहीं करता है 1.9,। आवश्यक है, और प्रत्येक # स्ट्रिंग # रूबी 1.9 में काम नहीं करता है।
एंड्रयू ग्रिम

4
any?गैर-शून्यता की जाँच के लिए सावधान । यदि आपके पास मिथ्या मानों की एक सरणी है तो यह गलत है। एक रास्ता है कि चारों ओर पाने के लिए एक हमेशा सच ब्लॉक पास है: [nil, false].any?{ true }लेकिन !empty?कम है और आप अजीब व्यवहार याद नहीं है।
केल्विन

12

nil?एक मानक रूबी विधि है जिसे सभी ऑब्जेक्ट्स पर कॉल किया जा सकता है और trueयदि ऑब्जेक्ट है तो रिटर्न nil:

b = nil
b.nil? # => true

empty?एक मानक रूबी विधि है जिसे कुछ वस्तुओं पर बुलाया जा सकता है जैसे स्ट्रिंग्स, एरेस और हैश और रिटर्न trueयदि ये ऑब्जेक्ट्स कोई गुण नहीं हैं:

a = []
a.empty? # => true

b = ["2","4"]
b.empty? # => false

empty?nilवस्तुओं पर नहीं बुलाया जा सकता ।

blank?एक रेल विधि है जिसे nilवस्तुओं के साथ-साथ खाली वस्तुओं पर भी बुलाया जा सकता है।


7

हर किसी ने अच्छी तरह से समझाया है कि अंतर क्या है।

मैं रूबी पर रेल में जोड़ना चाहते हैं, इसका इस्तेमाल करने के लिए बेहतर है obj.blank?या obj.present?बजाय obj.nil?या obj.empty?

obj.blank?संभालती सभी प्रकार nil, '', [], {}, और रिटर्न trueअगर मान उपलब्ध नहीं हैं और रिटर्न falseअगर मान उपलब्ध वस्तु के किसी भी प्रकार पर हैं।


5

exists?विधि का उपयोग यह जांचने के लिए किया जा सकता है कि डेटा डेटाबेस में मौजूद है या नहीं। यह trueया तो बूलियन मान लौटाता है या false


केवल मॉडल वर्ग पर काम करता है!
रोजर

4

रेलें ४

@ कॉर्बन-ब्रूक के एरे गेथा: रिक्त? जाँच के लिए कि क्या कोई सरणियाँ केवल खाली मान रखती हैं और उन्हें रिक्त माना जा सकता है? सच:

[ nil, '' ].all? &:blank? == true

एक भी कर सकता है:

[nil, '', "", " ",' '].reject(&:blank?).blank? == true

3

nil?किसी भी वस्तु पर इस्तेमाल किया जा सकता है। यह निर्धारित करता है कि वस्तु का कोई मूल्य है या नहीं, जिसमें 'रिक्त' मान शामिल हैं।

उदाहरण के लिए:

example = nil
example.nil?  # true

"".nil?  # false

मूल रूप nil?से केवल तभी सही होगा जब वस्तु वास्तव में 'नील' के बराबर हो।

empty?केवल उन वस्तुओं पर कहा जाता है जिन्हें एक संग्रह माना जाता है। इसमें स्ट्रिंग्स (पात्रों का एक संग्रह), हैश (कुंजी / मूल्य जोड़े का एक संग्रह) और सरणियां (मनमानी वस्तुओं का एक संग्रह) जैसी चीजें शामिल हैं। empty?यह सच है कि संग्रह में कोई आइटम नहीं हैं।

उदाहरण के लिए:

"".empty? # true
"hi".empty?   # false
{}.empty?  # true
{"" => ""}.empty?   # false
[].empty?   # true
[nil].empty?  # false

nil.empty?  # NoMethodError: undefined method `empty?' for nil:NilClass

ध्यान दें कि empty?शून्य वस्तुओं पर कॉल नहीं किया जा सकता क्योंकि नील वस्तुएं संग्रह नहीं हैं और यह एक अपवाद को बढ़ाएगा।

यह भी ध्यान रखें कि यदि किसी संग्रह में आइटम रिक्त हैं, तो भी इसका मतलब यह नहीं है कि संग्रह खाली है।

blank?मूल रूप से एक संयोजन है nil?और empty?यह उन वस्तुओं की जाँच के लिए उपयोगी है जिन्हें आप मानते हैं कि संग्रह हैं, लेकिन यह शून्य भी हो सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.