2014-02-23 35 views
1

我試圖創建一個動態執行以下操作的方法:(因爲我將不得不在大約30個不同的子類集上實現此方法)在循環中使用define_method在Ruby中創建方法(通過Selenium Webdriver)

def t1 
    FooT1.new 
    end 

    def t2 
    FooT2.new 
    end 

    def t3 
    FooT3.new 
    end 

哪裏會有的方法生成2個變量中,標籤編號(T1 ... TX)和類(美孚)的名稱

我嘗試以下,但我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") 

我知道我可能很遙遠落實這一點,所以任何幫助表示讚賞。

+0

你能提供更多關於你得到什麼錯誤的信息嗎? – sheepez

回答

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_nameclass_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 
+0

謝謝,我不得不稍微改動它,以使它在我的框架中工作,Object.const_get(「#{class_name} _t#{i}」)。new,但除此之外的工作很好 – user1655679

相關問題