16進数怖くないという話
「0xAが10」とかの表記をどう受け止めたらいいのかわからなかったので整理しました。
コード上での表現
プログラミング上で、これはx進数ということを示すために、数字の前に接頭語をつけて表現します。 下記の表はそれぞれに対応する接頭語です。
2進数 | 8進数 | 10進数 | 16進数 |
---|---|---|---|
0b | 0または0o | 0d | 0x |
2進数の場合
例えば、0b1011
の場合、"0b"が2進数であるということを表現していて、"1011"が2進数の数字となります。
1011は10進数に変換すると、11となるので、Rubyで実行すると、こうなります。
0b1011 => 11
つまり、2進数の場合は単純に"0b"に続く数値を10進数に変換すればどんな数値なのか理解することができます。
16進数の場合
16進数の場合、"0x"が16進数であるということを表現していて、"A"などのアルファベットが登場するのでわかりづらかったです。
16進数に登場するアルファベット、これはローマ数字では表現しきれない数値を表現しています。
例えば、2進数の場合、下記の対応図のように、2になる時に桁を繰り上げることができます。
10進数 | 2進数 |
---|---|
1 | 01 |
2 | 10 |
3 | 11 |
4 | 100 |
ところが、16進数の場合、下記の対応図のように、16になる時に桁を繰り上げようとしたら、10進数の10〜16にあたる箇所を表現できません。
10進数 | 16進数 |
---|---|
1 | 01 |
2 | 02 |
... | ... |
9 | 09 |
... | ... |
16 | 10 |
そこで、下記のようにその表現しきれない数値をローマ字で表現しているのです。
10進数 | 16進数 |
---|---|
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
16 | 10 |
実際にコマンドを打ってみると16進数の末尾の数字は、0123456789ABCDEF0123456789ABCDEF....と繰り返されていることがわかります。
まとめ
Rubyに限った話ではないので、対応表や考え方も、結構ネット上にあって自分の理解しやすいものをみつけることもできる!最初は戸惑いましたが、落ち着いて考えれば16進数怖くないはず!というお話でした。
破壊的メソッドと非破壊的メソッドの話
破壊的メソッドと非破壊的メソッドの違いと「!」についての要点をざっくりまとめました。
破壊的メソッドとは
レシーバであるオブジェクトそのものに変更を加えるメソッドのことです。
非破壊的メソッドは、その場の実行結果のみに影響しますが、破壊的メソッドは自分自身に変更を加えてしまいます。
破壊的メソッドの例
popは、配列の末尾の要素を削除してそれ自身を返し、そしてレシーバ自体を変更する破壊的メソッドです。
下記のような場合、レシーバ自体に変更がかかっていることがわかります。
# 変数aに配列を代入する a = ["hedge", "rabbit", "tiger"] # 変数aの末尾の要素("tiger")を削除してそれを返す a.pop => ["tiger"] # レシーバである変数a自体にも変更が加わっていることがわかる p a => ["hedge", "rabbit"]
非破壊的メソッドの例
sliceは、引数に応じて文字列の中から部分文字列を取り出すsliceは非破壊的メソッドです。
下記のような場合、レシーバ自体には変更がかかっていないことがわかります。
# 変数aに配列を代入する a = ["hedge", "rabbit", "tiger"] # 指定した要素を自身から取り除き、取り除いた要素を返す a.slice(0..1) => ["hedge", "rabbit"] # レシーバである変数aそのものには変更が加わっていないことがわかる p a => ["hedge", "rabbit", "tiger"]
破壊的メソッドと!
上記に登場したslice
は破壊的メソッドですが、同じ機能をもつslice!
は破壊的メソッドです。
破壊的メソッドには、!
がついていることが多いですが、pop
やshift
など、!
のつかない破壊的メソッドもあります。
slice
とslice!
のように、同じ機能をもつメソッドに、破壊的メソッドと非破壊的メソッドのパターンがある場合などは、破壊的メソッドの方に!
がついてるようです。
参照記事
”!”についての見解を詳しく書いてくださっていて大変参考になりましたmm qiita.com
例外クラス StandardError
例外クラスのStandardErrorとそのサブクラスという階層のことをまとめました。
例外クラスについて
Rubyの例外処理において、例外クラスを指定しない場合StandardErrorとそのサブクラスが補足されます。
StandardErrorとそのサブクラスとは?
StandardError
StandardErrorとは、
通常のプログラムで発生する可能性の高い 例外クラスを束ねるためのクラスです。
引用元: class StandardError (Ruby 2.5.0)
そのサブクラス
サブクラスとは親子関係のあるクラスの子の方のことで、親のメソッドを継承しています。
こういった階層構造と考えるとわかりやすそうです。
Exception(全ての例外の祖先) ∟StandardError ∟サブクラス達
で、StandardErrorのサブクラスは、つまるところ通常のプログラムで発生する可能性の高い 例外クラスです。
具体的にはこちらです。
ArgumentError EOFError EncodingError FiberError FloatDomainError IOError IndexError KeyError LocalJumpError NameError NoMethodError RangeError RegexpError RuntimeError StandardError StopIteration SystemCallError ThreadError TypeError ZeroDivisionError
Ruby 2.5.0 リファレンスマニュアル > 組み込みライブラリ > 例外クラスが、構造と内容を確認するには最適です。
ただ、上記のように一覧だけを確認したい場合については、ancestors
を利用するのが便利です。上記のStandardErrorのサブクラス一覧を表示するにあたっては、こちらの記事を参照させていただきました。さらに祖先のException
クラスにも触れていてとても参考になりましたmm