2017-02-10 48 views
2

我在“应用程序”有一个提示声明功能,如irb,其采用输入,我希望它来解析输入并执行我定义的功能。 同样,我的应用程序需要的输入通过gets,并调用函数。 例如,查找用户输入

command = gets.gsub("\n","") 

需要输入"pwd",现在我想调用的函数pwd,其定义如下:

def pwd 
    Dir.pwd 
end 

现在,我可以简单地使用if条件这样做,但许多这些条件不会像Ruby的哲学所要求的那样优雅。

我想分析的输入调用函数定义的问题。 一样,"pwd"调用pwd"ls"调用我已经定义了它的等效功能。

我该怎么做? 评论如果问题仍不清楚。 干杯。

应对可能重复

的问题提出具体要运行壳牌命令。然而,我只使用内置的Ruby方法和类,也许将来我甚至会使用Gems,以获得平台独立性。我的命令可能看起来像shell一样,但我实际上并没有运行shell。因此,我的问题不是可能的重复。

此外,未来的读者会发现它在Ruby中解析输入很有帮助。

+0

在哪里在Ruby中定义'ls'? – Stefan

+0

它不是。这才是重点。我做了我自己的功能,我会用“LS” –

+0

因此,如果命令是“PWD”,然后红宝石应该叫'Dir.pwd'调用它,如果命令是“LS”,然后红宝石应该打电话给你自己' ls'方法。那是对的吗? – Stefan

回答

1

可以在的情况下的形式写为不同的输入的映射:

case command 
when "pwd" 
    Dir.pwd # or move it into another method and call it here 
when "ls" 
    # etc 
end 

或散列,这是稍微更简洁

actions = { 
    pwd: -> { Dir.pwd }, 
    ls: -> { <foobar> } 
} 
actions[command.to_sym].call 

还可以使匹配方法名命令和使用send,但不这样做,如果输入来自陌生人的到来:

def pwd 
    Dir.pwd 
end 

command = command.to_sym 
send(command) 
+0

我已是第三个办法。但是,命令是一个字符串。 'to_sym'只会生成,例如':“pwd”' –

+0

是的,这有什么问题?你传递一个符号到'send',':“pwd”'是一个符号。 –

+0

但是不会调用'pwd',会吗? –