リテラルその2

前回に引き続き、リテラルについてです。
今日は数値リテラルを学びます。

数値リテラル

まずは公式サイトのリファレンスを確認しましょう。
数値リテラル


なんかもう、さすがにこれを見たら十分でしょう、という気がしないでもないですが、せっかくなので表にしてみます。
今回は数値リテラルのうち、整数と浮動小数点数のみを取り上げます。

整数 10進表現 123
-123
0d123
16進表現 0xffff
2進表現 0b1011
8進表現 0377
0o377
浮動小数点数 1.23
1.2e-3

やはり一番自然なのは、整数ならば「123」という書き方ですし、小数ならば「1.23」みたいな形式ですね。
ですので、たぶん特別な理由が無い限りは最も自然に思える書き方をしておけば良いのだと思います。

一応、すべての書き方を試すコードを作って実行してみます。

puts('■10進整数\n')
puts(123)
puts(-123)
puts(0d123)

puts('■16進整数')
puts(0xffff)

puts('■2進整数')
puts(0b1011)

puts('■8進整数')
puts(0377)
puts(0o377)

puts('■浮動小数点数')
puts(1.23)
puts(1.2e-3)

↓実行結果

■10進整数\n
123
-123
123
■16進整数
65535
■2進整数
11
■8進整数
255
255
■浮動小数点数
1.23
0.0012

あれ、実行結果は全部10進数表記なんですね……
取り敢えずその辺は良いでしょう。とにかくこのような表記方法で、ソースコードの中で数値を表現することができます。
文字列リテラルのように特別な記号で修飾するなどの処理は基本的に必要ありませんので、特に難しくはないと思います。
以上です。


……と、軽く流したいところですが、そうもいきません。
このコードでは、見覚えの無い関数らしきものを利用しています。適当に流さずに、ちゃんとリファレンスを確認してみます。
puts
説明と実行結果を見比べて頂けると思うのですが、今回のコードでは出力時に"\n"を記述していません。
にも関わらず一回の出力毎に改行されているのがputsの働きだったりします。
また、putsのサンプルコードには次のように書かれています。

puts "foo", "bar\n", "baz"

いままでのものと違って、関数名の隣に小括弧がありません。
実はRubyでは、『関数(メソッド)に対する引数が明らかであるとき、小括弧を省略して記述することができる』、という特徴があります。
ですので、上のコードも次のように記述可能です。

puts '■10進整数\n'
puts 123
puts -123
puts 0d123

puts '■16進整数'
puts 0xffff

puts '■2進整数'
puts 0b1011

puts '■8進整数'
puts 0377
puts 0o377

puts '■浮動小数点数'
puts 1.23
puts 1.2e-3

すっきりしました。
人の目からみてもこれは明らかだろ、という場合には積極的に省略してしまってよさそうです。

10進数以外で表示したい!

まぁ、どうしてもそういう要求が出てくることもあると思います。
少なくとも、整数値に関してはその要求を簡単に満たす方法が用意されているようです。
詳しい内容は次回にまわすとして、実際のコードだけ示しておきます。

puts '■10進整数\n'
puts 123.to_s(16)  # 16進表記
puts -123.to_s(8)  #  8進表記
puts 0d123.to_s(2) #  2進表記

puts '■16進整数'
puts 0xffff.to_s(16)

puts '■2進整数'
puts 0b1011.to_s(2)

puts '■8進整数'
puts 0377.to_s(8)
puts 0o377.to_s(8)

↓実行結果

■10進整数\n
7b
-173
1111011
■16進整数
ffff
■2進整数
1011
■8進整数
377
377

ポイントの部分はこんな形式になっています。

<数値リテラル>.to_s(<基数>)

この基数の値を変更すれば、3進数だろうが12進数だろうが変換することが可能です。