Ruby:从模块中返回多个方法作为procs的更好方法

时间:2015-12-13 12:59:15

标签: ruby

从模块返回类似proc的方法非常容易:

Traceback (most recent call last):
File "/Users/File.py", line 616, in <module>
main_dic=merge_many_dics(dic1,dic2,dic3,dic4)
File "/Users/File.py", line 132, in merge_many_dics
& dic7.viewkeys() & dic8.viewkeys() & dic9.viewkeys() & dic10.viewkeys():
AttributeError: 'bool' object has no attribute 'viewkeys'

但是如果我想从同一个模块返回多个(但不是全部)方法怎么办? 一种方法是:module Foo def self.bar # Method implementation end def self.baz # Method implementation end def self.qux # Method implemenatation end def self.zoo # Method implementation end end Foo.method(:bar) # Returns a proc object

是否有更好,更敏捷的方法来做同样的事情?

3 个答案:

答案 0 :(得分:2)

试试这个:

Foo.methods(false).map {|e| Foo.method(e)}

Foo.methods(false)将返回继承为数组的所有类方法,而map将遍历每个元素。

修改

考虑下面的评论后:

proc_arr = [:bar, :baz].map {|e| Foo.method(e)}

答案 1 :(得分:2)

你总是可以使用猴子修补来使它看起来像你想要的那样:

class Object
  def get_methods(*methods)
    methods.map { |m| method(m) } 
  end
end


module Foo
  def self.bar
    # Method implementation
  end

  def self.baz
    # Method implementation
  end
end

Foo.get_methods(:foo, :baz)

答案 2 :(得分:1)

我不知道是否有更好的方法,但也许这比你的解决方案更清洁:

proc_methods = []
# => [] 
(Foo.methods - Object.methods).each { |m| proc_methods << Foo.method(m) }
# => [:bar, :baz] 
proc_methods
# => [#<Method: Foo.bar>, #<Method: Foo.baz>]

FooObject类继承其方法,这是所有Ruby对象的默认根。 (http://ruby-doc.org/core-2.2.3/Object.html

使用Foo.methods - Object.methods,您只保留自定义方法。