我是 Ruby 新手,所以让我先描述一下我的问题的背景: 我有一个 json 作为输入,它具有以下键/值对:
{
"service": "update"
}
该值有许多不同的值,例如:插入、删除等。 接下来有一个方法 x 处理不同的请求:
def x(input)
case input[:service]
services = GenericService.new
when "update"
result = services.service(UpdateService.new,input)
when "insert"
result = services.service(InsertService.new,input)
when "delete"
result = services.service(DeleteService.new,input)
....
....
else
raise "Unknown service"
end
puts JSON.pretty_generate(result)
end
令我困扰的是我仍然需要使用 switch 语句来检查字符串值(让我想起“实例”呃..)。有没有更干净的方法(不需要使用开关)?
最后,我尝试寻找问题的答案,但没有成功,如果我错过了,请随时评论相关问题。
更新:我想将字符串转换为相关的类名,如下所示:How do I create a class instance from a string name in ruby?然后调用 result = services.services(x.constantize.new,input) ,那么类名当然需要与 json 的输入匹配。
最佳答案
您可以尝试以下操作:
def x(input)
service_class_name = "#{input[:service].capitalize}Service"
service_class = Kernel.const_get(service_class_name)
service_class.new(input).process
end
此外,您可能想检查这是否是有效的服务类名称。
我不明白为什么你想将服务传递给GenericService
,这看起来很奇怪。让服务做好它的工作。
关于ruby - 如何使用多态性删除比较字符串的 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36912879/