Ruby 有没有一种简单的方法可以为一组不相关的对象定义一个公共接口?

Ruby 有没有一种简单的方法可以为一组不相关的对象定义一个公共接口?,ruby,hexagonal-architecture,Ruby,Hexagonal Architecture,我有一个序列化数据的类。我可能想将这些数据序列化为JSON,或者YAML。在这种情况下,我可以干净地将YAML交换为JSON对象吗?我希望我能做如下的事情。这是白日梦吗 FORMATS = { :json => JSON, :yaml => YAML, } def serialize(data, format) FORMATS[format].serialize(data) end 如果JSON和YAML是已经存在的类或模块,您可以编写: FORMATS = { :j

我有一个序列化数据的类。我可能想将这些数据序列化为JSON,或者YAML。在这种情况下,我可以干净地将YAML交换为JSON对象吗?我希望我能做如下的事情。这是白日梦吗

FORMATS = {
  :json => JSON,
  :yaml => YAML,
}

def serialize(data, format)
  FORMATS[format].serialize(data)
end

如果
JSON
YAML
是已经存在的类或模块,您可以编写:

FORMATS = { :json => "JSON", :yaml => "YAML" }

def serialize(data, format)
    Kernel.const_get(FORMATS[format]).serialize(data) # 'serialize' is a class method in this case
end

如果类
JSON
YAML
都有名为
serialize
的类方法,那么您编写的代码应该可以正常工作。但我认为实际存在的方法是
#dump

所以,你应该:

require 'json'
require 'yaml'

FORMATS = {
  :json => JSON,
  :yaml => YAML,
}

def serialize(data, format)
  FORMATS[format].dump(data)
end

hash = {:a => 2}
puts serialize hash, :json
#=> {"a":2}

puts serialize hash, :yaml
#=> --- 
#=> :a: 2

实际上,您不需要将类与字符串进行转换,OP发布的示例应该可以很好地工作,因为类在Ruby中是对象。这是真的,但我认为在提供的示例中类名是字符串。我的错,亲爱的。因此,它们已经有了一个用于序列化的通用接口。现在,反序列化怎么样?