数字を数値に変換
C 言語のヘッダファイルをパースして、特定の define 文から Hash に変換するという地味な作業をしていた。
C 言語では、数字の前に 0x が付いていれば 16 進数。数字の前に 0 が付いていれば 8 進数という意味になる。
この数値リテラルのルールは Ruby でも一緒。
この地味な作業の最中にふと思った。
8 進数, 10 進数, 16 進数の文字列を簡単に数値に変換する方法はないものか。
C 言語でも Ruby でも同じ記法なら eval でできるか?
str = ["16", "020", "0x10"] str.map{|s| eval s} # => [16, 16, 16]
できた。
でも流石にこれは不採用。
いろいろやってるうちに、String#% が意外な結果を返すことに気付いた。
str = ["16", "020", "0x10"] str.map{|s| "%d" % s} # => ["16", "16", "16"]
C 言語脳で考えると SEGV 起こしそうだけど、Ruby では適切な型変換が行なわれている模様。
そこで「るりま」を見てみると、こんなことが書いてあった。
引数が整数でなければ関数 Kernel.#Integer と同じ規則で整数に変換されます。
早速やってみる。
str = ["16", "020", "0x10"] str.map{|s| Integer(s)} # => [16, 16, 16]
なんだ難しいことしなくても、これで良かったのか。
それにしても「るりま」はすばらしい。感謝。