「たのしいRuby」 第10章 数値(Numeric)クラス

すごい勢いで食べて昼寝して…な生活をしているbonlifeです。軽くどころじゃなくヤバイです。しかも髭面ですし…。というのは置いておいて、Rubyの勉強の記録をメモしておきます。完全には消化できていないので、とりあえず練習問題のbonlife的解答(間違い含む)とコメントをメモしてみます。まずは第10章の数値(Numeric)クラスの練習問題です。

ex10-1.rb

  • 摂氏温度を華氏温度に変換するメソッドcels2fahrを定義する
  • 変換の公式は「 華氏 = 摂氏 × 9 ÷ 5 + 32 」
def cels2fahr(cels)
  cels.to_f * 9 / 5 + 32
end

p cels2fahr(32)

出力結果は以下の通り。

89.6

解答例を見て気づいたことは以下の通り。

  • String#to_fで引数を浮動小数点数(Float)に変換しているが、Float(arg)を使った方が適切な例外(ArgumentError)を発生させることができて良い
  • 明示的にreturnを書いた方が何を返すのかが分かりやすいかもしれない

ex10-2.rb

  • 華氏温度を摂氏温度に変換するメソッドfahr2celsを定義する
  • 摂氏1度から摂氏100度まで1度きざみに華氏温度との対応を出力
def cels2fahr(cels)
  cels.to_f * 9 / 5 + 32
end

def fahr2cels(fahr)
  ( fahr.to_f - 32 ) * 5 / 9
end

# far2cels()のテスト
p fahr2cels(30)

# 摂氏1度から摂氏100度まで表示
print "摂氏\t華氏\n"
100.times{|i|
  print i+1, "\t"
  print cels2fahr(i+1), "\n"
}

出力結果は以下の通り。

-1.11111111111111
摂氏	華氏
1	33.8
2	35.6
3	37.4
4	39.2
5	41.0
(中略)
96	204.8
97	206.6
98	208.4
99	210.2
100	212.0

解答例を見て気づいたことは以下の通り。

  • 後半部分の回答が準備されていない様子 (問い合わせてみます)

ex10-3.rb

  • randメソッドを使い、1から6までの数字をランダムに返すメソッドdiceを定義する
def dice
  rand(6) + 1
end

10.times{
  p dice
}

出力結果は以下の通り。

2
5
3
3
6
3
6
1
2
6

解答例を見て気づいたことは特になし。同じでした。
ex10-4.rb

  • 整数numが素数であるかどうかを調べるメソッドprime?(num)を定義する
def prime?(num)
  if (num < 2)
    return false
  end
  i = 2
  while ( i < num )
    if ( num % i == 0 )
      return false
    else
      i += 1
    end
  end
  return true
end

print "素数かどうかのチェック\n"
100.times{|i|
  print i+1, "\t"
  print prime?(i+1), "\n"
}

出力結果は以下の通り。

素数かどうかのチェック
1	false
2	true
3	true
4	false
5	true
6	false
(後略)

解答例を見て気づいたことは以下の通り。

  • numの平方根まで割り算を行って、すべての剰余が0でなければ良い、なんて文系人間にはちょっと思いつきません
  • uptoを使った方が、上記で行っているようなiをインクリメントする処理が不要でスッキリ書ける

timesやuptoなどのイテレータはすごく便利っぽいですね。まだRuby素人ですが、Rubyっぽい気がします。最初、行の末尾にセミコロン(;)を付けない書き方に違和感があったのですが、早くも慣れてきました。他の言語で簡単なスクリプトを書く時、頻繁に文法エラーを起こしてしまいそうですよ。そんなこんなで「たのしいRuby」で楽しく勉強中です。早くRailsRails言う人になりたいです。(いつになることやら…。)