【Week 9】rubular, ruby_fourth



# はじめに

マルチスケールシミュレーション特論の講義メモです．講義メモのインデックスは[コチラ](<https://qiita.com/e79a93e5b7b1/items/d48ad7b8df544d737a78>)

今回の参考資料は[チャート式ruby-appendix-IV(assert\_equal)](<https://qiita.com/daddygongon/items/f6cea87314ee26e130ea>)と[チャート式ruby-appendix-V(rubular)](<https://qiita.com/daddygongon/items/5e2de543400fe56be768>)です．


# チャート式 Ruby

参照記事は[コチラ](<https://qiita.com/daddygongon/items/f6cea87314ee26e130ea>)


## assert\_equal

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

早速だが作成していく．


### assert\_equal

    > emacs assert_equal.rb

まずは関数の大枠から．

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

p assert_equal(1,1)
```

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


### colorize

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

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

```ruby
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 の値を出力
-   結果を文章で出力

```ruby
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 を作成する．

```ruby
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 のメソッド名がベタ打ちされているからそこが気になるくらいかな．

```ruby
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 は使うのでテストプログラムは省いておきたい．

そこで

```ruby
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 のプログラムは以下のとおり．

```ruby
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
```

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

```ruby
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 開発周辺情報

参照記事は[コチラ](<https://qiita.com/daddygongon/items/5e2de543400fe56be768>)


## Rubular

Rubular: [<http://rubular.com>](<https://rubular.com/>) 


## Rubularとは？

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

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


# 次回の講義内容 <span class="timestamp-wrapper"><span class="timestamp">&lt;2020-11-25 Wed&gt;</span></span>

次回は [チャート式ruby-IV(Recursive Fibonacci)](<https://qiita.com/daddygongon/items/1bb27b8920c201d5c520>)だそうです．



------
 - **source** ~/grad_members_20f/members/e79a93e5b7b1/posts/class/c9_20201118.org