Skip to content

Instantly share code, notes, and snippets.

@ysv
Created September 4, 2019 17:29
Show Gist options
  • Select an option

  • Save ysv/821c0cc61c85b365ed9a4ba97b3c9de1 to your computer and use it in GitHub Desktop.

Select an option

Save ysv/821c0cc61c85b365ed9a4ba97b3c9de1 to your computer and use it in GitHub Desktop.
RPM_TO_SPEED_MULTIPLIER = 10
class Tire
def initialize(producer:, diameter:)
@producer = producer
@diameter = diameter
@dirty = [true, false].sample
end
def dirty
@dirty
end
end
class Engine
def initialize(capacity:, horses:)
@capacity = capacity
@horses = horses
@rpm = 0
@dirty = [true, false].sample
@is_electric = true
end
def accelerate(kilometers)
# Lets say that our speed increase linearly with rotations per second.
@rpm += kilometers * RPM_TO_SPEED_MULTIPLIER
end
def rpm
@rpm
end
def is_electric?
@is_electric
end
def dirty
@dirty
end
end
class Car
include Enumerable
def initialize(name:, engine:, tires:)
@name = name
@engine = engine
@tires_pack = tires
end
my_delegate :rpm, :accelerate, :horses, :is_electric?, to: :@engine
my_delegate :each, to: :details
my_delegate :capitalize, to: :@name
def speed
rpm * RPM_TO_SPEED_MULTIPLIER
end
def details # => Array
@tires_pack + [@engine]
end
end
def test_1
engine = Engine.new(capacity: 0, horses: 200)
tire1 = Tire.new(producer: :michelin, diameter: 17)
tire2 = Tire.new(producer: :michelin, diameter: 17)
tire3 = Tire.new(producer: :good_year, diameter: 18)
tire4 = Tire.new(producer: :good_year, diameter: 18)
c = Car.new(name: 'Nissan', engine: engine, tires: [tire1, tire2, tire3,tire4])
assert_equal c.horses, 200
assert_equal c.capitalize, 'Nissan'.capitalize
end
engine = Engine.new(capacity: 0, horses: 200)
tire1 = Tire.new(producer: :michelin, diameter: 17)
tire2 = Tire.new(producer: :michelin, diameter: 17)
tire3 = Tire.new(producer: :good_year, diameter: 18)
tire4 = Tire.new(producer: :good_year, diameter: 18)
c = Car.new(name: 'Nissan', engine: engine, tires: [tire1, tire2, tire3,tire4])
pp "INITIAL: speed: #{c.speed}"
c.accelerate(10)
pp "ACCELERATE 1: speed #{c.speed}, rpm: #{c.rpm}"
c.accelerate(20)
pp "ACCELERATE 2: speed #{c.speed}, rpm: #{c.rpm}"
pp c.each { |detail| pp detail.to_s }
pp "Finding engine details:"
pp c.find { |detail| detail.is_a?(Engine) }
pp "Finding dirty details:"
pp c.find_all {|detail| detail.dirty }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment