!Ubuntu-20.04.1 !ruby-2.7.1p83
これは講義用のまとめサイトです。見た人は是非LGTMを押しといてください。
やったこと
- assert_equal
- rubular
assert_equal
まずassert_equalとは「イコールかそうでないか」を確かめる関数。
お題
1==1を判定する
一番シンプルな解法
p 1==1
rubyの場合この1行だけでtrueが返ってくる。簡単だ。
これをメソッド化する
def assert_equal(expected, result)
return expected == result
end
p 1
p assert_equal(1,1)
p 2
p assert_equal(1,2)
すると
> 1
> true
> 2
> false
と、ちゃんと判定されている
文字に色を付ける
本筋から外れますが、出力に色を付けてみることができるそうな
require 'colorize'
def assert_equal(expected,result)
if expected == result
puts 'true'.magenta
else
puts 'false'.cyan
end
end
p 1
p assert_equal(1,1)
p 2
p assert_equal(1,2)
を実行すると
> 1
> true
> nil
> 2
> false
> nil
ってqiitaだと色は分からんがな・・・色は付いたけどnilが出力されてる。ということはどこかで何かが代入されていない。何事かと思ったらassert_equalの先頭のpを除けたらnilは消えた。colorize周りで何かが起きたのか?
richな出力
・引数で取ってきたexpected, resultの値を出力
・true、false時のメッセージを出す。
を実現する
require 'colorize'
def assert_equal(expected,result)
p ['expected',expected]
p ['result',result]
if expected == result
puts 'succeeded in assert_equal'.magenta
else
puts 'failed in assert_equal'.cyan
end
end
assert_equal(1,1)
assert_equal(1,2)
これは簡単で、入力を表示するように関数内に記述するのみ。メッセージは文言を変えるだけ。#+begin_src ruby> ["expected", 1]> ["result", 1]> succeeded in assert_equal> ["expected", 1]> ["result", 2]> failed in assert_equal#end_src
関数を複数作って個別で実行できるように
assert_not_equalという関数も作っておこう
def assert_not_equal(expected,result)
p ['expected',expected]
p ['result',result]
if expected == result
puts 'failed in assert_not_equal'.magenta
else
puts 'succeeded in assert_not_equal'.cyan
end
end
#end_src
ついでにassert_equalとassert_not_equalで重複してる部分があるんで別の関数に
#begin_src_ruby
def puts_vals(expected, result)
p ['expected',expected]
p ['result',result]
end
これを別のスクリプトから呼び出したい。つまり、別のスクリプトで
assert_equal(3,2)
と書き込んで置いたら、3と2だけを比較してくれる、というようなのを作る
こういうときは
if $PROGRAM_NAME == __FILE__
assert_equal(1,1)
assert_equal(1,2)
assert_not_equal(1,2)
assert_not_equal(1,3)
end
としておくと、このコード書かれているファイルのファイル名(FILE)が動かしてるファイル($PROGRAM_NAME)と一致したら実行する、というもの。別ファイルからこのファイルを呼び出したときに、1と2なんかが比較されずに済む
別にファイルを作る
require './assert_equal'
assert_equal(3, 2)
assert_not_equal('MO_data', 'MO_date')
として実行すると#+begin_src rubyexpected :: 3result :: 2failed in assert_equal.expected :: MO_dataresult :: MO_datesucceeded in assert_not_equal.#end_srcとちゃんと判定されてる。
参考記事
- source ~/MasahiroOba/grad_members_20f/members/MasahiroOba/chapter9.org