Ruby - 方法的集合

时间:2015-10-26 18:18:47

标签: ruby-on-rails ruby cucumber

我继承了许多未被任何类或模块包装的方法,并且只列在.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?但这些解决方案似乎都不是我想要做的好解决方案,因为它会弄脏代码

3 个答案:

答案 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)

我最终制作了一系列过程