- 数値リテラル
- 文字列リテラル
- バックスラッシュ記法
- 式展開
- 文字リテラル
- コマンド出力
- ヒアドキュメント (行指向文字列リテラル)
- 正規表現リテラル
- 配列式
- ハッシュ式
- 範囲オブジェクト
- シンボル
- %記法
数値 1.5 や文字列 "hello world" のようにRubyのプログラムの中に直接記述できる値の事をリテラルといいます。
数値リテラル
1230d123-
10進整数として Integer オブジェクトを生成します。
0dは decimal(10進)を表すプリフィクスです。 -123-0d123-
符号つき10進整数として Integer オブジェクトを生成します。
123.45-
10進浮動小数点数として Float オブジェクトを生成します。
.1など.で始まる浮動小数点数は許されなくなりました。0.1と書く必要があります。 1.2e-3-
10進浮動小数点数として Float オブジェクトを生成します。
0xffff-
16進整数として Integer オブジェクトを生成します。
0xは hexadecimal(16進)を表すプリフィクスです。 0b1011-
2進整数として Integer オブジェクトを生成します。
0bは binary(2進)を表すプリフィクスです。 03770o377-
8進整数として Integer オブジェクトを生成します。
0oは octal(8進)を表すプリフィクスです。「ゼロ埋め10進整数」のつもりで
0365などと書くと8進と解釈されるので注意してください。 42r3.14r-
有理数として Rational オブジェクトを生成します。
ただし、誤解を招く恐れがあるため、
6.022e+23rのような指数部に有理数リテラルを含む形式は指定できません。 42i3.14i-
虚数として実部が
0の Complex オブジェクトを生成します。 42ri3.14ri-
虚数として実部が
0の Complex オブジェクトを生成します。iの前の形は有理数リテラルと同じです。虚部は Rational オブジェクトで表されます。
数値リテラルには、_ を含めることができます。
ruby インタプリタは _ を単に無視し、特別な解釈は何もしません。これは、大きな数値の桁数がひと目でわかるように記述するのに便利です。リテラルの最初と最後には _ を書くことはできません。リテラルの前(符号 +, - の直後を含む)に _ を置くとローカル変数やメソッド呼び出しと解釈されます。
_ は、0x などのプリフィクスの直後に書くことはできません。また、_ を連続して書いてもエラーになります。他、細かい部分でこのあたりの規則は見直され統一されました。
p 1_000_000_000 # => 1000000000
p 0xffff_ffff # => 0xffffffff
文字列リテラル
例"this is a string expression\n"
'this is a string expression\n'
%q!I said, "You said, 'She said it.'"!
%!I said, "You said, 'She said it.'"!
%Q('This is it.'\n)
"this is multi line
string"
文字列はダブルクォートまたはシングルクォートで囲まれています。ダブルクォートで囲まれた文字列ではバックスラッシュ記法と式展開(後述)が有効になります。シングルクォートで囲まれた文字列では、
\\ (バックスラッシュそのもの)と \' (シングルクォート)
を除いて文字列の中身の解釈は行われません。シングルクォートで囲まれた文字列では行末の \ は \ そのものとして解釈されます。
複数行にわたって書くこともできます。この場合含まれる改行文字は常に\nになります。実際のソースファイルの改行コードとは無関係です。
空白を間に挟んだ文字列リテラルは、コンパイル時に1つの文字列リテラルとみなされます。
p "foo" "bar"
# => "foobar"
%記法 による別形式の文字列表現もあります。
文字列式は評価されるたびに毎回新しい文字列オブジェクトを生成します。
文字列リテラルから生成される文字列オブジェクトのエンコーディングは、スクリプトエンコーディング(ソースファイルのエンコーディング。マジックコメント # encoding: で指定でき、指定がなければ UTF-8)になります。
# encoding: utf-8
p "あ".encoding # => #<Encoding:UTF-8>
String#encoding、Encoding を参照してください。
バックスラッシュ記法
文字列中でバックスラッシュ(環境によっては¥記号で表示されます)の後に記述する文字によっては特別な意味を持たせる事ができます。
\t-
タブ(0x09)
\v-
垂直タブ(0x0b)
\n-
ラインフィード(0x0a)
\r-
キャリッジリターン(0x0d)
\f-
改ページ(0x0c)
\b-
バックスペース (0x08)
\a-
ベル (0x07)
\e-
エスケープ (0x1b)
\s-
空白 (0x20)
\nnn-
ASCIIコード8進表記 (n は
0-7、1〜3桁) \xnn-
ASCIIコード16進表記 (n は
0-9,a-f,A-F、1〜2桁) \cx\C-x-
コントロール文字 (x は ASCII 文字)
\M-x-
メタ x (x は ASCII 文字)。x のコードの 0x80 のビットを立てたコードの 1 バイトを表します
\M-\C-x-
メタ コントロール x。コントロール x のコードの 0x80 のビットを立てたコードの 1 バイトを表します
\M-系が生成する 1 バイトは 0x80 以上なので、スクリプトエンコーディングが UTF-8 の場合は正しいバイト列にならず、これを含む文字列は String#valid_encoding? が false になります (\xnnで 0x80 以上を指定した場合と同様です) \x-
文字 x そのもの
\unnnn-
Unicodeのコード番号指定(n は
0-9,a-f,A-F、16進4桁)。 \u{nnnn}-
Unicodeのコード番号指定(n は
0-9,a-f,A-F、16進1〜6桁)。スペース区切りかタブ区切りで複数文字が指定できる。
例p "\u{30eb 30d3 30fc a}" # => "ルビー\n" \改行-
文字列中に改行を含めずに改行
p "foo\ bar\ baz" # => "foobar baz"
式展開
例# ($ruby = "RUBY"の場合)
p "my name is #{$ruby}" #=> "my name is RUBY"
p 'my name is #{$ruby}' #=> "my name is #{$ruby}"
ダブルクォート " で囲まれた文字列式、コマンド文字列および正規表現の中では #{式} という形式で式の内容(を文字列化したもの)を埋め込むことができます。式が変数記号($, @)で始まる変数の場合には { }を省略して、#変数名 という形式でも展開できます。文字 # に続く文字が {, $, @ でなければ、そのまま文字 # として解釈されます。明示的に式展開を止めるには # の前にバックスラッシュを置きます。
式展開中の式は、ダブルクォートなども含めて Ruby の式をそのまま書くことができます。コメントも許されます。
ただし次の例は SyntaxError となります。
式展開中の誤ったコメントの例p "#{ "string" # comment }"
式展開中のコメントは、# から } まででなく改行までです。上記の例は
p "#{ "string" # comment
}" # => "string"
と書く必要があります。
文字リテラル
? の後に文字を1字指定したものは、その文字のみからなる文字列を生成します。文字のエンコーディングはソースコードエンコーディングと同じに設定されます。
?a-
文字
aのみからなる String オブジェクトを生成します。空白類を指定する場合は、
?\s,?\tなどと書く必要があります。 ?あ-
文字
あのみからなる String オブジェクトを生成します。 ?\u3042-
文字
あ(U+3042)のみからなる String オブジェクトを生成します。エンコーディングは Encoding::UTF_8 に設定されます。
?\cA?\ca?\C-A?\C-a-
「コントロールA」のみからなる String オブジェクトを生成します。
「コントロールA」とは、文字 "A" のASCIIコードから 0x40 を引いたASCIIコードを持つ制御文字のことです。「A」の部分には
@(U+0040)から_(U+005F)までの文字を入れることができます。これによりASCIIコード 0x00〜0x1F の制御文字は全て表せます。「A」の部分に
aからzまでの小文字アルファベットを入れることもできますが、この場合、対応する大文字と同じに解釈されます。つまり?\cQと?\cqは同じです。さらに「A」の部分に
?を入れたものは特例としてASCIIコード 0x7F を持つ制御文字を表します。これら以外のASCII文字を入れることもできますが、割愛します。
?\M-a-
メタ a のみからなる String オブジェクトを生成します。
「メタ a」とは、文字 "a" のASCIIコード(0x61)の 0x80 のビットを立てたコード(0xE1)の 1 バイトを持つ文字のことです。「a」の部分には ASCII 文字を入れることができます。
ただし、0x80 以上の 1 バイトは、スクリプトエンコーディングが UTF-8 の場合には正しいバイト列にならないため、生成される文字列は String#valid_encoding? が false になります(
?\x80などで 0x80 以上のコードを直接指定した場合と同様です。ASCII-8BIT のスクリプトでは正しいバイト列として扱われます)。 ?\M-\cA?\M-\ca?\M-\C-A?\M-\C-a-
メタ-コントロール a のみからなる String オブジェクトを生成します。
「メタ-コントロール a」とは、「コントロールA」のコード(0x01)の 0x80 のビットを立てたコード(0x81)の 1 バイトを持つ文字のことです。エンコーディングが不正になりうる点は
?\M-aと同様です。
コマンド出力
例`date`
%x{ date }
バッククォート(`)で囲まれた文字列は、ダブルクォートで囲まれた文字列と同様にバックスラッシュ記法
の解釈と式展開
が行なわれた後、コマンドとして実行され、その標準出力が文字列として与えられます。コマンドは評価されるたびに実行されます。コマンドの終了ステータスを得るには、$? を参照します。
%記法 による別形式のコマンド出力もあります。
ヒアドキュメント (行指向文字列リテラル)
文法<<[(-|~)]["'`]ラベル["'`]
...
ラベル
このラベルは、クォート(" "、' '、` `)で囲まない場合は単語文字
(英数字、アンダースコア(_)、および ASCII 範囲外の文字)からなる文字列で、字句構造の識別子と異なり数字から始めることもできます(例: <<1A)。クォートで囲んだ場合は任意の文字列をラベルにできます(詳細は後述)。
普通の文字列リテラルはデリミタ(", ', ` など)で囲まれた文字列ですが、ヒアドキュメントは <<ラベル を含む行の次の行から
ラベル だけの行の直前までを文字列とする行指向のリテラルです。例えば、
print <<EOS # ラベル EOS までがリテラルになる
the string
next line
EOS
これは以下と同じです。
print " the string\n next line\n"
ヒアドキュメントでは、開始ラベル <<ラベル が文法要素としての式にあたります。これは、開始ラベルを使ってヒアドキュメント全体を引数に渡したりレシーバにしたりできるということを意味します。
# 式の中に開始ラベルを書く
# method の第二引数には " ヒアドキュメント\n" が渡される
method(arg1, <<LABEL, arg2)
ヒアドキュメント
LABEL
# ヒアドキュメントをレシーバにメソッドを呼ぶ
p <<LABEL.upcase
the lower case string
LABEL
# => "THE LOWER CASE STRING\n"
開始ラベルの次の行は常にヒアドキュメントとなります。例えば、以下のような記述は文法エラーになります
printf('%s%d',
<<EOS,
3055 * 2 / 5) # <- この行はヒアドキュメントに含まれてしまう
This line is a here document.
EOS
開始ラベルを <<-ラベル または <<~ラベル のように
- または ~ を付けて書くことで、終端行をインデントできます。このケースを除き、終端行には余分な空白やコメントさえも書くことはできません。
if need_define_foo
eval <<-EOS # '<<-' を使うと……
def foo
print "foo\n"
end
EOS
# ↑終端行をインデントできます。
end
<<-ラベル の場合は、終端行をインデントしたとしてもヒアドキュメント中の先頭の空白はそのまま文字列に現れます。
一方で <<~ラベル の場合は、最もインデントが少ない行を基準にして、全ての行の先頭から空白を取り除きます。(「最もインデントが少ない行」には、終端行は含まれません。)
begin
str_hyphen = <<-EOS
aaa
bbb
ccc
EOS
str_tilde = <<~EOS
aaa
bbb
ccc
EOS
p str_hyphen # => " aaa\n bbb\n ccc\n"
p str_tilde # => " aaa\n bbb\nccc\n"
end
インデントの深さを決定するために主にタブやスペースで構成された行は無視されるので、注意してください。しかし、エスケープされたタブやスペースは、通常の文字と同じように扱われます。
s = <<~EOS
空白4つ
空白8つ
EOS
# ↑EOSの上の行には空白2つがある
# 「最もインデントが少ない行」は、空白2つの行ではなく空白4つの行になる。
p s # => "空白4つ\n 空白8つ\n\n"
一行に複数のヒアドキュメントを書くこともできます。
print <<FIRST, <<SECOND
これは一つめのヒアドキュメントです。
まだ一つめです。
FIRST
この行からは二つめのヒアドキュメントです。
この行で終わります。
SECOND
開始ラベル <<ラベル の ラベル を(" "、' '、` `)のいずれかで囲むことで、ヒアドキュメントとなる文字列リテラルの性質は対応する文字列リテラルと同じ扱いになります。ただし、文字列中に " や ' はバックスラッシュエスケープせずにそのまま書けます(エスケープする必要がありません)。シングルクォートで囲ったヒアドキュメントの場合、' をエスケープする必要がないということは、\ の特別扱いも必要ないということになります。つまり、シングルクォートで囲ったヒアドキュメントは完全に書いたままの文字列になります。以下の例を参照してください。ラベル がクォートで囲まれていないときはダブルクォートでくくられているのと同じです。
# バックスラッシュ記法、式展開が有効
print <<"EOS"
The price is #{$price}.
EOS
# 上のものと同じ結果
print <<EOS
The price is #{$price}.
EOS
# 式展開はできない
print <<'EOS'
The price is #{$price}.
EOS
# コマンドを実行
print <<`EOC`
date
diff test.c.org test.c
EOC
文字列リテラルのそれぞれの性質に関しては 文字列リテラル、 式展開、 バックスラッシュ記法、 コマンド出力 を参照してください。
正規表現リテラル
例/^Ruby the OOPL/
/Ruby/i
/my name is #{myname}/o
%r|Ruby|
/ で囲まれた文字列は正規表現です。正規表現として解釈されるメタ文字については正規表現を参照してください。
終りの / の直後の文字は正規表現に対するオプションになります。オプションの機能は以下の通りです。
i-
正規表現はマッチ時に大文字小文字の区別を行わない
o-
一番最初に正規表現の評価が行われた時に一度だけ式展開を行う
x-
正規表現中の空白(改行も含む)を無視する。また、バックスラッシュでエスケープしない
#から改行までをコメントとみなして無視する(ただし、コメント中に/を含めると構文解析に失敗するので注意)/foo # コメント bar/xこれは
/foobar/と同じ。空白を含めるには
\␣のようにエスケープする(␣は実際にはスペース)。 m-
複数行モード。正規表現
.が改行にもマッチするようになる
正規表現中の文字は特に指定がない場合、スクリプトエンコーディングの値に従って処理されます。
オプションとして n, e, s, u のいずれかを指定することで正規表現の文字コードをスクリプトエンコーディングに関係なく個々の正規表現リテラルに指定することもできます。
%記法 による別形式の正規表現も指定できます。
正規表現の中では文字列と同じバックスラッシュ記法や 式展開も有効です。
正規表現リテラルはその中に式展開を含まなければ、何度評価されても同一の正規表現オブジェクトを返します。
式展開を含む場合は評価のたびに(式展開の結果を元に)正規表現がコンパイルされ正規表現オブジェクトが生成されます(ただし上記の o オプションを指定すれば、同一の正規表現オブジェクトを返します)
配列式
例[1, 2, 3]
%w(a b c)
%W(a b c)
文法
`[' 式`,' ... `]'
それぞれの式を評価した結果を含む配列を返します。配列はArrayクラスのインスタンスです。
要素が文字列リテラルかシンボルリテラルの場合に限り、%記法 による別形式の配列表現も指定できます。
配列式は評価されるたびに毎回新しい配列オブジェクトを生成します。
式の前に * を付けると、範囲オブジェクトなど to_a で配列に変換できるオブジェクトの要素を展開して配列に含めることができます。
p [*3..7] # => [3, 4, 5, 6, 7]
ハッシュ式
{ 1 => 2, 2 => 4, 3 => 6}
{ :a => "A", :b => "B", :c => "C" }
{ a:"A", b:"B", c:"C" } # 一つ上の例と同じ。キーがシンボルの場合はこのように書ける。
{ "a":"A", 'b':"B", "c":"C" } # 一つ上の例と同じ。
# キーにシンボルを使う文法ではこのように
# シンボル名をシングルクオートやダブルクオートで
# 囲うことができる。これによって空白を含むような
# シンボルなどをキーにできる
文法
`{' 式 `=>' 式 `,' ... `}'
`{' 識別子`:' 式 `,' ... `}'
`{' 文字列リテラル`:' 式 `,' ... `}'
それぞれの式を評価した結果をキーと値とするハッシュオブジェクトを返します。ハッシュとは任意のオブジェクトをキー(添字)として持つ配列で、Hashクラスのインスタンスです。
2 番目・3 番目の形式(コロン記法)は、キーがシンボルの場合の別記法です。識別子: 式 は :識別子 => 式 と同じです(識別子の末尾が ! や ? のものも書けます)。文字列リテラル: 式 は文字列をシンボル化したものをキーとし、識別子として書けない空白などを含むシンボルもキーにできます。
メソッドの引数、もしくは配列式の末尾に要素が1つ以上のハッシュを渡す場合は、{ } を省略できます。
method(1,2,3=>4) # method(1,2,{3=>4})
obj[1=>2,3=>4] # obj[{1=>2,3=>4}]
[1=>2,3=>4] # [{1=>2, 3=>4}]
ハッシュ式は評価されるたびに毎回新しいハッシュオブジェクトを生成します。
範囲オブジェクト
演算子式/範囲式を参照
範囲式はその両端が整数リテラルであれば、何度評価されても同じオブジェクトを返します。そうでなければ評価されるたびに新しい範囲オブジェクトを生成します。
シンボル
例# (シンボルの例)
:class
:lvar
:method!
:andthisis?
:$gvar
:@ivar
:@@cvar
:+
文法
`:' 識別子
`:' 変数名
`:' 演算子
ここでの「識別子」には、メソッド名として使う ? または ! の付いた識別子(例: :method!、:andthisis?)も含みます。
Symbolクラスのインスタンス。ある文字列と Symbol オブジェクトは一対一に対応します。
Symbol リテラルに指定できる演算子はメソッドとして再定義できる演算子だけです。演算子式 を参照して下さい。
単項演算子 !・~ にはメソッド名としての !@・~@ は存在せず、実際のメソッド名は !・~ 自身であるため、シンボル :!@・:~@ はそれぞれ :!・:~ に正規化されます。一方、単項演算子 +・- は(二項演算子の +・- とは別に)+@・-@
というメソッドが実在するため、:+@・:-@ は :+・:- とは区別されます。
p :!@ == :! # => true
p :~@ == :~ # => true
p :+@ == :+ # => false
p :-@ == :- # => false
以下の記法も使えます。
p :'foo-bar' #=> :"foo-bar"
p :"foo-bar" #=> :"foo-bar"
p %s{foo-bar} #=> :"foo-bar"
この記法では、任意のシンボルを定義できます。
:"..." の形式は、バックスラッシュ記法や
式展開が有効です。
シンボルは常に一意のオブジェクトで、(式展開を含んでいてもその結果が同じ文字列であれば)何度評価されても同じオブジェクトを返します。
シンボルのエンコーディングは、ASCII文字のみからなる場合はUS-ASCII、そうでなければスクリプトエンコーディングになります。文字列リテラルは中身がASCII文字のみでも常にスクリプトエンコーディングになる(文字列リテラル参照)のに対し、シンボルはASCII文字のみの場合にUS-ASCIIになる点が異なります。
# encoding: utf-8
p :abc.encoding # => #<Encoding:US-ASCII>
p :あ.encoding # => #<Encoding:UTF-8>
p "abc".encoding # => #<Encoding:UTF-8> (Symbolと異なりASCII文字のみでもスクリプトエンコーディングになる)
Symbol#encoding、String#encoding、Encoding を参照してください。
ほとんどのシンボルはGC可能です。
[SEE_ALSO] https://bugs.ruby-lang.org/issues/9634
%記法
文字列リテラル、コマンド出力、正規表現リテラル、配列式、シンボルでは、
% で始まる形式の記法を用いることができます。文字列や正規表現では、", / など(通常のリテラルの区切り文字)を要素に含めたい場合にバックスラッシュの数をコードから減らす効果があります。また配列式では文字列の配列やシンボルの配列を簡単に表現できます。それぞれ以下のように対応します。
%!STRING!: ダブルクォート文字列%Q!STRING!: 同上%q!STRING!: シングルクォート文字列%x!STRING!: コマンド出力%r!STRING!: 正規表現%w!STRING!: 要素が文字列の配列(空白区切り)%W!STRING!: 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効%s!STRING!: シンボル。式展開、バックスラッシュ記法は無効%i!STRING!: 要素がシンボルの配列(空白区切り)%I!STRING!: 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効
! の部分には改行を含めた任意の非英数字を使うことができます
(%w、%W、%i、%I は区切りに空白、改行を用いるため、!の部分には使うことができません)。始まりの区切り文字が括弧((,[,{,<)である時には、終りの区切り文字は対応する括弧になります。括弧を区切り文字にした場合、対応が取れていれば区切り文字と同じ括弧を要素に含めることができます。
p %(()) # => "()"
文字列の配列の%記法はシングルクォートで囲んだ文字列を空白文字で分割したのと同じです。たとえば、
%w[foo bar baz]
は ['foo', 'bar', 'baz'] と等価です。
バックスラッシュを使って空白を要素に含むこともできます。
%w[foo\ bar baz]
# => ["foo bar", "baz"]
%W は、%w と同様ですが、ダブルクォートで囲んだ文字列のように、式展開、バックスラッシュ記法が使用できます。空白による分割は式展開を評価する前に行われます。
v = "c d"
%W[a\ b #{v}e\sf #{}]
# => ["a b", "c de f", ""]
シンボルの配列の場合も文字列の配列の場合と同様です。
%i[foo\ bar baz]
# => [:"foo bar", :baz]
v = "c d"
%I[a\ b #{v}e\sf #{}]
# => [:"a b", :"c de f", :""]