给定一个文本命令,我需要确定需要调用项目中的哪个类和方法。例如,/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
复制相似问题