はじめに
この記事は書籍「プロを目指す人のためのRuby入門」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの4日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。
今回は自分が書いたRubyプログラムをirb上で読み込む方法を説明します。
必要な前提知識
「プロを目指す人のためのRuby入門」の第5章まで読み終わっていること。
自分が書いたRubyプログラムをirb上で読み込む方法
「プロを目指す人のためのRuby入門」では、各章に例題があり、その例題をMinitestを使ってテスト駆動開発(TDD)で実装しています。
たとえば以下は第5章の例題で作成するプログラムとテストコードです(問題やコードの説明はサンプルページのPDFを参照)。
# lib/convert_length.rb
UNITS = { m: 1.0, ft: 3.28, in: 39.37 }
def convert_length(length, from: :m, to: :m)
(length / UNITS[from] * UNITS[to]).round(2)
end
# test/convert_length_test.rb
require 'minitest/autorun'
require './lib/convert_length'
class ConvertLengthTest < Minitest::Test
def test_convert_length
assert_equal 39.37, convert_length(1, from: :m, to: :in)
assert_equal 0.38, convert_length(15, from: :in, to: :m)
assert_equal 10670.73, convert_length(35000, from: :ft, to: :m)
end
end
TDDで実装していくのも楽しいのですが、完成したプログラムをirb上であれこれ引数を変えながら動かすのもまた面白いです。
自分で書いたプログラムをirb上で動かすのは難しくありません。
次のように自分が書いたコードをrequireすれば、irb内でも自作のクラスやメソッドが利用できるようになります。
$ irb
irb(main):001:0> require './lib/convert_length'
=> true
irb(main):002:0> convert_length(1, from: :m, to: :in)
=> 39.37
irb(main):003:0> convert_length(15, from: :in, to: :m)
=> 0.38
irb(main):004:0> convert_length(35000, from: :ft, to: :m)
=> 10670.73
requireで指定するパスに注意する
2.12.7項でも説明したとおり、自分で書いたプログラムを読み込むときはRubyを実行しているディレクトリからの相対パス(または絶対パス)を指定する必要があります。
パスが間違っていたり、./
で書き始めていなかったりすると読み込みに失敗します。
# 相対パスの指定が間違っているケース
require './convert_length'
#=> LoadError: cannot load such file -- ./convert_length
# "./"で書き始めていないケース
require 'lib/convert_length'
#=> LoadError: cannot load such file -- lib/convert_length
プログラムを書き直したらloadする
irb上で自分が書いたプログラムを動かす場合、単純に書き直すだけだったり、再度requireしたりしても、プログラムの変更内容はirbには反映されません。
プログラムをもう一度読み込み直すときはload
メソッドを使います。
load './lib/convert_length.rb'
詳しくは「2.12.8 load」を参照してください。
次回予告
次回はMinitestでテストをスキップする方法を紹介します。