मैं कैसे जांच सकता हूं कि क्या रूबी में एक चर परिभाषित किया गया है? वहाँ एक- isset
प्रकार की विधि उपलब्ध है?
मैं कैसे जांच सकता हूं कि क्या रूबी में एक चर परिभाषित किया गया है? वहाँ एक- isset
प्रकार की विधि उपलब्ध है?
जवाबों:
defined?
कीवर्ड ( प्रलेखन ) का उपयोग करें । यह आइटम के प्रकार के साथ एक स्ट्रिंग लौटाएगा, या nil
यदि यह मौजूद नहीं है।
>> a = 1
=> 1
>> defined? a
=> "local-variable"
>> defined? b
=> nil
>> defined? nil
=> "nil"
>> defined? String
=> "constant"
>> defined? 1
=> "expression"
जैसा कि स्केले ने टिप्पणी की: "यह ध्यान देने योग्य है कि जिस चर को शून्य पर सेट किया गया है, वह आरंभिक है।"
>> n = nil
>> defined? n
=> "local-variable"
||=
ऑपरेटर को शामिल करना ) देखें।
defined?
भी उस ब्लॉक के भीतर परिभाषित एक वैरिएबल के लिए सही रहता है!
defined?
जो रिटर्न बूलियन है?
!!defined?(object_name)
यह उपयोगी है यदि आप कुछ भी नहीं करना चाहते हैं अगर यह मौजूद नहीं है, लेकिन अगर यह मौजूद नहीं है तो इसे बनाएं।
def get_var
@var ||= SomeClass.new()
end
यह केवल एक बार नया उदाहरण बनाता है। इसके बाद यह सिर्फ var को वापस करता रहता है।
||=
बूलियन मूल्यों के साथ उपयोग न करें , ऐसा न हो कि आप भ्रम के दर्द को महसूस करते हैं।
nil
तब तक वापस आ सकता है जब तक कि आप वास्तव में हर बार जब इसे वापस बुलाते हैं तो अभिव्यक्ति का मूल्यांकन नहीं करना चाहतेnil
var = (var or var.nil?)
उपरोक्त कथन का सही सिंटैक्स है:
if (defined?(var)).nil? # will now return true or false
print "var is not defined\n".color(:red)
else
print "var is defined\n".color(:green)
end
प्रतिस्थापन ( var
) अपने चर के साथ। यह वाक्यविन्यास यदि विवरण में मूल्यांकन के लिए एक सही / गलत मान लौटाएगा।
defined?(var) == nil
?
.nil?
जैसा कि वे कहते हैं, कॉल का उपयोग करना अधिक मुहावरेदार है। किसी ऑब्जेक्ट nil
को तुलना ऑपरेटर से उपयोग करने की तुलना में यह अधिक "ऑब्जेक्ट-ओरिएंटेड" है । न तो पढ़ना मुश्किल है, इसलिए जो भी आपको अधिक उत्पाद जहाज करने में मदद करता है।
defined?(your_var)
काम करेगा। आप जो कर रहे हैं उसके आधार पर आप भी कुछ ऐसा कर सकते हैंyour_var.nil?
your_var.nil?
क्योंकि यह असत्य का सच है और पढ़ने और लिखने के लिए बहुत अच्छा है defined? var
। इसके लिए धन्यवाद।
your_var.nil?
परिणाम में त्रुटि होगी: undefined local variable or method your_var
जब पहले परिभाषित नहीं ...
"If" के बजाय "if" का प्रयास करें
a = "apple"
# Note that b is not declared
c = nil
unless defined? a
puts "a is not defined"
end
unless defined? b
puts "b is not defined"
end
unless defined? c
puts "c is not defined"
end
यहाँ कुछ कोड है, कुछ भी रॉकेट साइंस नहीं है लेकिन यह काफी अच्छी तरह से काम करता है
require 'rubygems'
require 'rainbow'
if defined?(var).nil? # .nil? is optional but might make for clearer intent.
print "var is not defined\n".color(:red)
else
print "car is defined\n".color(:green)
end
स्पष्ट रूप से, रंग कोड आवश्यक नहीं है, बस इस खिलौना उदाहरण में एक अच्छा दृश्य है।
nil?
वैकल्पिक है।
यह प्रमुख उत्तर है: defined?
विधि। ऊपर दिया गया स्वीकृत उत्तर इसे पूरी तरह दिखाता है।
लेकिन एक शार्क है, जो लहरों के नीचे दुबकी हुई है ...
इस प्रकार के सामान्य रूबी पैटर्न पर विचार करें:
def method1
@x ||= method2
end
def method2
nil
end
method2
हमेशा लौटता है nil
। पहली बार जब आप कॉल करते हैं method1
, तो @x
चर सेट नहीं किया जाता है - इसलिए method2
चलाया जाएगा। और method2
सेट हो जाएगा @x
करने के लिए nil
। यह ठीक है, और सभी अच्छी तरह से और अच्छा है। लेकिन दूसरी बार फोन करने पर क्या होता हैmethod1
?
याद रखें @ x पहले ही शून्य पर सेट हो चुका है। But method2
अभी भी फिर से चलाया जाएगा !! यदि Method2 एक महंगा उपक्रम है, तो यह कुछ ऐसा नहीं है जो आप चाहते हैं।
defined?
विधि को बचाव में आने दें - इस समाधान के साथ, उस विशेष मामले को संभाला जाता है - निम्नलिखित का उपयोग करें:
def method1
return @x if defined? @x
@x = method2
end
शैतान विवरण में है: लेकिन आप उस गुप्त शार्क को defined?
विधि से निकाल सकते हैं ।
तुम कोशिश कर सकते हो:
unless defined?(var)
#ruby code goes here
end
=> true
क्योंकि यह एक बूलियन देता है।
SyntaxError: compile error (irb):2: syntax error, unexpected $end, expecting kEND
unless
बयान का उपयोग करने के लिए अत्यधिक जटिल लगता है
कई अन्य उदाहरणों से पता चलता है कि आपको रूबी में तार्किक विकल्प बनाने के लिए वास्तव में एक विधि से बूलियन की आवश्यकता नहीं है। जब तक आपको वास्तव में बूलियन की आवश्यकता नहीं होगी तब तक एक बूलियन के लिए सब कुछ करने के लिए यह एक खराब रूप होगा।
लेकिन अगर आपको पूरी तरह से बूलियन की जरूरत है। उपयोग !! (बैंग बैंग) या "झूठे झूठे सच को उजागर करता है"।
› irb
>> a = nil
=> nil
>> defined?(a)
=> "local-variable"
>> defined?(b)
=> nil
>> !!defined?(a)
=> true
>> !!defined?(b)
=> false
क्यों यह आमतौर पर भुगतान करने के लिए मजबूर नहीं करता है:
>> (!!defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red)) == (defined?(a) ? "var is defined".colorize(:green) : "var is not defined".colorize(:red))
=> true
यहां एक उदाहरण है जहां यह मायने रखता है क्योंकि यह अपने स्ट्रिंग प्रतिनिधित्व के लिए बूलियन मूल्य के अंतर्निहित जोर पर निर्भर करता है।
>> puts "var is defined? #{!!defined?(a)} vs #{defined?(a)}"
var is defined? true vs local-variable
=> nil
यह उल्लेख किया जाना चाहिए कि defined
हैश में विशिष्ट क्षेत्र निर्धारित होने पर जाँच करने के लिए उपयोग करना अप्रत्याशित हो सकता है:
var = {}
if defined? var['unknown']
puts 'this is unexpected'
end
# will output "this is unexpected"
यहां सिंटैक्स सही है, लेकिन defined? var['unknown']
स्ट्रिंग का मूल्यांकन किया जाएगा "method"
, इसलिए if
ब्लॉक निष्पादित किया जाएगा
संपादित करें: यदि हैश में कोई कुंजी मौजूद है, तो जाँच के लिए सही अंकन:
if var.key?('unknown')
कृपया "परिभाषित" और "असाइन" के बीच अंतर पर ध्यान दें।
$ ruby -e 'def f; if 1>2; x=99; end;p x, defined? x; end;f'
nil
"local-variable"
एक्स को परिभाषित किया गया है, भले ही यह कभी नहीं सौंपा गया हो!
NameError Exception: undefined local variable or method
, और उलझन में था जब चर का एकमात्र असाइनमेंट / उल्लेख एक अगर ब्लॉक में था जो हिट नहीं हो रहा था।
इसके अलावा, यदि आप कोड के माध्यम से एक स्ट्रिंग में इसे परिभाषित करते हुए देख सकते हैं, यदि आप कोड:
puts "Is array1 defined and what type is it? #{defined?(@array1)}"
यदि आप इसे परिभाषित करते हैं तो सिस्टम आपको प्रकार बताएगा। यदि इसे परिभाषित नहीं किया जाता है, तो यह केवल एक चेतावनी कह कर वापस कर देगा जिसमें चर को आरंभीकृत नहीं किया गया है।
उम्मीद है की यह मदद करेगा! :)
nil
है वह आरंभिक है।