2010-09-09 9 views
12

कंसोल में अक्सर, मैं एक वस्तुरूबी में अलियाकृत तरीकों की पहचान करना संभव है?

pp obj.methods.sort #or... 
pp (obj.methods - Object.methods).sort 

रूबी में यह बहुत आम है पूछताछ एक डेवलपर तरीकों के लिए उपनाम प्रदान करने के लिए की जाती है। अगर वहाँ उपनाम की पहचान ताकि मैं aliased तरीकों, कुछ की तरह प्रदर्शित करने के लिए सक्षम हो सकता है की एक चिंतनशील तरीका है मैं सोच रहा हूँ ...

array.aliased_methods #=> {:collect => :map, ...} 

यह एक वस्तु वास्तव में कैसे बहुत सी बातें की पहचान करने में सक्षम होने के लिए मददगार होगा क्या कर सकते हैं।

+0

ri_for मणि http://github.com/rdp/ri_for – rogerdpack

उत्तर

14

रूबी 1.9 में, एलियास उदाहरण तरीकों eql? हो जाएगा, तो आप को परिभाषित कर सकते हैं:

class Module 
    def aliased_methods 
    instance_methods.group_by{|m| instance_method(m)}. 
     map(&:last).keep_if{|symbols| symbols.length > 1} 
    end 
end 

अब अगर आप यह कोशिश, आप मिल जाएगा:

class Foo 
    def bar; 42 end 
    alias baz bar 
    def hello; 42 end 
end 

Foo.aliased_methods # => [[:bar, :baz]] 

Array.aliased_methods # => [[:inspect, :to_s], [:length, :size]] 

ध्यान दें कि कुछ जोड़े याद कर रहे हैं उदाहरण के लिए [:map, :collect]। यह bug that is now fixed के कारण है और अगले संस्करण (2.0.0) में होगा यदि यह आपके लिए महत्वपूर्ण है, तो आप हैश या eql? और केवल == का उपयोग किए बिना अपना group_by रोल कर सकते हैं।

+0

नाइस की मदद कर सकता है। सिर्फ एक और कारण मैं तब तक इंतजार नहीं कर सकता जब तक कि हर कोई अपने रूबिलीब को नवीनतम रूबी में अपग्रेड नहीं करता। – Mario

0

वास्तव में नहीं। उपनाम केवल एक सूचक या ऐसा कुछ नहीं है, उपनाम के बाद आप पहली विधि को अनदेखा कर सकते हैं और एलियाज्ड विधि नहीं बदलेगी (हार्ड लिंक बनाम सीएम लिंक सोचें)। आम तौर पर, उपनाम rdoc में परिलक्षित होते हैं, इसलिए मैं एक निश्चित सूची के लिए वहां जाऊंगा।

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