Do you know how to define @@method_names
class variable so that both my_macro
and invoke_methods
can use it as intended? Thank you!
你知道如何定义@@ method_names类变量,以便my_macro和invoke_methods可以按预期使用它吗?谢谢!
module MyModule
module ClassMethods
def my_macro method_name, options = { }
define_method method_name do
puts "defining #{method_name} with #{options}"
end
@@method_names << method_name
end
end
def invoke_methods
@@method_names.each { |method_name| send method_name }
end
def self.included includer
includer.extend ClassMethods
end
end
class MyClass
include MyModule
my_macro :method_foo, :bar => 5
my_macro :method_baz, :wee => [3,4]
end
MyClass.new.invoke_methods
2 个解决方案
#1
2
Here's a working version. Changes are commented:
这是一个工作版本。更改被评论:
module MyModule
module ClassMethods
@@method_names ||= [] #move this up here
def my_macro method_name, options = { }
define_method method_name do
puts "defining #{method_name} with #{options}"
end
@@method_names << method_name
end
#added this (rename as required)
def the_methods
@@method_names
end
end
def invoke_methods
#changed this call
self.class.the_methods.each { |method_name| send method_name }
end
def self.included includer
includer.extend ClassMethods
end
end
class MyClass
include MyModule
my_macro :method_foo, :bar => 5
my_macro :method_baz, :wee => [3,4]
end
MyClass.new.invoke_methods
#2
1
module MyModule
module ClassMethods
def my_macro method_name, options = { }
define_method method_name do
puts "defining #{method_name} with #{options}"
end
@method_names ||= []
@method_names << method_name
end
def method_names
@method_names
end
end
def invoke_methods
self.class.method_names.each { |method_name| send method_name }
end
def self.included includer
includer.extend ClassMethods
end
end
class MyClass
include MyModule
my_macro :method_foo, :bar => 5
my_macro :method_baz, :wee => [3,4]
end
MyClass.new.invoke_methods
#1
2
Here's a working version. Changes are commented:
这是一个工作版本。更改被评论:
module MyModule
module ClassMethods
@@method_names ||= [] #move this up here
def my_macro method_name, options = { }
define_method method_name do
puts "defining #{method_name} with #{options}"
end
@@method_names << method_name
end
#added this (rename as required)
def the_methods
@@method_names
end
end
def invoke_methods
#changed this call
self.class.the_methods.each { |method_name| send method_name }
end
def self.included includer
includer.extend ClassMethods
end
end
class MyClass
include MyModule
my_macro :method_foo, :bar => 5
my_macro :method_baz, :wee => [3,4]
end
MyClass.new.invoke_methods
#2
1
module MyModule
module ClassMethods
def my_macro method_name, options = { }
define_method method_name do
puts "defining #{method_name} with #{options}"
end
@method_names ||= []
@method_names << method_name
end
def method_names
@method_names
end
end
def invoke_methods
self.class.method_names.each { |method_name| send method_name }
end
def self.included includer
includer.extend ClassMethods
end
end
class MyClass
include MyModule
my_macro :method_foo, :bar => 5
my_macro :method_baz, :wee => [3,4]
end
MyClass.new.invoke_methods