Posted at

Ruby で文字列が数字だけで構成されているか判定する (簡易ユニットテスト付き)

More than 1 year has passed since last update.


ソースコード (judging_machine.rb)

class JudgingMachine

# 文字列が数字だけで構成されていれば true を返す
def number?(str)
# 文字列の先頭(\A)から末尾(\z)までが「0」から「9」の文字か
nil != (str =~ /\A[0-9]+\z/)
end

end


テストコード (judging_machine_test.rb)

require 'test/unit'

require './judging_machine'

class JudgingMachineTest < Test::Unit::TestCase
def test_number?
m = JudgingMachine.new
assert_true(m.number?('1'))
assert_true(m.number?('12'))
assert_true(m.number?('012'))
assert_false(m.number?(''))
assert_false(m.number?('+1'))
assert_false(m.number?('-1'))
assert_false(m.number?('abc'))
assert_false(m.number?('123abc'))
assert_false(m.number?('abc123'))
assert_false(m.number?("123\n"))
assert_false(m.number?("123\n123"))
assert_false(m.number?("123\nabc"))
assert_false(m.number?("\n123"))
assert_false(m.number?('123')) # 全角
assert_false(m.number?('一二三')) # 漢数字
assert_false(m.number?('ⅠⅡⅢ')) # ローマ数字
assert_false(m.number?(nil)) # nil
assert_false(m.number?(Object.new)) # 文字列じゃない
assert_false(m.number?(Array.new)) # 文字列じゃない
end
end


テストの実行結果

19個のアサーションチェックが通った。

$ ruby judging_machine_test.rb 

Loaded suite judging_machine_test
Started
.

Finished in 0.001435 seconds.
----------------------------------------------------------------------------------------------------
1 tests, 19 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
100% passed
----------------------------------------------------------------------------------------------------
696.86 tests/s, 13240.42 assertions/s


「=~」メソッドの挙動

文字列クラス String は正規表現で判定する。

instance method String#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/String/i/=3d=7e.html


正規表現 other とのマッチを行います。 マッチが成功すればマッチした位置のインデックスを、そうでなければ nil を返します。

other が正規表現でも文字列でもない場合は other =~ self を行います。


ほぼすべての親クラスである Object クラスにも「=~」メソッドが定義されている。

instance method Object#=~ (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/method/Object/i/=3d=7e.html


右辺に正規表現オブジェクトを置いた正規表現マッチ obj =~ /RE/ をサポートするためのメソッドです。 常に nil を返します。

この定義により、=~ が再定義されたオブジェクトでは正常にマッチを行い、 それ以外のものは nil を返すようになります。



Ruby に標準搭載されているユニットテストのライブラリ

ちょっとした動作確認には標準で同梱されている test/unit ライブラリが便利。

library test/unit (Ruby 2.4.0) https://docs.ruby-lang.org/ja/latest/library/test=2funit.html


ユニットテストを行うためのライブラリです。

このライブラリは 2.2.0 からbundled gem(gemファイルのみを同梱)になりました。


assert_true などのメソッドはこのあたりのリファレンスマニュアルに載っている。

Module: Test::Unit::Assertions — test-unit - test-unit

http://test-unit.github.io/test-unit/en/Test/Unit/Assertions.html


参考資料