12
2

More than 3 years have passed since last update.

【Week 9】rubular, ruby_fourth

Last updated at Posted at 2020-12-28

はじめに

マルチスケールシミュレーション特論の講義メモです.講義メモのインデックスはコチラ

今回の参考資料はチャート式ruby-appendix-IV(assert_equal)チャート式ruby-appendix-V(rubular)です.

チャート式 Ruby

参照記事はコチラ

assert_equal

assert_equal という関数を作成する.これは期待する出力と実際の出力を比較し,それらが等しいかを確かめる関数である.テスト駆動開発ではとりあえず出力してみて,期待する出力と異なっていれば修正していくような進め方をする.そのような開発方法で assert_equal が役に立つ.(一概には言えないが)

早速だが作成していく.

assert_equal

> emacs assert_equal.rb

まずは関数の大枠から.

def assert_equal(expected, result)
  return expected == result
end

p assert_equal(1,1)

これで expected と result が等しければ true, 異なっていれば false を返す.

colorize

colorize で true なら緑, false なら赤で出力するようにする.資格的にわかりやすくするのは大切.

先ほどのプログラムで colorize を呼び出して

require 'colorize'

def assert_equal(expected, result)
  if expected == result
    puts 'true'.green
  else
    puts 'false'.red
  end
end

assert_equal(1,1)
assert_equal(1,2)

これで true なら緑,false なら赤で出力するようにできた.

脱線するが colorize では以下の色が指定できる.

> irb
irb(main):001:0> require 'colorize'
=> true
irb(main):002:0> String.colors
=> [:black, :light_black, :red, :light_red, :green, :light_green, :yellow, :light_yellow, :blue, :light_blue, :magenta, :light_magenta, :cyan, :light_cyan, :white, :light_white, :default]

出力をより rich に

これだけでは物足りないので,以下の 2 点を追加する.

  • 関数の引数である expected, result の値を出力
  • 結果を文章で出力
require 'colorize'
def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected==result
    puts "succeeded in assert_equal.\n".green
  else
    puts "failed in assert_equal.\n".red
  end
end

assert_equal(1, 1)
assert_equal(1, 2)

実行してみると

> ruby assert_equal.rb
expected :: 1
result   :: 1
succeeded in assert_equal.
expected :: 1
result   :: 2
failed in assert_equal.

文字の色も正しく出力された.

assert_not_equal

assert_equal の逆バージョン,等しくなければ true,等しければ false を返す関数 assert_not_equal を作成する.

require 'colorize'

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts "succeeded in assert_not_equal.\n".green
  else
    puts "failed in assert_not_equal.\n".red
  end
end

assert_not_equal(1,2)
assert_not_equal(1,1)
> ruby assert_not_equal_ro.rb
expected :: 1
result   :: 2
succeeded in assert_not_equal.
expected :: 1
result   :: 1
failed in assert_not_equal.

問題なく出力された.違和感.

重複箇所の整理

関数内の重複箇所といえば print 文とか?assert_equal と asset_not_equal のメソッド名がベタ打ちされているからそこが気になるくらいかな.

def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected == result
    puts "succeeded in #{__method__}.\n".green
  else
    puts "failed in #{__method__}.\n".red
  end
end

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts "succeeded in #{__method__}.\n".green
  else
    puts "failed in #{__method__}.\n".red
  end
end

assert_equal(1,1)
assert_equal(1,2)
assert_not_equal(1,2)
assert_not_equal(1,1)

こんなもん.

重複実行の予防

今後も assert_equal は使うのでテストプログラムは省いておきたい.

そこで

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

このようにしておくことで,テストプログラムの実行を回避できる.

自分が作成した assert_equal のプログラムは以下のとおり.

require 'colorize'
def assert_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected == result
    puts "succeeded in #{__method__}.\n".green
  else
    puts "failed in #{__method__}.\n".red
  end
end

def assert_not_equal(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
  if expected != result
    puts "succeeded in #{__method__}.\n".green
  else
    puts "failed in #{__method__}.\n".red
  end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1,1)
  assert_equal(1,2)
  assert_not_equal(1,2)
  assert_not_equal(1,1)
end

模範解答のプログラムは以下のとおり.

require 'colorize'
def puts_vals(expected, result)
  puts "expected :: #{expected}"
  puts "result   :: #{result}"
end
def assert_not_equal(expected, result)
  puts_vals(expected, result)
  print expected != result ?
  "succeeded in #{__method__}.\n".green :
    "failed in #{__method__}.\n".red
end
def assert_equal(expected, result)
  puts_vals(expected, result)
  print  case expected == result
     when true  ; "succeeded in #{__method__}.\n".green
     when false ; "failed in #{__method__}.\n".red
     end
end

if $PROGRAM_NAME == __FILE__
  assert_equal(1, 1)
  assert_equal(1, 2)
  assert_not_equal(1, 2)
  assert_not_equal(1, 1)
end

ここまでパーフェクトな解答は流石にできませんでした.力不足.

Ruby 開発周辺情報

参照記事はコチラ

Rubular

Rubular: http://rubular.com

Rubularとは?

正規表現を使う練習に使えるツール.用法はquick reference にまとめられているので簡単に参照できる.

個人的に正規表現の便利さも身にしめて感じているし,実際に使ったこともあったが,身にはついていない.これを機に勉強しようとおもう.

次回の講義内容 <2020-11-25 Wed>

次回は チャート式ruby-IV(Recursive Fibonacci)だそうです.


  • source ~/grad_members_20f/members/e79a93e5b7b1/posts/class/c9_20201118.org
12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2