繁体   English   中英

模块中的动态方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM