pur*_*bon 10 ruby metaprogramming class instance
我是Ruby的新手,所以还在学习.我正在研究如何动态添加方法,我成功创建了实例方法,但在创建类方法时却没有成功.
这就是我生成实例方法的方法:
class B
def before_method
puts "before method"
end
def self.run(method)
send :define_method, method do
before_method
puts "method #{method}"
end
end
end
class A < B
run :m
run :n
end
Run Code Online (Sandbox Code Playgroud)
有关创建静态方法的最佳方法的任何想法?
我的最后一项任务是寻找为类方法创建"之前"和"之后"任务的最佳方法.
Zac*_* Xu 25
要动态创建实例方法,请尝试
class Foo
LIST = %w(a b c)
LIST.each do |x|
define_method(x) do |arg|
return arg+5
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在任何Foo实例都有方法"a","b","c".尝试
Foo.new.a(10)
Run Code Online (Sandbox Code Playgroud)
要动态定义类方法,请尝试
class Foo
LIST = %w(a b c)
class << self
LIST.each do |x|
define_method(x) do |arg|
return arg+5
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后试试
Foo.a(10)
Run Code Online (Sandbox Code Playgroud)
对象singleton类的实例方法是对象本身的单例方法.所以,如果你这样做
class B
def self.run(method)
singleton_class = class << self; self; end
singleton_class.send(:define_method, method) do
puts "Method #{method}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
你现在可以打电话了
B.run :foo
B.foo
=> Method foo
Run Code Online (Sandbox Code Playgroud)
(编辑:根据Lars Haugseth的评论补充B.run:foo)
这是为了使用类方法而重新设计的内容:
class B
def self.before_method
puts "before method"
end
def self.run(method)
define_singleton_method(method) do
before_method
puts "method #{method}"
end
end
end
Run Code Online (Sandbox Code Playgroud)
更新:define_singleton_method从 Ruby 1.9开始使用,它正确分配给eigenclass。