「初めてのRuby」の復習をexpectationsで(配列とハッシュ・文字列)

「初めてのRuby」を読みました。
特異メソッド・特異クラス周りについては馴染みきっていない印象です・・・知らなかったときよりは理解が深まりましたが。
その他、Rubyでの書き方や細かな動きの部分で知らないことが多く、ためになりました。


この「初めてのRuby」の復習というか、書かれていることを手に馴染ませる意味で、昨日使ったexpectaionsで例文を書き下してみたのですが、これが思ったより面白かったです。
「こういうロジックを書いたら、こういう答えを期待する」ということを、その答えを含めて記載できるし、チェックは自動でやってくれる。
irbで試しに打ち込んでみるというのでもいいのだけれど、ユニットテストで書いておけば後から振り返ることができる。(このあたりは、普通のユニットテスト書くときのメリットと同じ)


ひとまず配列・ハッシュ、あと文字列について。
(なお、内容は興味深く読んだ部分に偏ってます)

# -*- coding: utf-8 -*-
require "rubygems"
require "expectations"

Expectations do
  #2章 配列とハッシュ
  #負の添字は末尾から逆順の要素を指す
  expect 3 do
    [1,2,3][-1]
  end
  expect 2 do
    [1,2,3][-2]
  end
  #範囲外の要素はnil
  expect nil do
    [1,2,3][3]
  end

  #比較
  expect true do
    [1,2,3] == [1,2,3]
  end
  expect false do
    [1,2,3] == [1,3,2]
  end
  expect false do
    [1,2,3] == [1,2,3,4]
  end

  #メソッド
  expect [1] do
    [1,1,1,1,1].uniq
  end
  expect [1,1] do
    [1] * 2
  end
  expect true do
    [1].include? 1
  end
  expect [3,2,1] do
    [1,2,3].sort do |x, y| y <=> x end
  end
  expect [10,20,30] do
    [1,2,3].map do |x| x * 10 end
  end
  expect 6 do
    [1,2,3].inject(0) do |sum, n| sum + n end
  end

  #ハッシュ
  expect "FOO" do
    {:foo => "FOO" }[:foo]
  end
  expect true do
    {:foo => "FOO", :bar => "BAR"} == { :bar => "BAR", :foo => "FOO"}
  end

  #Enumerator
  require 'enumerator'
  expect [60, 3] do
    arr = [0, 0]
    [10, 20, 30].enum_for(:each_with_index).map do |n, index|
       arr[0] += n
       arr[1] += index
    end
    arr
  end

  #4章 文字列
  #文字列操作(Rubyの文字列はImmutable)
  expect "ab" do
    str = "a"
    str << "b"
  end
  expect "aaa" do
    "a" * 3
  end
  expect "cba" do
    "abc".reverse
  end
  expect ['3', '#{1 + 2}'] do
    ["#{1 + 2}", '#{1 + 2}']
  end
  #正規表現
  expect /ignorecase/i do
    "IgnoreCase"
  end
  #文字分割
  expect ["a", "b", "c"] do
    "a,b,c".split(/,/)
  end
  expect ["a", "b", "c"] do
    "abc".split(//)
  end
  #フォーマット
  expect "0003" do
    sprintf("%04d", 3)
  end
  #比較(文字列)
  expect [true, false] do
    ["a" == "a", "a".equal?("a")]
  end
  #比較(シンボル)
  expect [true, true] do
    [:a == :a, :a.equal?(:a)]
  end
  #マルチバイト文字列
  expect ["", "", ""] do
    "あいう".scan(/./u)  # Ruby1.8で日本語エンコーディングを意識するなら正規表現を使う
  end
end