Есть ли простой способ определить общий интерфейс для группы не связанных между собой объектов? - PullRequest
1 голос
/ 31 июля 2010

У меня есть класс, который сериализует данные. Я могу хотеть сериализовать эти данные как JSON, или, возможно, YAML. Могу ли я в этом случае поменять местами YAML для объектов JSON? Я надеялся, что смогу сделать что-то вроде следующего. Это несбыточная мечта?

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

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

Ответы [ 2 ]

2 голосов
/ 31 июля 2010

Код, который вы написали, должен нормально работать, при условии, что оба класса 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
0 голосов
/ 31 июля 2010

Если 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...