第 35 回 Ruby/Rails 勉強会@関西の宿題

第 35 回 Ruby/Rails 勉強会@関西 の宿題。

クラスを定義してみよう

身のまわりのものをクラスとして定義してください。 まずは今日の例にあがっていたクラスを自分なりに実装して動かしてみてください。

例がたい焼きだったので、みんなお好み焼きを作っているようだった。
なので、違うものを作ってみる。

require 'forwardable'

# 名前空間のための module
module Cook
  # なべを用意
  class Pan
    extend Forwardable

    # なべには食べごろの時間と中の食材がある
    def initialize(good_for_eating)
      @good_for_eating = good_for_eating
      @ingredient = []
    end

    # なべに食材を投入
    def_delegator(:@ingredient, :<<)

    # なべを火にかける
    def boil
      @st = Time.now
    end

    # 調理の経過時間 (秒)
    def elapsed_time
      if @st.nil?
        0
      else
        Time.now - @st
      end
    end

    # 食べごろ?
    def eatable?
      if @st.nil?
        false
      else
        @good_for_eating.include?(Time.now - @st)
      end
    end
  end
end

good_for_eating に Range を与えないといけないのが、あまりにひどい。
他にも色々ひどいが気にしない。

irb から実行してみる。

require 'cook'

# カレーを作ろう
curry = Cook::Pan.new(75*60..77*60)

# 玉葱を炒める
curry << :onion             # => [:onion]
curry.boil

# 肉を炒める
curry << :beef              # => [:onion, :beef]

# にんじんを煮込む
curry << :carrot            # => [:onion, :beef, :carrot]

# 20 分ほど煮込んだら、じゃがいもを入れる
curry.elapsed_time / 60     # => 20.2281151166667
curry << :potato            # => [:onion, :beef, :carrot, :potato]

# 1 時間ほど煮込んだら、カレーのルーを入れる
curry.elapsed_time / 60     # => 60.6024656666667
curry << :curry             # => [:onion, :beef, :carrot, :potato, :curry]

# 早く食べたい ...
curry.eatable?              # => false

# まだ?
curry.eatable?              # => true

# 完成