[英]Dynamic methods in a Module?
我有一个名为AB的模块。 现在它看起来像这样:
module AB
extend self
def some_method(hash)
....
end
....
end
我们这样使用它:AB.some_method(:thing =>:whatever,:etc =>'你明白了')。 用户必须传递大约六个字符串,我想变成动态方法,而不是AB.some_method(:thing =>:无论如何......)他们只是调用AB。无论什么(...)或AB ::无论如何(...)。 我以为我可以用method_missing做到这一点,但我想我不明白。 我做了这样的事情:
module AB
def method_missing(name,*args)
super unless THINGS.include?(name.to_s)
...
end
end
但是在试图调用AB :: what时我从未涉及过这种方法。 我想过循环使用和使用define_method,但我不知道如何定义带参数的方法。
任何帮助赞赏。
第二个代码示例中的问题是method_missing
应该声明为self.method_missing
。 以下按预期工作:
module AB
THINGS = %w(whatever)
def self.method_missing(name, *args)
super unless THINGS.include?(name.to_s)
"responding to #{name}"
end
end
p AB.whatever #=> "responding to whatever"
p AB.something #=> NoMethodError
我认为你可以使用两种不同的方法,一种是动态定义方法,另一种是依赖method_missing
。 以下是两者的示例:
# first approach, define methods
class MyClassDefine
def some_method args
p args
end
[:foo,:bar].each do |name|
define_method name do |args|
# assume args is a hash, fix me
some_method args.merge({:thing => name})
end
end
end
# second approach, use method_missing
class MyClassMissing
def some_method args
p args
end
def method_missing name, args
super unless [:foo, :bar].include? name
# again, assuming argument is a hash
some_method args.merge(:thing => name)
end
end
mcd = MyClassDefine.new
mcd.foo :etc => 'you get idea'
#=> {:etc=>"you get idea", :thing=>:foo}
mcm = MyClassMissing.new
mcm.foo :etc => 'you get idea'
#=> {:etc=>"you get idea", :thing=>:foo}
剩下要做的是覆盖方法传递方法而不是散列的情况作为参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.