西脇&東灘.rb 勉強会(第2回もくもく会)参加しました。
タイトルの通り、勉強会に初めて参加してきました。
Ruby 初心者のため、お題は たのしい Ruby (第2版)の自主学習です。
お見せ出来るようなアウトプットは、ありませんが
勉強会で学習した内容をメモとして github pages に纏めています。
http://yuji-shimoda.github.io/
勉強会の様子は、以下の写真をどうぞ
ちなみに私は、上の写真に写っていませんのであしからず、、、
基本的な文法など、書籍を読み進めて
出てきたソースを、打ち込んではいますが
頭に入っていないことが、勉強会後に発覚。
第10章で、演習問題があるのですが
Numeric class を継承して、メソッドを定義する問題でつまづきました。
(訂正)そんなことは、書いていませんでした。(; ・`д・´)
お題は、こちら
「温度を表すときに、日本では摂氏(セルシウス)温度という単位系が使われますが、アメリカなどでは華氏(ファーレンハイト)温度という単位系が使われています。摂氏温度を華氏温度に変換するメソッドcels2fahrを定義してください。なお、摂氏温度と華氏温度の変換公式は次です。華氏=摂氏×9÷5+32」
最初に書いたソースは、以下です。
class Temperature < Numeric def initialize() end def cels2fahr(cels) @fahr = cels * 9 / 5 + 32 end end obj = Temperature.new temp = ARGV[0].to_i print "Fahrenheit is ", obj.cels2fahr(temp), ".\n"
解説は、以下でした。
与えられた摂氏温度cels
を、to_f
を使ってFloatに変換しています
(「10.4 数値型の変換」参照)。
この変換を行わないと、cels
がIntegerだった場合、
正しく計算されません(5で割るところの結果がIntegerになってしまいます)。
メソッドを呼び出す前に、to_i メソッドで Integer に変換してるから正しく計算されてないのかー、、、(当たり前ですね)
検証してみる。
class Temperature < Numeric def initialize() end def cels2fahr(cels) @fahr = cels * 9 / 5 + 32 end end obj_f = Temperature.new obj_i = Temperature.new tmp_f = ARGV[0].to_f tmp_i = ARGV[0].to_i print "obj_f.cels2fahr is ",obj_f.cels2fahr(tmp_f),".\n" print "obj_i.cels2fahr is ",obj_i.cels2fahr(tmp_i),".\n"
以下は、実行結果です。
$ ruby ./test.rb 10.9 obj_f.cels2fahr is 51.620000000000005. obj_i.cels2fahr is 50.
以下、追記
そもそも、問題からして、クラスを継承せいとは書いてませんね。
書き直したソースコードは、以下です。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- # by Yuji Shimoda def cels2fahr(cels) cels.to_f * 9 / 5 + 32 end p cels2fahr(ARGV[0])
何か変に回り道してしまいましたが、ちゃんと問題は読みましょうということで、、、