Ruby Programming

रूबी में call() और send() में महारत हासिल करना

Spread the love

विषयसूची

  1. Ruby में call() क्या है?
  2. Ruby में send() क्या है?
  3. call() और send() के व्यावहारिक अनुप्रयोग
  4. निष्कर्ष
  5. अक्सर पूछे जाने वाले प्रश्न (FAQ)

Ruby में call() क्या है?

call() विधि, जिसे “कॉल विधि” या “कॉल करने योग्य विधि” के रूप में भी जाना जाता है, आपको मेथड कॉल ऑपरेटर () का उपयोग करके किसी ऑब्जेक्ट पर विधि को लागू करने की अनुमति देती है। यह ऑब्जेक्ट्स को कॉल करने योग्य इकाइयों में बदल देता है, जो फ़ंक्शन या प्रक्रियाओं के समान हैं। कोई भी क्लास call() विधि को परिभाषित कर सकता है, जिससे इसके उदाहरण कॉल करने योग्य बन जाते हैं।


class Adder
  def initialize(x)
    @x = x
  end

  def call(y)
    @x + y
  end
end

adder = Adder.new(5)
result = adder.call(3)  # result 8 होगा
result = adder.(3)      # मेथड कॉल ऑपरेटर का उपयोग करके समतुल्य
puts result             # आउटपुट: 8

call() कस्टम फ़ंक्शन या कोड ब्लॉक बनाने के लिए अमूल्य है जिन्हें बाद में पास और निष्पादित किया जा सकता है। यह Ruby की कार्यात्मक प्रोग्रामिंग क्षमताओं का एक आधारशिला है।

Ruby में send() क्या है?

send() विधि किसी ऑब्जेक्ट पर एक विधि को गतिशील रूप से लागू करती है, जो विधि के नाम को एक स्ट्रिंग या सिंबल के रूप में स्वीकार करती है। यह ऑब्जेक्ट्स और उनकी विधियों के रनटाइम हेरफेर को सक्षम बनाता है।


class Greeter
  def hello(name)
    "Hello, #{name}!"
  end

  def goodbye(name)
    "Goodbye, #{name}!"
  end
end

greeter = Greeter.new
message = greeter.send(:hello, "World")  # message "Hello, World!" होगा
puts message

message = greeter.send("goodbye", "World") # message "Goodbye, World!" होगा
puts message

विधि का नाम (`:hello` या `”goodbye”`) को send() के तर्क के रूप में पारित किया जाता है, जो लचीला विधि आवृत्ति प्रदान करता है, यहाँ तक कि गतिशील स्थितियों के आधार पर भी। हालाँकि, सुरक्षा भेद्यताओं को रोकने के लिए अविश्वसनीय इनपुट के साथ send() का उपयोग करते समय सावधानी बरतना महत्वपूर्ण है।

call() और send() के व्यावहारिक अनुप्रयोग

call() और send() अलग-अलग लाभ प्रदान करते हैं:

  • call(): कॉल करने योग्य ऑब्जेक्ट बनाने, रणनीतियों को लागू करने (जैसे, विभिन्न सॉर्टिंग एल्गोरिदम), और लैम्ब्डा और प्रोक्स जैसे कार्यात्मक प्रोग्रामिंग अवधारणाओं के साथ काम करने के लिए आदर्श। यह पूर्वनिर्धारित विधियों के लिए send() की तुलना में स्वच्छ, अधिक पठनीय सिंटैक्स प्रदान करता है।
  • send(): मेटाप्रोग्रामिंग, रनटाइम स्थितियों के आधार पर गतिशील विधि प्रेषण और लचीला API बनाने के लिए उपयोगी। यह विशेष रूप से तब मददगार होता है जब कंपाइल समय पर विधि का नाम अज्ञात होता है। हालाँकि, अधिक उपयोग से कोड की पठनीयता और रखरखाव कम हो सकता है।

उदाहरण: call() के साथ रणनीति पैटर्न


class SortStrategy
  def call(array)
    raise NotImplementedError, "उपवर्गों को कॉल विधि लागू करनी चाहिए"
  end
end

class BubbleSort < SortStrategy
  def call(array)
    # बबल सॉर्ट कार्यान्वयन... (संक्षिप्तता के लिए कार्यान्वयन छोड़ा गया)
  end
end

class QuickSort < SortStrategy
  def call(array)
    # क्विक सॉर्ट कार्यान्वयन... (संक्षिप्तता के लिए कार्यान्वयन छोड़ा गया)
  end
end

sorter = BubbleSort.new
sorted_array = sorter.call([3, 1, 4, 1, 5, 9, 2, 6])

यह दर्शाता है कि कैसे call() रणनीति पैटर्न को सुंदरता से लागू करता है।

निष्कर्ष

call() और send() शक्तिशाली Ruby उपकरण हैं। call() कॉल करने योग्य ऑब्जेक्ट बनाने के लिए एक स्वच्छ, कार्यात्मक दृष्टिकोण प्रदान करता है, जबकि send() गतिशील विधि आवृत्ति प्रदान करता है। उनकी ताकत और कमजोरियों को समझने से डेवलपर्स को प्रत्येक कार्य के लिए उपयुक्त विधि का चयन करने में सक्षम बनाया जाता है, जिससे कोड की लचीलापन और रखरखाव में सुधार होता है। सुरक्षा जोखिमों को कम करने के लिए, विशेष रूप से अविश्वसनीय इनपुट के साथ, send() का सावधानीपूर्वक उपयोग करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

  • प्रश्न: send() का उपयोग करने के सुरक्षा निहितार्थ क्या हैं?
    उत्तर: अविश्वसनीय इनपुट के साथ send() का उपयोग करने से मनमाने तरीके से विधियों का दुर्भावनापूर्ण निष्पादन सक्षम हो सकता है, जिससे कमजोरियाँ पैदा होती हैं। send() का उपयोग करने से पहले हमेशा इनपुट को साफ और मान्य करें।
  • प्रश्न: क्या मैं किसी भी विधि के साथ call() का उपयोग कर सकता हूँ?
    उत्तर: नहीं, call() विशेष रूप से call() नामक विधियों के लिए है।
  • प्रश्न: क्या send() किसी विधि को सीधे कॉल करने से तेज है?
    उत्तर: नहीं, send() में एक लुकअप शामिल है, जिससे यह धीमा हो जाता है। इसका उपयोग केवल तभी करें जब गतिशील आवृत्ति आवश्यक हो।
  • प्रश्न: send और public_send में क्या अंतर है?
    उत्तर: public_send केवल सार्वजनिक विधियों को कॉल करता है, निजी/संरक्षित विधियों तक पहुँच को रोककर सुरक्षा बढ़ाता है। send किसी भी दृश्यता की विधियों को कॉल कर सकता है।

प्रातिक्रिया दे

आपका ईमेल पता प्रकाशित नहीं किया जाएगा. आवश्यक फ़ील्ड चिह्नित हैं *