क्या आप कभी किसी ऐसे फ़ंक्शन के लिए कोई विधि पास करना चाहते हैं जो केवल एक ब्लॉक लेता है? या पता लगाएँ कि आपके किस ऑब्जेक्ट के सुपरक्लास ने उस विधि को तोड़ दिया है जिसे आप कॉल करने का प्रयास कर रहे हैं?
उन चीजों को method
से करना आसान है विधि। इसका अच्छी तरह से उपयोग करें, और आप अपनी निर्भरता के बारे में जान सकते हैं, अपने आप को डिबगिंग के घंटों को बचा सकते हैं, और अपना कोड उन स्थानों पर प्राप्त कर सकते हैं जहां इसकी आवश्यकता है।
लैम्ब्डा जितनी आसान विधियां
रूबी के बहुत सारे तरीके ब्लॉक या लैम्ब्डा लेते हैं। लेकिन आप सीधे एक विधि को दूसरी विधि में पास नहीं कर सकते, जिस तरह से आप लैम्ब्डा के साथ करेंगे। आपको method
का उपयोग करना होगा पहला:
irb(main):001:0> sin_method = Math.method(:sin)
=> #<Method: Math.sin>
irb(main):002:0> (1..10).map(&sin_method)
=> [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893699]
तो, यहाँ क्या हो रहा है?
पहली पंक्ति विधि को बदल देती है Math.sin
एक method
. में वस्तु। लैम्बडास की तरह, `विधि` ऑब्जेक्ट `कॉल` का जवाब देते हैं। method
ऑब्जेक्ट to_proc
का जवाब देते हैं (धन्यवाद, बेनोइट)। इसलिए उनका उपयोग उन्हीं जगहों पर किया जा सकता है जहां आप लैम्ब्डा का उपयोग करेंगे:
irb(main):004:0> sin_method = -> (x) { Math.sin(x) }
=> #<Proc:0x007fe9f90a9bd8@(irb):4 (lambda)>
irb(main):005:0> (1..10).map(&sin_method)
=> [0.8414709848078965, 0.9092974268256817, 0.1411200080598672, -0.7568024953079282, -0.9589242746631385, -0.27941549819892586, 0.6569865987187891, 0.9893582466233818, 0.4121184852417566, -0.5440211108893699]
पहली पंक्ति को फिर से देखें। लैम्ब्डा का उपयोग करते हुए यह कोड, method
. का उपयोग करते हुए पिछले कोड की तरह ही काम करता है ।
इस पर निर्भर करते हुए कि आपने अपना कोड कैसे लिखा है, एक method
. पर पकड़ बनाना ऑब्जेक्ट को लैम्ब्डा में लपेटने से कहीं अधिक आसान हो सकता है। इसलिए जब आपको लैम्ब्डा की आवश्यकता हो और आपके पास केवल एक विधि हो, तो method
को याद रखें विधि।
वह तरीका कहां से आया?
आपने अभी अपने ऑब्जेक्ट पर एक विधि को कॉल किया है, और यह कुछ ऐसा करता है जिसकी आपको उम्मीद नहीं थी। हो सकता है कि किसी ने इसे ओवरराइड कर दिया हो या बंदर ने इसे पैच कर दिया हो। आप इसे कैसे समझते हैं?
आप कर सकते थे कुछ घंटों के लिए स्रोत कोड के माध्यम से खोदें। लेकिन method
दो तरीके हैं जो चीजों को गति दे सकते हैं।
यह पता लगाने के लिए कि आप किस वर्ग को कॉल कर रहे हैं, किस वर्ग ने परिभाषित किया है, owner
का उपयोग करें :
irb(main):003:0> Task.new.method(:valid?).owner
=> ActiveRecord::Validations
जब आप थोड़ा और गहराई में जाना चाहते हैं और यह पता लगाना चाहते हैं कि कहां विधि परिभाषित की गई थी, source_location
का उपयोग करें :
irb(main):004:0> Task.new.method(:valid?).source_location
=> ["/usr/local/lib/ruby/gems/2.1.0/gems/activerecord-4.2.0.beta2/lib/active_record/validations.rb", 55]
source_location
एक सरणी देता है। पहला तत्व उस फ़ाइल का पथ है जहां विधि परिभाषित की गई थी, और दूसरा तत्व लाइन नंबर है। इनके साथ, आप ठीक-ठीक जानते हैं कि आगे कहाँ देखना है।
सोर्स को पढ़ना (बिना खोदे)
एक बार आप यह पता लगा सकते हैं कि कहां एक विधि परिभाषित की गई थी, हो सकता है कि आप कैसे देखना चाहें यह परिभाषित है।
method
अपने आप ऐसा नहीं कर सकता। लेकिन अगर आप method_source
इंस्टॉल करते हैं मणि, आप सीधे अपने कंसोल से कई विधियों के लिए स्रोत कोड देख सकते हैं:
irb(main):002:0> puts Task.new.method(:valid?).source
def valid?(context = nil)
context ||= (new_record? ? :create : :update)
output = super(context)
errors.empty? && output
end
=> nil
आप टिप्पणियां भी देख सकते हैं:
irb(main):003:0> puts Task.new.method(:valid?).comment
# Runs all the validations within the specified context. Returns +true+ if
# no errors are found, +false+ otherwise.
#
# Aliased as validate.
#
# If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
# <tt>new_record?</tt> is +true+, and to <tt>:update</tt> if it is not.
#
# Validations with no <tt>:on</tt> option will run no matter the context. Validations with
# some <tt>:on</tt> option will only run in the specified context.
=> nil
बहुत बढ़िया, है ना? आपका दस्तावेज़ कंसोल में सही है!
आत्मनिरीक्षण कमाल का है
मेरी कुछ पसंदीदा रूबी कक्षाएं हैं जो आपको अपने कोड के भीतर से अपने कोड का निरीक्षण करने देती हैं। Class
. जैसी कक्षाएं , Module
, और method
. इनके साथ, आप अपने कोड के बारे में बहुत कुछ सीख सकते हैं क्योंकि यह चलता है, और इसे फ्लाई पर संशोधित करता है। इन कक्षाओं को अच्छी तरह से सीखें, उनके एपीआई का अध्ययन करें, और आप रूबी के साथ अद्भुत काम कर पाएंगे।