プログラミング言語Ruby 3章 データ型とオブジェクト

プログラミング言語を理解するためには、どのようなデータをどのように処理できるのかを知っておかなければならない。

数値

Rubyのすべての数値オブジェクトはNumericのインスタンスになっている。
すべての数値オブジェクトはイミュータブル(変更できない)である。
メソッドに数値オブジェクトの参照を渡す場合でも、メソッドがオブジェクトを書き換えてしまうのではないかという心配は不要。

整数リテラル

整数値がFixnumクラスの範囲に収まる場合(31ビット)にはFixnum、そうでなければ任意のサイズの整数をサポートするBignumになる。
先頭と末尾を除き、アンダースコア(_)をつけることができる。3桁ごとのセパレータに使われることがある。(見たことない)

0
123
12345678901234567890

1_000_000_000

基数を指定することもできる。

16進
先頭が0xまたは0X
2進
先頭が0bまたは0B
8進
先頭が0oまたは0O、Cと同様に先頭の0の後に特に文字が付いていない場合
0377         # 255の8進表現
0b1111_1111  # 255の2進表現
0xFF         # 255の16進表現
浮動小数点数リテラル
6.02e23       # 6.02 × 10の23乗
1_000_000.01  # 100万とほんの少し

小数点の前後は数値でなければならない。.1と書くことはできず、0.1と書かなければならない。

Rubyの算術演算

除算の演算子は両辺のクラスによって動作を変える。

分母分子がともに整数
整数の除算で、商の端数は切り捨てられる
どちらかがFloat
浮動小数点数除算が実行される

文字列

文字列はミュータブル(変更可能)なStringクラスによって表現する。

文字列リテラル

シングルクォート

'これは単純なRuby文字列リテラルである'
'O\'Reillyの本を読みませんか?'
'この文字列リテラルの末尾は、単一のバックスラッシュ:\\'

ダブルクォート

"360°=#{2*Math::PI} ラジアン " # "360°=6.28318530717959 ラジアン"
文字列リテラルのセパレータ
%q
シングルクォート文字列のルールで書かれた文字列リテラル
%Q(またはただの%)
ダブルクォート文字列のルールで書かれた文字列リテラル

qやQの後ろの最初の文字がセパレータになる。
また、ペアになっているセパレータを使う場合(XMLの<>など)、きれいにネストされた形で使っている限り、リテラルの中のセパレータをエスケープする必要はない。

# XMLは<>のペアを使う
%<<book><title>プログラミング言語Ruby</title></book>>  # 正しい
# 式はネストされたかっこのペアを使う
%((1+(2*3)) = #{(1+(2*3))})                            # これも正しい
%(対応の取れないかっこ \( にはエスケープが必要)        # この場合はエスケープが必要
ヒアドキュメント

先頭を「<<」または「<<-」で示し、すぐ後ろに末尾のセパレータとして使われる識別子または文字列を置く。

document = <<HERE
これは文字列リテラル
2行あるが唐突に終わる…
HERE
バッククォートによるコマンド実行

バッククォート(`)で文字の並びを囲むと、Kernel.` という特殊なメソッドに渡す。
このクラスのメソッドは文字列をOSシェルコマンドとして実行し、コマンドの出力を文字列の形式で返す。
%xでも同じ。

`ls`
%x[ls]
文字列リテラルのミュータブルな性格

Rubyは文字列リテラルを検出すると新しいオブジェクトを生成するため、繰り返し本体にリテラルがあると、Rubyは繰り返しを実行するたびに新しいオブジェクトを生成する。

>> 10.times {p "test".object_id}
2157489260
2157488660
2157488540
2157488320
2157488040
2157487880
2157487760
2157487720
2157487680
2157487640
=> 10

効率を下げないようにするために、繰り返しの中でリテラルを使うのは避けたほうがよい。