ようへいの日々精進XP

よかろうもん

2018 年 07 月 04 日 (水)

ジョギング

日課

  • お休み

SRE 本輪読会

  • 月一の勉強会
  • 今日は自分が 9 章「単純さ」について話した
  • 資料のタイポもさることながら, 漢字があまりに読めないので漢字の勉強からやり直しだなって思った

明日から

  • 東京出張

今日のるびぃ ~ 数値型クラスについて ~

数値型クラスについて気になったことをメモ. 尚, irb に動作確認環境は以下の通り.

$ ruby --version
ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux]
$ irb --version
irb 0.9.6(09/06/30)

尚, Ruby技術者認定試験合格教本(Silver/Gold対応)Ruby公式資格教科書 を参考にした.

Numeric クラス

子クラスには以下のようなクラスが属している.

  • Integer (整数)
    • Fixnum
    • Bignum (大きな整数になると自動的に Bignum に拡張される)
  • Float (浮動小数点)

各クラス同士の演算

この組み合わせについて, よく忘れるので...

irb(main):001:0> # Fixnum 同士
irb(main):002:0* (1 + 1).class
=> Fixnum
irb(main):003:0> # Fixnum と Float
irb(main):004:0* (1 + 1.0).class
=> Float
irb(main):005:0> # Fixnum と Rational
irb(main):006:0* (1 + 1r).class
=> Rational
irb(main):007:0> # Float と Rational
irb(main):008:0* (1.0 + 1r).class
=> Float
irb(main):009:0> # Fixnum と Complex
irb(main):010:0* (1 + 1i).class
=> Complex
irb(main):011:0> # Float と Complex
irb(main):012:0* (1.0 + 1i).class
=> Complex
irb(main):013:0> # Ration と Complex
irb(main):014:0* (1r + 1i).class
=> Complex

数値演算

数値演算について見てみる.

irb(main):001:0> # 演算
irb(main):002:0* 1 + 2
=> 3
irb(main):003:0> 1 - 2
=> -1
irb(main):004:0> 2 * 3
=> 6
irb(main):005:0> 4 / 2
=> 2
irb(main):006:0> 4 % 3
=> 1

irb(main):007:0> # 比較
irb(main):008:0* 1 == 1
=> true
irb(main):009:0> 1 != 2
=> true
irb(main):010:0> 1 < 2
=> true
irb(main):011:0> 2 >= 2
=> true

irb(main):001:0> # UFO 演算子
irb(main):002:0* 100 <=> 10
=> 1
irb(main):003:0> 100 <=> 100
=> 0
irb(main):004:0> 10 <=> 100
=> -1

irb(main):005:0> # 自己代入演算子
irb(main):006:0* a = 100
=> 100
irb(main):007:0> a += 1
=> 101
irb(main):008:0> a -= 1
=> 100
irb(main):009:0> a *=2
=> 200
irb(main):010:0> a **=2
=> 40000
  • UFO 演算子 (比較演算子) は, 比較の結果を数値で返す
    • 左辺の値が右辺の値より大きければ 1
    • 等しければ 0
    • 左辺の値が右辺の値より小さければ -1
  • Ruby には ++-- のようなインクリメント, デクリメント演算子は存在せず, 自己代入演算子を利用する

数値型クラスに関する問題

Q1. [ x ] に記述すると, 実行結果にならないコードを全て選ぶ

# コード
puts [ x ]

# 実行結果
0.8

以下, 解答.

  • 4 / 5
  • 4 / 5r

以下, irb による確認.

irb(main):015:0> 4 / 5
=> 0
irb(main):016:0> 4 / 5r
=> (4/5)

尚, 4 / 5r については, to_f を付けると 0.8 になる.

Q2. 以下のコードを実行するとどうなるか. 該当するものを全て選ぶ

a = 1.0 + 1
a = a + (1 / 2r)
a = a + (1 + 2i)

以下, 解答.

  1. 1 行目の a の値が Float インスタンスとなる
  2. 3 行目の a お値が Complex インスタンスとなる

以下, irb にて確認.

irb(main):001:0> a = 1.0 + 1
=> 2.0
irb(main):002:0> a.class
=> Float
irb(main):003:0> a = a + (1 / 2r)
=> 2.5
irb(main):004:0> a.class
=> Float
irb(main):005:0> a = a + (1 + 2i)
=> (3.5+2i)
irb(main):006:0> a.class
=> Complex

以下, 解説より抜粋.

フムフム.