tsucchi’s diary(元はてなダイアリー)

はてなダイアリー(d.hatena.ne.jp/tsucchi1022)から移行したものです

「初めての Ruby」一人勉強会 2日目

Ruby をぼちぼち勉強しています。

昨日は Yugui さんからコメントもらっちゃったし、俄然やる気!? です。


教材はコレ↓
初めてのRuby


今日は第3章。数値関連。

これを読みつつ、つぶやいてみます。

以下、つぶやきメモ。

※1 今のところ、正直あまり Ruby は好きではありません。
※2 オイラがまともにそこそこ書ける言語は C#, Java(5.0より前), Perl です。言語の機能を語っているときはその辺との比較になっているはず
※3 Ruby はまだほとんど理解していないので、的外れでトンチンカンな批判してるかも

2進数表記 (p.46 例3-2)

2進数表記ができるらしい。便利。

% irb
irb(main):001:0> a = 0b1010111
=> 87
irb(main):002:0> print a
87=> nil
定数の使い方 (p.48 表3-2)

Float の定数に浮動小数点の精度を表す諸々が定義されているらしいのだけど、定数の使い方がまだ載ってない。どうやら「クラス名::定数名」とすれば良いみたい。

irb(main):001:0> Float::DIG
=> 15
irb(main):002:0> Float::EPSILON
=> 2.22044604925031e-16
irb(main):004:0> Float::MANT_DIG
=> 53
irb(main):005:0> Float::MAX
=> 1.79769313486232e+308
irb(main):006:0> Float::MIN
=> 2.2250738585072e-308
irb(main):007:0> Float::MAX_10_EXP
=> 308
irb(main):008:0> Float::MIN_10_EXP
=> -307
irb(main):009:0> Float::MAX_EXP
=> 1024
irb(main):010:0> Float::MIN_EXP
=> -1021
irb(main):011:0> Float::RADIX
=> 2
真理値 (p.48)
% irb
irb(main):001:0> inf = 1.0/0.0
=> Infinity
irb(main):002:0> inf.infinite?
=> 1
irb(main):003:0> inf.finite?
=> false
irb(main):004:0> a = 1.0
=> 1.0
irb(main):005:0> a.infinite?
=> nil
irb(main):006:0> a.finite?
=> true

finite? と infinite? って非対称なのね。(1/nil と true/false)
多分実用上困らないだろうけど、ちょっと不思議。

割り算 (p.49)
% irb
irb(main):001:0> 7 / 0
ZeroDivisionError: divided by 0
        from (irb):1:in `/'
        from (irb):1
        from :0
irb(main):002:0> 7.0 / 0
=> Infinity

整数だと例外で小数だと無限大。つまり小数だと落ちないけど、整数だと落ちるってことね。(捕まえ損ねた場合)。気を付ける必要あるかも。

型変換 (p.50)
% irb
irb(main):001:0> 1 + "2".to_i
=> 3
irb(main):002:0> 1 + "2"
TypeError: String can't be coerced into Fixnum
        from (irb):2:in `+'
        from (irb):2
        from :0

to_i で明示的に変換しないといけないらしい。Perl 好きにはちょっとキツい。

sort (p.52)

ソートサブルーチンはこんな風に書くらしい。この書き方は Perl より好きかも。

array.sort { |x, y|
  x.some_attribute <=> y.some_attribute
}
ビット位置へのアクセス (p.53-54)
% irb
irb(main):001:0> a = 0b101010
=> 42
irb(main):002:0> a[0]
=> 0
irb(main):003:0> a[1]
=> 1

ビットの位置にアクセスできる。これは便利。

負数のビット処理(p.55)

Ruby のビットは桁数の概念がないらしい。そのため負の数をビット処理すると上位ビットが無限に続いてしまうとか。桁数を考えて、適宜マスクしなきゃダメ。(正の数も無限に0フィルされる)

% irb
irb(main):001:0> sprintf("%b", -2)
=> "..10"
irb(main):002:0> sprintf("%b", -2&0xFFFF)
=> "1111111111111110"

今回はとくにびっくりはありませんでした。数値まわりはいい感じです。

4章へ続く(多分)