ruby - 如何使用多态性删除比较字符串的 switch 语句?

标签 ruby json reflection polymorphism

我是 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/

相关文章:

Ruby 正则表达式组匹配,在 1 行上分配变量

java - JSON 未确定的字符串错误

ios - 如何将整数值解析为 Json iOS?

reflection - Apache Thrift 是否提供反射 API?

Ruby 确定季节(秋季、冬季、 Spring 或夏季)

css - Ruby on Rails 根据数据库更改 CSS 中的背景颜色

java - 如何在 JerseyTest 中将我的实体编码为 JSON?

c# - MissingMethodException 未处理

.net - Powershell 从字符串中生成 System.Type

ruby-on-rails - 在 rails 中查看演示者