2015-10-26 76 views
1

我已经继承了一堆没有被任何类或模块包装的方法,并且只是在.rb文件中列出。这是由于在黄瓜测试套件中使用该文件而成为可能。我想收集所有这些方法的集合并遍历每个方法调用,并在每个方法调用时对它们进行一些工作。Ruby - 方法集合

EX:

def call_all_methods 
    method1 
    method2 
    method3(true) 
    method3(false) 
    method4('Y', true) 
    method4('N', true) 
    method4('Y', false) 
    method4('N', false) 
end 

什么,我希望能够做的是包装这些阵列中的全部,并与周围

$all_methods.each do |method| 
    begin 
    method.call 
    rescue Exception1 
    handle_exception1 
    rescue Exception2 
    handle_exception2 
    end 
end 

我有一个开始/救援块分别给他们打电话尝试把它们全部放在一个数组中使用%w

call_all_methods = %w(...) 

和那个作品,但它使得方法丑陋看起来t在IDE中

我试着在文件上做一个readlines,但是这个方法在读取文件时被执行。

我可以创建方法来包装每个调用,但然后我有一个方法来调用另一种方法(一行),这是不正确的。

我已经看过Ruby: methods as array elements - how do they work?但既不这些解决方案似乎是很好的解决方案,我想要做的,因为它会脏的代码

回答

0

我最终做特效的数组

0

你可以做这样的事情:

def execute_several(arr) 
    arr.each do |method, *args| 
    begin 
     v = send(method, *args) 
     puts "for method '#{method}': #{v}" 
    rescue ArgumentError => e 
     puts "for method '#{method}': #{e.message}" 
     end 
    end 
    end 

    arr = [ 
    [:class], 
    [:rand, 20], 
    [:Integer, "20"], 
    [:Integer, 'cat'] 
    ] 

    execute_several(arr) 
    # for method 'class': Object 
    # for method 'rand': 17 
    # for method 'Integer': 20 
    # for method 'Integer': invalid value for Integer(): "cat" 

这里有一个如何将一个类中做了一个例子:

class Array 
    def execute_several(arr) 
    arr.each do |method, args| 
     begin 
     v = args ? send(method, args) : send(method) 
     puts "for method '#{method}': #{v}" 
     rescue TypeError => e 
     puts "for method '#{method}': #{e.message}" 
     end 
    end 
    end 
end 

arr = [ 
    [:reverse], 
    ['first'], 
    [:&, [2,3,4]], 
    [:|, 'cat'] 
] 

[1,2,3].execute_several(arr) 
    # for method 'reverse': [3, 2, 1] 
    # for method 'first': 1 
    # for method '&': [2, 3] 
    # for method '|': no implicit conversion of String into Array 
0

如果我理解你的要求正确,你可以只换那些满足在一个班级里上课。

class MyMethods 
    # all those methods that you have in that file 
end 

然后,你可以通过做

all_methods = MyMethods.instance_methods(false)

执行它们全部列出来,你可以做all_methods.each {|m| MyMethods.new.send(m)}

+0

其实我有之前试图实现这一点,但问题是他们中的一些人有争论。问题中列出的方法是方法调用,而不是方法声明。 –