给定一个文本命令,我需要确定需要调用项目中的哪个类和方法。例如,/help应该触发Generic.new.help,/edit应该分别触发user.edit函数。
我做的就是这个巨大的开关案例树,它完成了这项工作。看起来有点像,
case command
when '/help'
Generic.new.help
when '/edit'
user.edit
when /^\/action_[a-z]+$/
user.action(command)
end这是可行的,但我想知道是否有更好的解决方案。
在整个场景中唯一的额外问题是基于正则表达式的命令,例如,如果命令是/action_a或/action_b,它应该调用相同的user.action方法
发布于 2019-07-26 16:00:07
在某些user对象上调用不同的方法可能如下所示
user_methods = %w(show edit create update)
case
when user_methods.include?(command[1..-1])
user.send(command[1..-1])
end第一行以字符串形式形成有效user方法的数组。command[1..-1]表达式从command中删除第一个字符(/)。如果数组中存在command,users的send方法将对此对象调用命令。
至于正则表达式,您可以
case command
when /^\/someaction_[a-z]+$/, /^\/anotheraction_[a-z]+$/
real_cmd = command.split('_').first
user.send(real_cmd[1..-1], command)
end用下划线符号拆分命令会得到实际的操作名称,您可以像上面那样使用send命令。
https://stackoverflow.com/questions/57214506
复制相似问题