A module can be included in a class to share reusable methods.

mixin A mixin is a module included into a class so its methods act like instance methods.

Modules and Mixins

tracking_id
modules_mixins.rb
Replay: real traced execution (multi-file project)
module Trackable
  def tracking_label
    "tracking #{tracking_id}"
  end
end

class Shipment
  include Trackable

  def initialize(tracking_id)
    @tracking_id = tracking_id
  end

  def tracking_id
    @tracking_id
  end
end

tracking_id = 100
shipment = Shipment.new(tracking_id)

puts shipment.tracking_label
module Trackable
  def tracking_label
    "tracking #{tracking_id}"
  end
end

class Shipment
  include Trackable

  def initialize(tracking_id)
    @tracking_id = tracking_id
  end

  def tracking_id
    @tracking_id
  end
end

tracking_id = 205
shipment = Shipment.new(tracking_id)

puts shipment.tracking_label
module Trackable
  def tracking_label
    "tracking #{tracking_id}"
  end
end

class Shipment
  include Trackable

  def initialize(tracking_id)
    @tracking_id = tracking_id
  end

  def tracking_id
    @tracking_id
  end
end

tracking_id = 310
shipment = Shipment.new(tracking_id)

puts shipment.tracking_label
  1. tracking_id ← 100

    7class Shipment8  include TrackableTrackable910  def initialize(tracking_id)11    @tracking_id = tracking_id12  end1314  def tracking_id15    @tracking_id16  end17end1819tracking_id→ 100 = 100  #@tracking_id=205, 31020shipment = Shipment.new(tracking_id100)
  2. @tracking_id ← 100

    10def initialize(tracking_id100)11  @tracking_id→ 100 = tracking_id10012end
  3. shipment ← ⟨Shipment A @tracking_id=100⟩

    19tracking_id = 100  #@tracking_id=205, 31020shipment→ ⟨Shipment A @tracking_id=100⟩ = Shipment.new(tracking_id100)2122puts shipment.tracking_labeltracking 100
  4. def tracking_id

    14def tracking_id15  @tracking_id10016end
  5. puts shipment.tracking_label

    22puts shipment.tracking_labeltracking 100
    outputtracking 100
  1. tracking_id ← 205

    7class Shipment8  include TrackableTrackable910  def initialize(tracking_id)11    @tracking_id = tracking_id12  end1314  def tracking_id15    @tracking_id16  end17end1819tracking_id→ 205 = 20520shipment = Shipment.new(tracking_id205)
  2. @tracking_id ← 205

    10def initialize(tracking_id205)11  @tracking_id→ 205 = tracking_id20512end
  3. shipment ← ⟨Shipment A @tracking_id=205⟩

    19tracking_id = 20520shipment→ ⟨Shipment A @tracking_id=205⟩ = Shipment.new(tracking_id205)2122puts shipment.tracking_labeltracking 205
  4. def tracking_id

    14def tracking_id15  @tracking_id20516end
  5. puts shipment.tracking_label

    22puts shipment.tracking_labeltracking 205
    outputtracking 205
  1. tracking_id ← 310

    7class Shipment8  include TrackableTrackable910  def initialize(tracking_id)11    @tracking_id = tracking_id12  end1314  def tracking_id15    @tracking_id16  end17end1819tracking_id→ 310 = 31020shipment = Shipment.new(tracking_id310)
  2. @tracking_id ← 310

    10def initialize(tracking_id310)11  @tracking_id→ 310 = tracking_id31012end
  3. shipment ← ⟨Shipment A @tracking_id=310⟩

    19tracking_id = 31020shipment→ ⟨Shipment A @tracking_id=310⟩ = Shipment.new(tracking_id310)2122puts shipment.tracking_labeltracking 310
  4. def tracking_id

    14def tracking_id15  @tracking_id31016end
  5. puts shipment.tracking_label

    22puts shipment.tracking_labeltracking 310
    outputtracking 310