Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

`विधि` विधि के साथ मज़ा

क्या आप कभी किसी ऐसे फ़ंक्शन के लिए कोई विधि पास करना चाहते हैं जो केवल एक ब्लॉक लेता है? या पता लगाएँ कि आपके किस ऑब्जेक्ट के सुपरक्लास ने उस विधि को तोड़ दिया है जिसे आप कॉल करने का प्रयास कर रहे हैं?

उन चीजों को 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 . इनके साथ, आप अपने कोड के बारे में बहुत कुछ सीख सकते हैं क्योंकि यह चलता है, और इसे फ्लाई पर संशोधित करता है। इन कक्षाओं को अच्छी तरह से सीखें, उनके एपीआई का अध्ययन करें, और आप रूबी के साथ अद्भुत काम कर पाएंगे।


  1. रूबी मानचित्र विधि का उपयोग कैसे करें (उदाहरण के साथ)

    मैप एक रूबी विधि है जिसका उपयोग आप ऐरे, हैश और रेंज के साथ कर सकते हैं। मानचित्र का मुख्य उपयोग डेटा को ट्रांसफ़ॉर्म करना है। उदाहरण के लिए : स्ट्रिंग्स की एक सरणी को देखते हुए, आप प्रत्येक स्ट्रिंग पर जा सकते हैं और प्रत्येक वर्ण को अपरकेस बना सकते हैं। या यदि आपके पास User . की सूची है ऑब्जेक्

  1. रूबी ट्रांसपोज़ विधि के साथ पंक्तियों को कॉलम में बदलें

    आज आप सीखेंगे कि रूबी ट्रांसपोज़ विधि का उपयोग करके रूबी में ग्रिड से कैसे निपटें। कल्पना कीजिए कि आपके पास एक पूर्ण ग्रिड है, मान लीजिए कि एक बहु-आयामी सरणी के रूप में एक 3×3 वर्ग है। और आप पंक्तियों को लेना और उन्हें स्तंभों में बदलना चाहते हैं । आप ऐसा क्यों करना चाहेंगे? क्लासिक गेम के लिए ए

  1. मेटाप्रोग्रामिंग की छिपी लागत

    मेटाप्रोग्रामिंग एक बहुत ही फैंसी शब्द की तरह लगता है, लेकिन क्या यह अच्छा है? यह उपयोगी हो सकता है, लेकिन बहुत से लोग यह नहीं समझते हैं कि मेटाप्रोग्रामिंग का उपयोग करने की कुछ लागतें हैं। ठीक वैसे ही हम एक ही पृष्ठ पर हैं… मेटाप्रोग्रामिंग क्या है बिल्कुल? मैं मेटाप्रोग्रामिंग को किसी भी विधि