「初めての 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章へ続く(多分)