我继承了许多未被任何类或模块包装的方法,并且只列在.rb文件中。由于文件在Cucumber测试套件中使用,因此可以实现这一点。我想收集所有这些方法的集合并迭代每个方法调用,在调用它们时对每个方法调用。
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(...)
这是有效的,但它使得方法难以在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
答案 1 :(得分: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)}
答案 2 :(得分:0)
我最终制作了一系列过程