Список методов Ruby Metaprogramming? - PullRequest
7 голосов
/ 29 февраля 2012

Только начал изучать метапрограммирование Ruby. Глядя на Object.methods я получаю:

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 ]

8 голосов
/ 29 февраля 2012

Вот главный ответ от этой страницы:

Связанные с методом крючки

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

Также проверьте это сообщение в блоге с пояснениями и примером кода для многих из этих методов.

5 голосов
/ 29 февраля 2012

Object - это класс, поэтому большинство перечисленных вами методов на самом деле являются Class методами экземпляра. Посмотрите также на Object.private_methods - там вы найдете define_method, что абсолютно необходимо. Но binding тоже очень мощный ... изучая метапрограммирование Ruby, вы захотите взглянуть на документы по классу 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#method необходим для получения Method объектов. Посмотрите на все методы Method, включая такие, как owner. Kernel#caller иногда может быть полезным. Затем также найдите класс ObjectSpace.

Поймите, что, хотя они и имеют определенное поведение, классы и модули являются просто объектами, и вы можете создавать их динамически, сохранять их в структурах данных и т. Д. Им даже не нужно иметь имена. Вы можете просто позвонить Class.new, чтобы создать новый, и использовать class_eval, define_method и т. Д., Чтобы добавить к нему методы.

__LINE__ и __FILE__ могут быть интересны, особенно File.read(__FILE__).

Понимание блоков и лямбда-символов важно как для общего программирования на Ruby, так и для метапрограммирования в частности.

2 голосов
/ 29 февраля 2012

В книге «Метапрограммирование Ruby» автор утверждает, что нет четкой грани между метапрограммированием и программированием. Это все просто программирование.

Некоторые примеры, которые я могу вспомнить, между программированием и метапрограммированием: class и attr_reader.

...