2012-02-28 13 views
6

बस रूबी मेटाप्रोग्रामिंग सीखना शुरू कर दिया। ऑब्जेक्ट.माइट्स को देखकर मुझे मिल रहा है:रूबी मेटाप्रोग्रामिंग विधियों की सूची?

Object.methods => [ 
:allocate, 
:new, 
:superclass, 
:freeze, 
:===, 
:==, 
:<=>, 
:<, 
:<=, 
:>, 
:>=, 
:to_s, 
:included_modules, 
:include?, 
:name, 
:ancestors, 
:instance_methods, 
:public_instance_methods, 
:protected_instance_methods, 
:private_instance_methods, 
:constants, 
:const_get, 
:const_set, 
:const_defined?, 
:const_missing, 
:class_variables, 
:remove_class_variable, 
:class_variable_get, 
:class_variable_set, 
:class_variable_defined?, 
:module_exec, 
:class_exec, 
:module_eval, 
:class_eval, 
:method_defined?, 
:public_method_defined?, 
:private_method_defined?, 
:protected_method_defined?, 
:public_class_method, 
:private_class_method, 
:autoload, 
:autoload?, 
:instance_method, 
:public_instance_method, 
:nil?, 
:=~, 
:!~, 
:eql?, 
:hash, 
:class, 
:singleton_class, 
:clone, 
:dup, 
:initialize_dup, 
:initialize_clone, 
:taint, 
:tainted?, 
:untaint, 
:untrust, 
:untrusted?, 
:trust, 
:frozen?, 
:inspect, 
:methods, 
:singleton_methods, 
:protected_methods, 
:private_methods, 
:public_methods, 
:instance_variables, 
:instance_variable_get, 
:instance_variable_set, 
:instance_variable_defined?, 
:instance_of?, 
:kind_of?, 
:is_a?, 
:tap, 
:send, 
:public_send, 
:respond_to?, 
:respond_to_missing?, 
:extend, 
:display, 
:method, 
:public_method, 
:define_singleton_method, 
:__id__, 
:object_id, 
:to_enum, 
:enum_for, 
:equal?, 
:!, 
:!=, 
:instance_eval, 
:instance_exec, 
:__send__] 

क्या मेटाप्रोग्रामिंग के लिए उपयोगी विधियों की एक सूची है? जैसे instance_eval, initialize और method_missing?

+3

यदि मेटाप्रोग्रामिंग रूबी एक गंभीर रुचि है, तो मैं पाओलो पेरोटा द्वारा [मेटाप्रोग्रामिंग रूबी बुक] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) की दृढ़ता से अनुशंसा करता हूं। – sarnold

उत्तर

8

यहाँ this पेज से शीर्ष जवाब है:

विधि से संबंधित हुक

method_missing 
method_added 
singleton_method_added 
method_removed 
singleton_method_removed 
method_undefined 
singleton_method_undefined 

कक्षा & मॉड्यूल हुक्स

inherited 
append_features 
included 
extend_object 
extended 
initialize_copy 
const_missing 

मार्शलिंग हुक्स

marshal_dump 
marshal_load 

बलात्कार हुक्स

coerce 
induced_from 
to_xxx 

इसके अलावा, स्पष्टीकरण और इन तरीकों में से कई के लिए नमूना कोड के लिए this ब्लॉग पोस्ट की जाँच करें।

+0

ध्यान दें कि ये महान हुक हैं, लेकिन 'instance_eval' या 'define_method' जैसी चीजें शामिल न करें। – Phrogz

5

Object एक वर्ग है, इसलिए आपके द्वारा सूचीबद्ध अधिकांश विधियां वास्तव में Class उदाहरण विधियां हैं। Object.private_methods पर भी देखें - आपको वहां define_method मिलेगा, जो बिल्कुल जरूरी है। लेकिन binding बहुत शक्तिशाली है ... रूबी मेटाप्रोग्रामिंग के बारे में सीखते समय, आप Binding कक्षा के लिए दस्तावेज़ देखना चाहेंगे। send, __send__, और public_send परिवार भी आवश्यक है।

उपर्युक्त सूची को देखते हुए, आपको "प्रतिबिंब" विधियों की पहचान करने में सक्षम होना चाहिए जिनका उपयोग स्थिरांक, विधियों, आवृत्ति चर, और प्रोग्रामेटिक रूप से इतने पर क्वेरी और हेरफेर करने के लिए किया जा सकता है। फिर eval और exec विधियां हैं। method_missing आपके द्वारा सीखने वाले पहले लोगों में से एक है, लेकिन const_missing पर भी ध्यान दें। set_trace_func और trace_var देखें। और हम alias और alias_method के बिना कहां होंगे?

तो फिर वहाँ की तरह method_added, method_removed, method_undefined, inherited, extended, included, singleton_method_added, singleton_method_removed, singleton_method_undefined, instance_method_added, instance_method_removed, और instance_method_undefined दुभाषिया "हुक" कर रहे हैं।

Object#methodMethod ऑब्जेक्ट्स प्राप्त करने के लिए आवश्यक है। Method की सभी विधियों को देखें, जिनमें owner जैसी चीजें शामिल हैं। Kernel#caller कभी-कभी उपयोगी हो सकता है। फिर ObjectSpace कक्षा भी देखें।

समझें कि हालांकि उनके पास कुछ विशेष व्यवहार है, कक्षाएं और मॉड्यूल केवल ऑब्जेक्ट्स हैं और आप उन्हें गतिशील रूप से बना सकते हैं, उन्हें डेटा संरचनाओं में स्टोर कर सकते हैं, आदि। उनके पास नाम भी नहीं हैं।आप एक नया बनाने के लिए Class.new पर कॉल कर सकते हैं और इसमें class_eval, define_method इत्यादि का उपयोग कर सकते हैं।

__LINE__ और __FILE__ दिलचस्प हो सकता है, खासकर File.read(__FILE__)

ब्लॉक और लैम्बडास को समझना सामान्य रूबी प्रोग्रामिंग के लिए और विशेष रूप से मेटाप्रोग्रामिंग दोनों के लिए महत्वपूर्ण है।

2

"मेटाप्रोग्रामिंग रूबी" पुस्तक में लेखक कहते हैं कि मेटाप्रोग्रामिंग और प्रोग्रामिंग के बीच कोई फर्म लाइन नहीं है। यह सब सिर्फ प्रोग्रामिंग है।

कुछ उदाहरण मैं सोच सकता हूं कि प्रोग्रामिंग और मेटाप्रोग्रामिंग के बीच कुछ हद तक class और attr_reader हैं।

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