Сериализация является способом взять объект (экземпляр Вашего класса) и настроить его для транспорта - через сеть, к диску, и т.д.
Поскольку я не могу придумать никакого способа обнаружить последний вызов метода, я собираюсь предложить другой подход. Это похоже на то, что делает ActiveRecord; прокси-класс, который создает параметры и не извлекает данные, пока вы не вызовете метод, который работает с данными.
class Flickr
def initialize
@result = FlickrResult.new
end
def method_missing(method, *args, &block)
if @result.data.respond_to?(method)
@result.run(method, args, block)
else
@result.append(method, args[0])
return self
end
end
class FlickrResult
attr_reader :data
def initialize
@data = []
@keys = []
@options = {}
end
def append(key, options)
@keys << key
@options.merge!(options) if options
end
def run(method, args, block)
if !@did_run
fetch_data
end
@data.send(method, *args, &block)
end
def fetch_data
puts "Only runs once!"
@url = @keys.join(".") + "?" + @options.map {|k, v| "#{k}=#{v}" }.join("&")
# use @url and fetch data..
@data = ["foo", "bar"]
@did_run = true
end
end
end
@flickr = Flickr.new
@flickr.groups(:group_id => "123").pools.thing.users(:user_id => "456")
@flickr.each {|f| p f }
# => "Only runs once!"
# => "foo"
# => "bar"
p @flickr.map {|f| f.upcase }
# => ["FOO", "BAR"]
Он извлекает данные только тогда, когда вы каждый
или сопоставите
это или что угодно (любой метод массива).