ruby-on-rails - रेल पर रूबी में शून्य v। खाली v। खाली की संक्षिप्त व्याख्या




(13)

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

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

  • nil? वस्तुओं NilClass के उदाहरण हैं।

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

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


Answers

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

b = nil
b.nil? # => true

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

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

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

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

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


.nil? किसी ऑब्जेक्ट पर इस्तेमाल किया जा सकता है और यदि ऑब्जेक्ट शून्य है तो यह सच है।

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

  • स्ट्रिंग लंबाई == 0
  • ऐरे लंबाई == 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?

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

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

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


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

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

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


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

और निश्चित रूप से, ऊपर 1.9 टिप्पणी भी देखें।


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


रेल 4

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

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

कोई भी कर सकता है:

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

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

मैं रूबी ऑन रेल में जोड़ना चाहता हूं, obj.blank? का उपयोग करना बेहतर है obj.blank? या obj.present? obj.nil? बजाय obj.nil? या obj.empty?

obj.blank? सभी प्रकारों को संभालता है, '' , [] , {} , और यदि मूल्य उपलब्ध नहीं हैं और किसी भी प्रकार की ऑब्जेक्ट पर मान उपलब्ध हैं तो false लौटाता है।


त्वरित युक्ति !obj.blank? == obj.present? !obj.blank? == obj.present?

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


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

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


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? संयोजन है nil? और empty? ऑब्जेक्ट्स की जांच करने के लिए यह उपयोगी है जो आप मानते हैं संग्रह हैं, लेकिन यह भी शून्य हो सकता है।


any? मत भूलना any? जो आमतौर पर !empty? । रेल में मैं आमतौर पर किसी बयान के अंत में कुछ की उपस्थिति की जांच करता हूं, if something या unless something तो blank? जहां से यह हर जगह काम करने लगता है की जरूरत है।


एक समाधान जो मुझे पसंद है, क्योंकि यह वास्तविक रेल लॉग आउटपुट से अलग rspec आउटपुट रखता है, निम्न कार्य करना है:

  • दूसरी टर्मिनल विंडो या टैब खोलें, और इसे व्यवस्थित करें ताकि आप दोनों मुख्य टर्मिनल को देख सकें जो आप rspec पर चल रहे हैं और साथ ही साथ नया भी।
  • दूसरी विंडो में पूंछ कमांड चलाएं ताकि आप परीक्षण वातावरण में रेल लॉग देख सकें। डिफ़ॉल्ट रूप से यह $ tail -f $RAILS_APP_DIR/logs/test.log या tail -f $RAILS_APP_DIR\logs\test.log विंडो उपयोगकर्ताओं के लिए हो सकता है
  • अपने आरएसपीसी सूट चलाएं

यदि आप iTerm जैसे मल्टी-फलक टर्मिनल चला रहे हैं, तो यह और भी मजेदार हो जाता है और आपके पास rspec और test.log आउटपुट पक्ष है।







ruby-on-rails ruby