Ruby 有没有一种简单的方法可以为一组不相关的对象定义一个公共接口?
我有一个序列化数据的类。我可能想将这些数据序列化为JSON,或者YAML。在这种情况下,我可以干净地将YAML交换为JSON对象吗?我希望我能做如下的事情。这是白日梦吗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
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中是对象。这是真的,但我认为在提供的示例中类名是字符串。我的错,亲爱的。因此,它们已经有了一个用于序列化的通用接口。现在,反序列化怎么样?