これ僕.com:行動分析学マニアがおくる行動戦略

意図と行動のギャップから生じる「不自由さ」への挑戦。果たして僕たちに自由はあるのか?

オブジェクト倶楽部 夏イベントの感想(4) Ruby道(みち)チュートリアル

ひたすらコードを書きました。
コードを書くための空間で、
コードを書くことだけを行った時間だった。
幸せ。
ノートPCの電池が持つか心配だったけど、
ギリギリ大丈夫だった。


というわけで、レポートもつらつら文章を書くよりも、
コードを書くことにする。
演習問題になっていたStackをテストファーストで実装。

Stackの仕様
  • initialize
    • 空のスタックを作る
  • push(x)
    • スタックの最後にxを追加する
  • pop
    • スタックの最後の要素を取り除く
  • peek
    • スタックの最後の要素を返す(スタックは変更しない)
  • length
    • スタックの要素の数を返す
  • empty?
    • スタックが空なら真、空でなければ偽
Stackの実行例
s = MyStack.new
s.push(1)
s.push(4)
s.push(2)
s.peek    # 2
s.pop
s.peek    # 4
initializeとempty?の実装
require 'test/unit'
require 'my_stack'

class TestMyStack < Test::Unit::TestCase
  
  def setup
    @s = MyStack.new
  end
  
  def test_empty?
    assert(@s.empty?)
  end
end
class MyStack
  
  def initialize
    @s = []
  end
  
  def empty?
    @s.empty?
  end
end
pushとpeekの実装
     ・
     ・
  def test_push_peek
    @s.push(1)
    assert_equal(1, @s.peek)
  end
     ・
     ・
class MyStack
  
  def initialize
    @s = []
  end
  
  def empty?
    @s.empty?
  end
  
  def push(x)
    @s.push(x)
  end
  
  def peek
    @s.last
  end
end
pushとpeekの実装(テストを追加)
     ・
     ・
  def test_push_push_peek
    @s.push(3)
    assert_equal(3, @s.peek)
    @s.push(5)
    assert_equal(5, @s.peek)
  end
     ・
     ・
popの実装
     ・
     ・
  def test_push_push_peek_pop_peek
    @s.push(3)
    @s.push(5)
    @s.push(2)
    assert_equal(2, @s.peek)
    @s.pop
    assert_equal(5, @s.peek)
  end
     ・
     ・
class MyStack
  
  def initialize
    @s = []
  end
  
  def empty?
    @s.empty?
  end
  
  def push(x)
    @s.push(x)
  end
  
  def peek
    @s.last
  end
  
  def pop
    @s.pop
  end
end
Forwardableを使うようにMyStackを変更
require 'forwardable'

class MyStack
  extend Forwardable
  
  def initialize
    @s = []
  end
  
  def_delegators(:@s, :empty?, :push, :pop)
  def_delegator(:@s, :last, :peek)
end

むはー!

7/4追記
lengthを実装し忘れてる・・・orz