2011-03-05 6 views
2

に基づいてメソッドを呼び出すI次のコードを持っている:あなたが見ることができるようにルビー:基準

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。 if(condition) - > if条件。そして、間違いなく、だれでも「当時」を使用しています。 – 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

Uberawesome!ありがとう! – Shyam

+1

シンボルである必要はなく、文字列でもかまいません。 –

+0

@beerlington、私はまた、 "記号で識別されたメソッドを呼び出す"ことを伝えるドキュメントを見るまでは文字列であると考えました。 ... – sled