Что такое mix-in?

Mix-in - это модуль, который используется для добавления некоторой функциональности классу. Как правило, мix-in модули обеспечивают некий протокол методов, общий для ряда классов. Например, модуль Comparable добавляет в класс ряд операторов для сравнения (<, <=, >, between?, и т.д.). Эти методы используют базовый метод сравнения <=>, однако сам этот метод в Comparable не определен.

Предположим, нужно создать класс, в котором сравнение основано на количестве ног у животных:

  class MyClass
    include Comparable
    attr :legs
    def initialize(name, legs)
     @name, @legs = name, legs
    end
    def <=>(o)
      return @legs <=> o.legs
    end
    def inspect
      @name
    end
  end
  c = MyClass.new('cat', 4)
  s = MyClass.new('snake', 0)
  p = MyClass.new('parrot', 2)
  puts  c < s            #=> false
  puts  s < c            #=> true
  puts  p >= s           #=> true
  puts p.between?(s, c)  #=> true
  p [p, s, c].sort       #=> [snake, parrot, cat]

Все, что делает MyClass - это определить свою семантику для оператора texttt<=> и включить модуль Comparable. Методы Comparable становятся неотличимы от собственных методов класса MyClass, и у класса вдруг появляется новая функциональность. А так как тот же Comparable используется во многих классах, класс MyClass будет обладать последовательной и понятной семантикой.

Вход для пользователей