понедельник, 1 декабря 2014 г.

Определить первый родительский класс

В языке программирования Ruby каждый объект имеет как минимум один родительский класс. Однако большинство объектов имеют в цепочке наследования несколько классов. Каждый дочерний класс может переопределить метод, определенный в родительском.
Требуется написать метод
def location_in_hierarchy(object, method)
...
end
который будет принимать объект и метод и возвращать класс, в котором данный метод был впервые определен.

Сериализация и десериализация объекта класса в Ruby

Объект в языке Ruby можно представить в виде строки. Также можно преобразовать строку обратно в объект. Для этого необходимо подключить библиотеку yaml.
# encoding: utf-8
require "yaml"

class Car
  def initialize(model, speed)
    @model = model
    @speed = speed
  end

  # Десереализуем в объект
  def self.deserialize(yaml_string)
    YAML::load(yaml_string)
  end
  
  # Объект сериализуем
  def serialize
    YAML::dump(self)
  end

  def to_s
    "Car: [model = #{@model}, speed = #{@speed}]"
  end
end

audi = Car.new('Audi', 400)
yaml = audi.serialize
puts "yaml выглядит так:"
p yaml
puts "Yaml можно обратно преобразовать в объект\n: #{Car.deserialize(yaml)}"
puts

bmw = Car.new('BMW', 600)
mazda = Car.new('Mazda', 120)
cars = [bmw, mazda]

puts "Мы можем даже сериализовать массивы: #{cars}"
Программа выведет:
yaml выглядит так:
"--- !ruby/object:Car\nmodel: Audi\nspeed: 400\n"
Yaml можно обратно преобразовать в объект
: Car: [model = Audi, speed = 400]

Мы можем даже сериализовать массивы: [Car: [model = BMW, speed = 600], Car: [model = Mazda, speed = 120]]