在循环中使用define_method在Ruby中创建方法(通过Selenium Webdriver)

时间:2014-02-23 22:52:12

标签: ruby selenium-webdriver

我正在尝试创建一个动态执行以下操作的方法:(因为我必须在大约30个不同的子类集上实现它)

  def t1
    FooT1.new
  end

  def t2
    FooT2.new
  end

  def t3
    FooT3.new
  end

在方法生成中将有2个变量,选项卡号(t1 ... tx)和类的名称(Foo)

我尝试了以下内容,但我是Ruby的新手,无法实现这一点。

def method_generator(num_tabs, class_name)
  1.upto(num_tabs) do |i|
    define_method("t#{i}") do
      "#{class_name}_t#{i}".new
    end
  end
end

然后在子类中调用它,如下所示:

method_generator(3, "Bar")

我知道我在实施这个方面可能还很遥远,所以感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

请按以下步骤操作:

def method_generator(num_tabs, class_name)
  1.upto(num_tabs) do |i|
    class_name.send(:define_method,"t#{i}") do
      "#{class_name}_t#{i}".new
    end
  end
end

Module#define_method私有方法,因此您无法在class_name class_name.define_method(:name) do ..end上调用它,因为私有方法调用不允许使用显式接收器。但是这样做Object#send会对你有所帮助,因为这种方法适用于这种情况,你不能通过显式接收者调用私有方法。

让我们通过一个例子验证这个技巧是否有效。

class Foo;end

def method_generator(num_tabs, class_name)
  1.upto(num_tabs) do |i|
    class_name.send(:define_method,"t#{i}") do
      "#{class_name}_t#{i}".new
    end
  end
end

method_generator(3,Foo)
Foo.instance_methods(false)
# => [:t1, :t2, :t3] # see here 3 instance methods has been created of class Foo