2016-10-14 5 views
5

मैं सिंगलटन एलियाज्ड विधि को परिभाषित करने की कोशिश कर रहा हूं। के रूप में:उपनाम एक ऑब्जेक्ट के लिए एक विधि

name = 'Bob' 
# I want something similar to this to work 
name.define_singleton_method(:add_cuteness, :+) 
name = name.add_cuteness 'by' 

मुझे यकीन है कि मैं एक दूसरे पैरामीटर के रूप में एक विधि वस्तु पारित कर सकते हैं कर रहा हूँ।

मैं इस

name.define_singleton_method(:add_cuteness) { |val| self + val } 

मैं इसका इस्तेमाल नहीं String#+ विधि अन्य नाम पर चाहते हैं की तरह यह करने के लिए नहीं करना चाहते। उपनाम पर जोर, लेकिन वास्तविक पैरामीटर ऑब्जेक्ट को दूसरे पैरामीटर के रूप में भेजना भी अच्छा होगा।

+1

आप नहीं कर सकते हैं 'define_singleton_method' एक पूर्णांक पर यह अपरिवर्तनीय है – bjhaid

+0

@bjhaid सच। मैंने इसे 'स्ट्रिंग' –

+1

'name =' Bob 'में बदल दिया; name.define_singleton_method (: add_cuteness, और name.method (: +)); नाम = name.add_cuteness 'द्वारा' # => 'बॉबी' यह वही है जो आप चाहते हैं? – bjhaid

उत्तर

6

सिंगलटन तरीकों कि वस्तु की सिंगलटन वर्ग में शामिल हैं:

class Object 
    def define_singleton_alias(new_name, old_name) 
    singleton_class.class_eval do 
     alias_method new_name, old_name 
    end 
    end 
end 

rob = 'Rob' 
bob = 'Bob' 
bob.define_singleton_alias :add_cuteness, :+ 

bob.add_cuteness 'by' # => "Bobby" 
rob.add_cuteness 'by' # => NoMethodError 

Object#define_singleton_method मूल रूप से करता है कुछ इस तरह:

def define_singleton_method(name, &block) 
    singleton_class.class_eval do 
    define_method name, &block 
    end 
end 
+0

जैसा मामला है, [मॉड्यूल # alias_method] (https://ruby-doc.org/core-2.2.2/Module.html#method-i-alias_method) इसके तर्कों को प्रतीकों या तारों के रूप में अनुमति देता है: 'बॉब .add_cuteness 'द्वारा' # => "बॉबी" '। –

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