もう少し複雑なメソッドを定義してみよう。
金額を渡すと消費税を計算するメソッドを作成してみよう。 税率として「10%固定」というのでは安物電卓と変わらなくて悔しいので 税率も選べるようにしよう。
#!/usr/koeki/bin/ruby # coding: utf-8 def tax(price, ratio) # priceに値段、ratioに税率 をもらう charge = price*ratio charge.to_i end
ここで定義したtax
メソッドを
参照するときは、第1引数に金額、第2引数に税率を指定する。
tax(250, 1.10)
これでtax
メソッドで price=250, ratio=1.10
となり、税率10%で計算した結果を返してくれる。
特に何も指定しなければ採用される値のことをデフォルト値という。 たとえば、消費税は大抵の場合10%だが、食料品など特定商品にに軽減税率 8%が適用されたり、金券のように非課税(0%)となるものもある。 税率を指定しなかったら10%(1.10)ということにしておく のように メソッド定義デフォルト値を定めることができる。次のようにする。
def tax(price, ratio=1.10) # priceに値段、ratioに税率 をもらう charge = price*ratio # ratioを省略したときは 1.10 charge.to_i end
このように、仮引数の変数の後に 「=値」を書くと、 それが引数を省略した場合のデフォルト値になる。実際に次のプログラムを 動かしてみよう。
#!/usr/koeki/bin/ruby # coding: utf-8 def tax(price, ratio=1.10) # priceに値段、ratioに税率 をもらう charge = price*ratio # ratioを省略したときは 1.10 charge.to_i end STDERR.print "税抜き価格はいくらですか?: " price = gets.chomp!.to_i printf("消費税5%%だと %d 円になります.\n", tax(price)) printf("でも消費税8%%だと %d 円になるんですよ.\n", tax(price, 1.08))
引数省略時のデフォルト値は、引数リストの後ろの方からしか使えない。
○ def tax(price=1000, tax=1.1)
○ def tax(price, tax=1.10)
× def tax(price=100, tax)
× def foo(x=3, y=2, z)
○ def foo(x, y=2, z=3)
× def foo(x, y=2, z)
なぜなら、定義したメソッドを呼ぶときには引数を順番通り渡さねばならな いため、前の方の引数を省略して後ろの引数を指定することはできないからである。
配列をメソッドに渡すこともできる。次のメソッドは、 数値が複数入っている配列を受け取り、それらの値の平均値を求めるものである。
def average(score) # scoreは数値のたくさん入っている配列 sum = 0.0 # 割り算する予定なので浮動小数点数にしておく score.each do |x| sum += x end sum/score.length end
これを利用して、入力した数値全ての平均値を出力するプログラム を作ると以下のようになる。
#!/usr/koeki/bin/ruby # coding: utf-8 def average(score) # scoreは数値のたくさん入っている配列 sum = 0.0 # 割り算する予定なので浮動小数点数にしておく score.each do |x| sum += x end sum/score.length end points=[] # からっぽの配列を作る i=0 # iがpointsの添字となる while true STDERR.print "数値を入力して下さい: " line=gets if line == nil break end points[i] = line.chomp!.to_f i += 1 end printf("\n平均値は %6.2f です\n", average(points))
実際に実行してみよう。データの入力の最後には[C-d]を タイプする。
% ./average.rb 数値を入力して下さい: 1 数値を入力して下さい: 2 数値を入力して下さい: 3 数値を入力して下さい: 4 数値を入力して下さい: [C-d] 平均値は 2.50 です