2011-03-05 57 views
2

方法,我有以下代碼:紅寶石:調用基於標準

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:

@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 

我可以調用這些方法minimalistically?現在,我不得不寫一大堆if語句,如果可以更優雅地完成,我寧願忽略它的未來維護。

+1

地道:methodOne - > method_one。如果(條件) - >如果條件。而且,雖然正確,但幾乎沒有人使用「那麼」。 – tokland

回答

3

使用self.send("methodname")

您可以閱讀Docs

你的代碼,更多地瞭解它可能看起來像:

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

太棒了!謝謝! – Shyam

+1

它不一定是一個符號,它也可以是一個字符串。 –

+0

@beerlington,我還認爲它可能是一個字符串,直到我看看文檔告訴「調用由符號標識的方法」。雖然它使用字符串... – sled