रूबी कई मापदंडों से गुजरने वाली विधि


129

वस्तुओं और कॉल विधियों को गतिशील रूप से बनाने की कोशिश कर रहा है

Object.const_get(class_name).new.send(method_name,parameters_array)

जब ठीक काम कर रहा है

Object.const_get(RandomClass).new.send(i_take_arguments,[10.0])

लेकिन 2 के लिए तर्क 1 की गलत संख्या फेंकना

Object.const_get(RandomClass).new.send(i_take_multiple_arguments,[25.0,26.0])

रैंडम क्लास परिभाषित है

class RandomClass
def i_am_method_one
    puts "I am method 1"
end
def i_take_arguments(a)
    puts "the argument passed is #{a}"
end
def i_take_multiple_arguments(b,c)
    puts "the arguments passed are #{b} and #{c}"
end
    end

क्या कोई मेरी मदद कर सकता है कि कैसे म्यूटेंट पैरामीटर को रूबी विधि से गतिशील रूप से भेजा जाए

जवाबों:


232
send("i_take_multiple_arguments", *[25.0,26.0]) #Where star is the "splat" operator

या

send(:i_take_multiple_arguments, 25.0, 26.0)

22
यह ध्यान देने योग्य है कि *इस संदर्भ में "स्पैट" ऑपरेटर है।
एंड्रयू मार्शल

8

आप बारी-बारी sendसे इसका पर्यायवाची कह सकते हैं __send__:

r = RandomClass.new
r.__send__(:i_take_multiple_arguments, 'a_param', 'b_param')

वैसे * आप हैश पास कर सकते हैं क्योंकि परम कॉमा को इस तरह अलग किया जाता है:

imaginary_object.__send__(:find, :city => "city100")

या नया हैश सिंटैक्स:

imaginary_object.__send__(:find, city: "city100", loc: [-76, 39])

ब्लैक के अनुसार, __send__नाम स्थान के लिए सुरक्षित है।

“भेजना एक व्यापक अवधारणा है: ईमेल भेजा जाता है, डेटा I / O सॉकेट्स को भेजा जाता है, और इसके बाद। रूबी द्वारा निर्मित मेक इन मेथड के साथ संघर्ष नामक एक विधि को परिभाषित करना कार्यक्रमों के लिए असामान्य नहीं है। इसलिए, रूबी आपको कॉल भेजने का एक वैकल्पिक तरीका देता है __send__:। कन्वेंशन द्वारा, कोई भी कभी भी उस नाम के साथ एक विधि नहीं लिखता है, इसलिए अंतर्निहित रूबी संस्करण हमेशा उपलब्ध होता है और कभी भी नए लिखित तरीकों के साथ संघर्ष में नहीं आता है। यह अजीब लग रहा है, लेकिन यह विधि-नाम के टकराव के दृष्टिकोण से सादे भेजने वाले संस्करण की तुलना में अधिक सुरक्षित है ”

ब्लैक __send__इन में रैपिंग कॉल का सुझाव भी देता है if respond_to?(method_name)

if r.respond_to?(method_name)
    puts r.__send__(method_name)
else
    puts "#{r.to_s} doesn't respond to #{method_name}"
end

रेफरी: ब्लैक, डेविड ए। मैनिंग, 2009. पी .71।

* मैं यहाँ हैश सिंटैक्स की तलाश में आया था __send__, इसलिए अन्य googlers के लिए उपयोगी हो सकता है। ;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.