2012-12-10 19 views
89

गुजर वस्तुओं को बनाने की कोशिश कर रहा विधि भेजने के लिए और सेगहरे लाल रंग का एक से अधिक पैरामीटर

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]) 

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

है 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 

कोई कैसे एक गहरे लाल रंग का विधि के लिए एकाधिक मापदंडों को भेजने के लिए पर मेरी मदद कर सकते गतिशील

उत्तर

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

या

send(:i_take_multiple_arguments, 25.0, 26.0) 
+17

इस संदर्भ में '*' इस संदर्भ में 'splat" ऑपरेटर है, यह ध्यान देने योग्य हो सकता है। –

4

आप बारी-बारी से उसके साथ 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__। सम्मेलन से, कोई भी उस नाम के साथ कभी भी एक विधि नहीं लिखता है, इसलिए अंतर्निहित रूबी संस्करण हमेशा उपलब्ध होता है और कभी भी नए लिखित तरीकों से संघर्ष में नहीं आता है। यह अजीब लगता है, लेकिन यह स्पष्ट की तुलना में सुरक्षित है विधि-नाम संघर्ष की दृष्टि "

काले भी if respond_to?(method_name) में __send__ के लिए कॉल लपेटकर पता चलता है से संस्करण भेजें।

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

रेफरी: ब्लैक, डेविड ए। अच्छी तरह से ग्राउंड रूबीस्ट। मैनिंग, 200 9। पी .171।

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

संबंधित मुद्दे