2015-10-26 75 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

其實我有之前試圖實現這一點,但問題是他們中的一些人有爭論。問題中列出的方法是方法調用,而不是方法聲明。 –