2014-02-03 3 views
0

Мне нужно знать, как передать вызываемые методы в виде массива, а затем запустить этот код внутри экземпляра класса.Как запустить параметр как метод в Ruby?

код фона (упрощенный, например):

class API 
    def putsWords(myWords) 
     puts myWords 
    end 

end 

class TestAssert 
    def multiply(num1, num2) 
     puts (num1 * num2) 
    end 
end 

(. В реальном мире, API, и TestAssert являются сотни строк методов, использующих и сочетающих команды для взаимодействия с веб-страниц через Watir)

То, что я не в состоянии получить работу прямо сейчас:

require_relative 'API' 
require_relative 'Asserts' 
require_relative 'LoggingIn' 

class Step 

    def initialize(actionArray, checkArray=nil) 
     @interact = API.new 
     asserting = TestAssert.new 
     actionArray.each do |action| 
      @interact.action 
     end 
     checkArray.each do |check| 
      @asserting.check 
     end 
    end 
end 

@myActionArray = Array.new 

@myActionArray << putsWords("Hello") 
    @myActionArray << putsWords("World") 


@myAssertArray = Array.new 

@myAssertArray << multiply(7, 3) 


step1 = Step.new(@myActionArray, @myAssertArray) 

Это не работает. Я получаю там сообщение об ошибке «undefined method» action »

Как я могу это сделать?

(Если вам любопытно, почему я не использую Proc или лямбда, I был, но наш архитектор сказал, что это неправильный способ сделать это, и мне нужно сделать это путь)

ответ

2

вы хотите использовать send послать произвольное сообщение для ваших объектов, и изменять входные массивы:.

@myActionArray = Array.new 
@myActionArray << ["oppAndQuote", "Acme", "QuoteTest", "", "", ""] 


@myAssertArray = Array.new 
@myAssertArray << ["assertOnPage", "QuoteTest", "didnt work"] 

Тогда вы можете просто использовать send и восклицательный знак из массива в качестве аргумента список:

@interact.send(*action) 
... 
@asserting.send(*check) 

Откровенно говоря, я думаю, что путь лямбда лучше, но если ваш архитектор хочет, чтобы это было сделано таким образом, вы так и сделаете.

+0

Как вы его написали, это как если бы каждый из предметов попадал в массив отдельно, но это не так. Один элемент массива: oppAndQuote («Acme», «QuoteTest», «», «», «» или в упрощенной версии: putsWords («Hello»). Когда я пытаюсь это сделать, я получаю «undefined method« oppAndQuote »для main: Object». – Leelluu

+0

подпись отправки - 'send (method_name, * args)', поэтому, если у вас есть массив '[methodname, arg1, arg2, ..., argn]', вы может передать его в 'send' для вызова метода с этими параметрами. Убедитесь, что это строка или символ, и что вы не пытаетесь вызвать фактический метод. –

Смежные вопросы