Ruby: вызов методов на основе критериев - PullRequest
2 голосов
/ 05 марта 2011

У меня есть следующий код:

class Engine
  attr_accessor :isRunning

  def initialize
    @isRunning = false
    @commands = ["left", "right", "brake", "accelerate", "quit"]
  end

  def start
    self.isRunning = true;
    while(self.isRunning)
      command = gets.chomp!

      if(@commands.include? command)
        puts "OK."
      else
        puts "> #{command} Unknown Command."
      end

      if(command=="quit") then
        self.stop
        puts "Quitting!"
      end
    end

  end

  def stop
    self.isRunning = false;
  end

end

Как видите, это довольно просто, однако я пытаюсь выяснить, как вызывать методы на основе критериев.Если бы я реализовал несколько методов, таких как methodOne и methodTwo, внутри класса Engine следующим образом:

@commands = ["left", "right", "brake", "accelerate", "quit", "methodOne", "methodTwo"]

def methodOne

end

def methodTwo

end

def parseCommand(command)
   if(command=="methodOne") then
   self.methodOne
   end
   if(command=="methodTwo") then
   self.methodTwo
   end
end

Могу ли я вызывать эти методы минималистично?Прямо сейчас мне пришлось бы написать большую кучу операторов if, и я бы предпочел пропустить его дальнейшее обслуживание, если это можно сделать более элегантно.

1 Ответ

3 голосов
/ 05 марта 2011

использовать self.send("methodname")

Подробнее об этом можно прочитать в Документах

Ваш код может выглядеть следующим образом:

class Engine
  # ...code ...
  def parseCommands(commands)
    commands.each{|c_command| self.send(c_command) }
  end 
  # ...code ...
end

@commands = ["left", "right", "brake", "accelerate", "quit", "methodOne", "methodTwo"]
engineInstance.parseCommands(@commands)
...