るびー めも

Ruby の学習メモを記す

西脇&東灘.rb 勉強会(第2回もくもく会)参加しました。

タイトルの通り、勉強会に初めて参加してきました。


Ruby 初心者のため、お題は たのしい Ruby (第2版)の自主学習です。


お見せ出来るようなアウトプットは、ありませんが


勉強会で学習した内容をメモとして github pages に纏めています。


http://yuji-shimoda.github.io/


 


勉強会の様子は、以下の写真をどうぞ


f:id:yuji_shimoda:20130414131601j:plain


 


ちなみに私は、上の写真に写っていませんのであしからず、、、


 


基本的な文法など、書籍を読み進めて


出てきたソースを、打ち込んではいますが


頭に入っていないことが、勉強会後に発覚。


 


第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])

何か変に回り道してしまいましたが、ちゃんと問題は読みましょうということで、、、