>サイトトップへ >このカテゴリの一覧へ

X 3017

:2013 (ISO/IEC 30170:2012)

(1)

目  次

ページ

序文  

1

1  適用範囲  

1

2  引用規格  

1

3  規格適合性  

2

4  用語及び定義  

2

5  記法 

4

5.1  総則  

4

5.2  構文規則  

4

5.2.1  総則  

4

5.2.2  生成規則  

5

5.2.3  項列  

6

5.2.4  項  

6

5.2.5  概念的名前  

8

5.3  意味規則  

9

5.4  実行環境の属性  

10

6  基本概念  

10

6.1  オブジェクト  

10

6.2  変数  

10

6.2.1  概要  

10

6.2.2  インスタンス変数  

11

6.3  メソッド  

11

6.4  ブロック  

12

6.5  クラス,特異クラス及びモジュール  

12

6.5.1  概要  

12

6.5.2  クラス  

12

6.5.3  特異クラス  

13

6.5.4  継承  

14

6.5.5  モジュール  

15

6.6  真理値  

16

7  実行環境  

16

7.1  概要  

16

7.2  初期状態  

17

8  字句構造  

18

8.1  概要  

18

8.2  プログラムテキスト  

18


X 3017

:2013 (ISO/IEC 30170:2012)  目次

(2)

ページ

8.3  行終端子  

18

8.4  空白類  

19

8.5  コメント  

20

8.6  プログラム終端指示子  

21

8.7  字句  

21

8.7.1  概要  

21

8.7.2  キーワード  

21

8.7.3  識別子  

21

8.7.4  区切り子  

22

8.7.5  演算子  

23

8.7.6  リテラル  

23

9  変数のスコープ  

40

9.1  概要  

40

9.2  局所変数のスコープ  

40

9.3  大域変数のスコープ  

41

10  プログラム構造  

41

10.1  プログラム  

41

10.2  複合文  

41

11  式  

42

11.1  概要  

42

11.2  論理式  

42

11.2.1  概要  

42

11.2.2  論理 NOT   

43

11.2.3  論理 AND   

43

11.2.4  論理 OR   

44

11.3  メソッド呼出し式  

44

11.3.1  概要  

44

11.3.2  メソッド実引数  

49

11.3.3  ブロック  

51

11.3.4  super   

53

11.3.5  yield   

55

11.4  演算子式  

56

11.4.1  概要  

56

11.4.2  代入  

57

11.4.3  単項演算子式  

67

11.4.4  項演算子式  

68

11.5  一次式  

72

11.5.1  概要  

72

11.5.2  制御構造  

73


X 3017

:2013 (ISO/IEC 30170:2012)  目次

(3)

ページ

11.5.3  グループ化式  

82

11.5.4  変数参照  

83

11.5.5  オブジェクト生成子  

87

12  文  

88

12.1  概要  

88

12.2  式文  

89

12.3  if 修飾文  

89

12.4  unless 修飾文  

89

12.5  while 修飾文  

89

12.6  until 修飾文  

90

12.7  rescue 修飾文  

90

13  クラス及びモジュール  

90

13.1  モジュール  

90

13.1.1  概要  

90

13.1.2  モジュール定義  

91

13.1.3  モジュールのインクルード  

92

13.2  クラス  

92

13.2.1  概要  

92

13.2.2  クラス定義  

93

13.2.3  継承  

94

13.2.4  インスタンス生成  

94

13.3  メソッド  

94

13.3.1  メソッド定義  

94

13.3.2  メソッド仮引数  

96

13.3.3  メソッド呼出し  

97

13.3.4  メソッド探索  

99

13.3.5  メソッド可視性  

99

13.3.6  alias   

100

13.3.7  undef  

101

13.4  特異クラス  

101

13.4.1  概要  

101

13.4.2  特異クラス定義  

102

13.4.3  特異メソッド定義  

103

14  例外  

104

14.1  概要  

104

14.2  例外の発生要因  

104

14.3  例外の処理  

104

15  組込みクラス及び組込みモジュール  

105

15.1  概要  

105


X 3017

:2013 (ISO/IEC 30170:2012)  目次

(4)

ページ

15.2  組込みクラス  

107

15.2.1  Object  

107

15.2.2  Module  

108

15.2.3  Class  

121

15.2.4  NilClass  

123

15.2.5  TrueClass  

124

15.2.6  FalseClass  

124

15.2.7  Numeric  

125

15.2.8  Integer  

126

15.2.9  Float  

133

15.2.10  String  

137

15.2.11  Symbol  

150

15.2.12  Array  

151

15.2.13  Hash  

158

15.2.14  Range  

165

15.2.15  Regexp  

167

15.2.16  MatchData  

175

15.2.17  Proc  

178

15.2.18  Struct  

180

15.2.19  Time  

184

15.2.20  IO  

195

15.2.21  File  

201

15.2.22  Exception  

202

15.2.23  StandardError  

204

15.2.24  ArgumentError  

204

15.2.25  LocalJumpError  

204

15.2.26  RangeError  

204

15.2.27  RegexpError  

204

15.2.28  RuntimeError  

205

15.2.29  TypeError  

205

15.2.30  ZeroDivisionError  

205

15.2.31  NameError  

205

15.2.32  NoMethodError  

206

15.2.33  IndexError  

206

15.2.34  IOError  

206

15.2.35  EOFError 

206

15.2.36  SystemCallError  

207

15.2.37  ScriptError  

207

15.2.38  SyntaxError  

207


X 3017

:2013 (ISO/IEC 30170:2012)  目次

(5)

ページ

15.2.39  LoadError  

207

15.3  組込みモジュール  

207

15.3.1  Kernel  

207

15.3.2  Enumerable  

220

15.3.3  Comparable  

226


X 3017

:2013 (ISO/IEC 30170:2012)  目次

(6)

まえがき

この規格は,工業標準化法第 14 条によって準用する第 12 条第 1 項の規定に基づき,独立行政法人情報

処理推進機構(IPA)から,工業標準原案を具して日本工業規格を改正すべきとの申出があり,日本工業

標準調査会の審議を経て,経済産業大臣が改正した日本工業規格である。

これによって,JIS X 3017:2011 は改正され,この規格に置き換えられた。

この規格は,著作権法で保護対象となっている著作物である。

この規格の一部が,特許権,出願公開後の特許出願又は実用新案権に抵触する可能性があることに注意

を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許権,出願公開後の特許出願及び実

用新案権に関わる確認について,責任はもたない。


日本工業規格

JIS

 X

3017

:2013

(ISO/IEC 30170

:2012

)

プログラム言語 Ruby

Programming languages-Ruby

序文 

この規格は,2012 年に第 1 版として発行された ISO/IEC 30170 を基に,技術的内容及び構成を変更する

ことなく作成した日本工業規格である。ISO/IEC 30170:2012 の審議過程において,表現の曖昧さを排除す

るための変更がなされたため,JIS X 3017:2011 にその修正を反映した。

なお,この規格で点線の下線を施してある参考事項は,対応国際規格にはない事項である。

適用範囲 

この規格は,プログラム言語 Ruby の構文規則及び意味規則を規定し,その規格適合処理系,規格に厳

密に適合するプログラム及び規格適合プログラムの要件を規定する。

この規格は,次の事項を規定しない。

−  規格適合処理系が評価するプログラムテキストの大きさ又は複雑さの限界。

−  規格適合処理系をサポートするために,データ処理システムが満たさなければならない最小要件。

−  データ処理システム上でプログラムの実行を起動する方法。

−  構文の誤り,又は実行時に発生したエラーを報告する方法。

注記 1 Ruby プログラムの実行とは,その《プログラム》(10.1 参照)を Ruby 処理系で評価すること

である。

注記 2  この規格の対応国際規格及びその対応の程度を表す記号を,次に示す。

ISO/IEC 30170:2012,Information technology−Programming languages−Ruby(IDT)

なお,対応の程度を表す記号“IDT”は,ISO/IEC Guide 21-1 に基づき,

“一致している”

ことを示す。

引用規格 

次に掲げる規格は,この規格に引用されることによって,この規格の規定の一部を構成する。これらの

引用規格は,記載の年の版を適用し,その後の改正版(追補を含む。

)は適用しない。

ISO/IEC 646:1991,Information technology−ISO 7-bit coded character set for information interchange

注記  対応日本工業規格:JIS X 0201:1997  7 ビット及び 8 ビットの情報交換用符号化文字集合

(MOD)

IEC 60559:1989,Binary floating-point arithmetic for microprocessor systems

注記 2011 年に改正され,ISO/IEC/IEEE 60559:2011,Information technology−Microprocessor Systems

−Floating-Point arithmetic が発行されている。

ISO/IEC 2382-1:1993,Information technology−Vocabulary−Part 1: Fundamental terms


2

X 3017

:2013 (ISO/IEC 30170:2012)

注記  対応日本工業規格:JIS X 0001:1994  情報処理用語−基本用語(MOD)

規格適合性 

Ruby の規格に厳密に適合するプログラムは,次の項目を満たさなければならない。

−  この規格が規定する機能だけを使用しなければならない。

−  いかなる未規定の動作又は処理系定義の動作に依存する出力も生成してはならない。

Ruby の規格適合処理系は,次の項目を満たさなければならない。

−  規格に厳密に適合するプログラムを,この規格の規定に従って評価しなければならない。

Ruby の規格適合処理系は,次のとおり実装してもよい。

−  規格に厳密に適合するプログラムの動作を変えない限りにおいて,この規格で規定した方法と異なる

方法でプログラムを評価してもよい。ただし,そのプログラムが組込みクラス又は組込みモジュール

(箇条 15 参照)の任意のメソッド又は定数を再定義した場合,そのプログラムの動作はこの規格で規

定されたものと異なっていてもよい(

注記 参照)。

−  この規格で規定されていない構文規則をサポートしたり,この規格で規定していない機能を利用する

プログラムを評価してもよい。

−  規格適合処理系は,処理系定義の動作並びにこの規格で規定されている以外の機能及び動作を適合性

文書に記載しなければならない。

Ruby の規格適合プログラムは,Ruby のある規格適合処理系が評価することができるプログラムとする。

−  規格適合プログラムは,

プログラムが期待する処理系定義の動作,

並びにプログラム内で使用される,

この規格で規定されている以外の機能及び期待する動作を適合性文書に記載しなければならない。

注記 1  期待する動作を記載する代わりに,その期待する動作をサポートする規格適合処理系の名前

を記載してもよい。

注記 2  例えば,規格適合処理系は,組込みクラス又は組込みモジュールのメソッドの呼出しを最適

化のために省略し,代わりにそのメソッドと同じ計算を行ってもよい。この場合,たとえ,

プログラムがそのメソッドを再定義しても,再定義されたメソッドが呼び出せないため,そ

のプログラムの動作は変更できないこともある。

用語及び定義 

この規格で用いる主な用語及び定義は ISO/IEC 2382-1:1993 によるほか,次による。その他の用語は,

その用語を実線下線で示した場所,又は構文規則の左辺に出現した場所で定義したとみなす。

4.1

ブロック(block)

メソッド呼出しに渡される手続き。

4.2

クラス(class)

オブジェクトであって,そのクラスのインスタンスと呼ばれる他のオブジェクトの集合の動作を定義す

るもの。


3

X 3017

:2013 (ISO/IEC 30170:2012)

注記  その動作は,インスタンスに対して呼び出すことのできるメソッドの集合である。

4.3

クラス変数(class variable)

あるクラスの全てのインスタンスで共有される変数。

4.4

定数(constant)

クラス又はモジュールの中で定義されるが,そのクラス又はモジュールの内からも外からもアクセスで

きる変数。

注記  通常,プログラムの実行中は定数の値が不変であることが期待されるが,この規格ではそれを

強制しない。

4.5

例外(exception)

例外的な事象の発生を表すオブジェクト。

4.6

大域変数(global variable)

プログラムのどこからでもアクセスできる変数。

4.7

処理系定義(の)(implementation-defined)

規格適合処理系の全てに実装されているが,その動作については処理系ごとに異なることを許す(連体

修飾)

4.8

インスタンスメソッド(instance method)

あるクラスのインスタンスに対して呼び出すことのできるメソッド。

4.9

インスタンス変数(instance variable)

変数であって,全てのオブジェクトがそれぞれもつ変数束縛の集合の中に存在するもの。

4.10

局所変数(local variable)

メソッド定義,ブロック,クラス定義,モジュール定義,特異クラス定義,プログラムの最上位などの

プログラム要素によって導入される,特定のスコープ内だけでアクセスできる変数。

4.11

メソッド(method)

手続きであって,オブジェクトに対して呼び出されたときに,そのオブジェクトに対する一連の計算を

実行するもの。

4.12

メソッド可視性(method visibility)

メソッドの属性であって,メソッド呼出しが許可される条件を決定するもの。

4.13

モジュール(module)

クラス又は他のモジュールに取り込まれる(以下,インクルードされるという。

)ことによって機能が提


4

X 3017

:2013 (ISO/IEC 30170:2012)

供されるオブジェクト。

4.14

オブジェクト(object)

状態及び動作をもつ計算実体。

注記  オブジェクトの動作は,そのオブジェクトに対して呼び出すことのできるメソッドの集合であ

る。

4.15

特異クラス(singleton class)

オブジェクトであって,他のオブジェクトと関連付けられ,関連付けられたオブジェクトの動作を変更

できるもの。

注記  特異クラスは,通常一つのオブジェクトに関連付けられる。ただし,規格適合処理系は,13.4.1

で記述しているように,特異クラスを複数のオブジェクトに関連付けてもよい。

4.16

特異メソッド(singleton method)

特異クラスのインスタンスメソッド。

4.17

未規定(の)(unspecified)

規格適合処理系によってその動作が異なっていてもよく,規格適合処理系が必ずしも実装していなくて

もよい(連体修飾)

4.18

変数(variable)

オブジェクトを参照する計算実体。そのオブジェクトはその変数の値と呼ばれる。

4.19

変数束縛(variable binding)

変数と,その変数によって参照されているオブジェクトとの結び付き。

記法 

5.1 

総則 

この箇条では,

“並べる”及び“区切って並べる”を,次のとおり意味を限定して用いる。

a)  の並び  (長さ の)“の並び”とは,が示す種類のものを 個 A

1

A

2

, . . . , A

n

 (n  ≧ 0)任意に用

意してそれらを順に A

1

 A

2

 . . .A

n

と並べたものをいう。長さ 0 の並びを(の)

“空列”という。

b)  を で区切って並べたもの  “を で区切って並べたもの”とは,が示す種類のものを n+1 個

A

0

A

1

A

2

, . . . , A

n

 (n  ≧ 0)任意に用意し,更に,が示す種類のものを 個 B

1

B

2

, . . . ,B

n

任意に用意し

て,それらを順に A

0

 B

1

 A

1

 B

2

 . . .B

n

 A

n

と並べたものをいう。

5.2 

構文規則 

5.2.1 

総則 

この規格では,一連の生成規則(5.2.2 参照)

,及び構文に対する自然言語で書かれた制約によって,Ruby

言語の構文規則を規定する。構文規則は,必要とする細分箇条の中に“

構文規則”という見出しを設けそ

の下に置く。


5

X 3017

:2013 (ISO/IEC 30170:2012)

5.2.2 

生成規則 

生成規則は,次の形式とし,見やすさを考慮して,適宜,改行したり空白を入れたりして表記する。

X :: Y

ここで,は非終端記号[5.2.4 b)参照]とし,は項列(5.2.3 参照)を縦線(|)で区切って並べたも

のとする。生成規則は,に並んでいる項列それぞれが表す文字の並びの集合の和集合を,非終端記号 X

が表す文字の並びの集合であると定義する。このことから,生成規則 X :: を,

の生成規則”という。

また,をこの生成規則の“左辺”といい,を“右辺”という。非終端記号 は に現れている非終端

記号をそれぞれ直接に参照するという。非終端記号 が非終端記号 を参照するという関係を,次のとお

り再帰的に定義する。

−  が を直接参照する場合,は を参照する。

−  が非終端記号 を参照し,が を参照する場合,は を参照する。

注記 1  項列は,5.2.3 に規定されるとおり,文字の並びの集合を表している。

構文規則中の自然言語で書かれた制約,又は,意味規則(5.3 参照)で,項列 に言及する“X”は,項

列 が表す文字の並びの集合の一つの要素を表す。特に,が一つの非終端記号《Y》[5.2.4  b)参照]であ

る場合,

“《Y》”は非終端記号が表す文字の並びの集合の一つの要素を表し,非終端記号《Y》自体を表す場

合は“非終端記号《Y》”と記述する。また,

“《Y》”が表す文字の並びは,

“《Y》という形式である”という。

非終端記号《Y》が非終端記号《Z》を直接参照するとき,

“《Y》の《Z》”は,《Y》が表す文字の並びのうちその

ような《Z》が表す部分を指す。

注記 2  例えば,生成規則“《X》 :: 《Y》  《Z》”の《X》が表す文字の並び は,《Y》が表す文字の並び y

と《Z》が表す文字の並び z  とから構成され,xyz  である。このとき,

“《X》の《Z》”は を指

す。

“《Y》内の《Z》”は,《Y》が表す文字の並びのうち,非終端記号《Y》が参照する《Z》が表す部分を指す。

“《Y》のそれぞれの《Z》”が表すものは,次の a)c)による。

a)  この記法は,一次項 P5.2.4 参照)に含まれて《Z》が現れており,かつ,《Y》の生成規則の右辺に,P

の 0  回以上反復[5.2.4 f)参照]である P*が現れている場合に対して用いる。

b)  《Y》の生成規則の右辺の P*を長さ nn  ≧  0)の の並びで置き換えてできるものを Y

n

とする。《Y

が表す任意の文字の並び について,Y

i

が表す文字の並びが であるような が存在する。

c)  “《Y》のそれぞれの《Z》”は,Y

i

に繰り返して現れる《Z》が表す の部分それぞれを指す。

ある細分箇条の生成規則において《Y》が参照する《Z》がただ一つしかない場合,構文規則中の自然言語で

書かれた《Y》に対する制約,又は,《Y》の意味規則において,

“《Z》”は,

“《Y》の《Z》”又は“《Y》内の《Z》”

の省略形である。

非終端記号《入力要素》(8.1 参照)

,《プログラム》(10.1 参照)及び《パターン》(15.2.15.4 参照)を開始

記号という。

注記 3  あるプログラムのプログラムテキストの解釈は,まず《入力要素》の生成規則(8.1 参照)に基

づいて字句解析を行い,その解析結果の《入力要素》に基づいて《プログラム》(10.1 参照)の

構文解析及び意味解析を行う。また,《正規表現リテラル》(8.7.6.5 参照)の解釈は《パターン》

15.2.15.4 参照)に基づいて行う。そのため,非終端記号《入力要素》,《プログラム》及び《パ

ターン》を開始記号という。

例 1  次の例は,《入力要素》の生成規則である。この生成規則は,《入力要素》は,《行終端子》,《空白


6

X 3017

:2013 (ISO/IEC 30170:2012)

類》,《コメント》,《プログラム終端指示子》又は《字句》のいずれかであることを表す。

《入力要素》 ::

  《行終端子》

|《空白類》

|《コメント》

|《プログラム終端指示子》

|《字句》

例 2  《Y》及び《Z》を次のように定義する。

Y》 ::

  《Z》  ( “#”  《Z》  )*

Z》 ::

  “a”|“b”|“(”  《Y》  “)”

このとき,《Y》の表す次のような文字の並びそれぞれに対して,

“《Y》のそれぞれの《Z》”は下線を付し

た部分それぞれを表す。

a

a#b

a#b#a

(a#b)

a#(a#b)#a

5.2.3 

項列 

項列は,項(5.2.4 参照)の並びとする。項列 は,T

1

 T

2

 . . .T

n

n  ≧  1)という並び[ここで,T

i

(1  ≦

i  ≦  n)は項とする。]であり,t

1

 t

2

 . . . t

n

という形式(ここで,t

i

は,T

i

が表す文字の並びの集合の任意の

要素とする。

)の全ての文字の並びの集合を表す。ただし,T

i

が特記項の場合の t

i

の意味は,5.2.4 d)で定義

する。

《行終端子》(8.3 参照),《空白類》(8.4 参照)及び《コメント》(8.5 参照)は,《字句》(8.7 参照)の区切

りとして使われ,通常は無視されるため,箇条 及び 15.2.15.4 以外では,《行終端子》,《空白類》及び《コ

メント》は生成規則の右辺から省かれている。すなわち,生成規則の右辺の項列の中で,項の前後には次の

ような項があるものとみなす。

  (  《行終端子》|《空白類》|《コメント》  )

*

ただし,《行終端子》又は《空白類》が表す文字の並びの集合の要素が現れてはならない場所,又は,現れ

なければならない場所をそれぞれ,特記項の禁止[5.2.4 d) 2)参照]又は必須[5.2.4 d) 3)参照]で示す。

例  次の例は,“alias”[終端記号,5.2.4 a)参照],《新しい名前》及び《別名付与対象名》を,この順番

で並べた文字の並び

(ただし,

それらの要素の間に任意の数の《行終端子》,

《空白類》及び/又は《コ

メント》があってもよい。

)を表す。

  “alias”  《新しい名前》  《別名付与対象名》

5.2.4 

 

項は,文字の並びの集合を表すか,又は,項が含まれる項列が表す文字の並びの集合に対する制約を表

す。項は,次の a)h)のいずれかとする。特に,a)c)の項を,一次項という。

注記 1  項は,再帰的に定義されていることに注意する。


7

X 3017

:2013 (ISO/IEC 30170:2012)

a)  終端記号 

タイプライタ体の文字の並びを二重引用符(“”)で囲んで表記する。終端記号は,そのタイプライタ

体の文字の並びだけからなる集合を表す。

例 1  “+”  は,+という 1 文字の並びを表す。“def”  は,def という 3 文字の並びを表す。

b)  非終端記号

その名称を二重山括弧(《》)で囲んで表記する。非終端記号が表す文字の並びの集合は,生成規則に

よって定義する。

注記 2  対応する国際規格では,非終端記号の表記に斜体字を用いている。

例 2  次の生成規則によって定義される《2 進数字》は,“0”  又は  “1”  を表す。

2進数字》 ::

  “0”|“1”

c)  一括 

項列を縦線(|)で区切って並べたものを丸括弧[

()

]で囲んで表記する。一括は,そこに並んでい

る項列それぞれが表す文字の並びの集合の和集合を表す。

例 3  次の例は,《英数字》又は《行終端子》を表す。

  (  《英数字》|《行終端子》  )

d)  特記項 

語句を角括弧(

[]

)で囲んで表記する。特記項は,その語句に応じて,次のことを特記する。

1)  否定先読み 

否定先読みは,

[先読み∉ S]と表記する。は,終端記号をカンマ(,

)で区切って並べたものを波

括弧(

{}

)で囲んで表記する。否定先読みは,に並んでいる非終端記号が表す文字の並びが,そ

の否定先読みの直後に現れてはならないという制約を表す。

例 4  次の例では,《括弧なし実引数》が “{” で始まってはならないことを示している。

《括弧なし実引数》 ::

  [先読み∉{“{”}]  《実引数リスト》

2)  禁止

禁止は,

禁止]と表記する。は,一次項とする。禁止は,そこに の表す文字の並びが現れて

はならないという制約を表す。

例 5  次の例は,そこに《行終端子》が現れてはならないことを表す。

  [《行終端子》禁止]

3)  必須

必須は,

必須]と表記する。は,一次項とする。必須は,そこに の表す文字の並びが一つ以

上現れなければならないという制約を表す。

例 6  次の例は,一つ以上の《行終端子》が現れなければならないことを表す。

  [《行終端子》必須]

4)  その他の特記項

その他の特記項は,

U]と表記する。は,d) 1)d) 3)のいずれにも該当しない語句とする。この

特記項は,が示す文字の並びの集合を表すか,又は,その特記項が含まれる項列が表す文字の並


8

X 3017

:2013 (ISO/IEC 30170:2012)

びの集合に対する,が示す制約を表す。

例 7  次の例は,《ソース文字》とは,ISO/IEC 646:1991 の国際基準版で規定された任意の文字で

あることを表す。

注記 3  ISO/IEC 646:1991 の国際基準版は,対応日本工業規格の JIS X 0201:1997 の参考 1

ISO/IEC 646 との関係)にも記載がある。

《ソース文字》 ::

  [ISO/IEC 646:1991の国際基準版で規定されている任意の文字]

例 8  次の例は,“=begin”  が行頭に現れなければならないという制約を表す。

  [行頭]  “=begin”

e)  省略可 

一次項の右肩に疑問符(?)を付けて表記する。省略可は,その一次項が表す文字の並びの集合に,文

字の空列を加えた集合を表す。

例 9  次の例は,《ブロック》があってもなくてもよいことを表す。

  《ブロック》

?

f)  0 回以上反復 

一次項の右肩にアスタリスク(*)を付けて表記する。0 回以上反復は,その一次項が表す文字の並び

の集合から,0 回以上任意の要素を取り出して並べてできる文字の並び(0 回取り出したときは文字の

空列となる。

)全てからなる集合を表す。

例 10  次の例は,《elsif 節》を 0 個以上並べた文字の並びを表す。

  《elsif節》

*

g)  1 回以上反復 

一次項の右肩に正符号(+)を付けて表記する。1 回以上反復は,その一次項が表す文字の並びの集合

から,1 回以上任意の要素を取り出して並べてできる文字の並び全てからなる集合を表す。

例 11  次の例は,《when 節》を 1 個以上並べた文字の並びを表す。

  《when節》

+

h)  除外 

二つの一次項の間に負符号(−)を置いて表記する。除外は,負符号の左の一次項が表す文字の並び

の集合から,負符号の右の一次項が表す文字の並び全てを取り除いてできる集合を表す。

注記 4  対応する国際規格では,“but not”を用いて除外を表記しているが,この規格では,代わり

に負符号(−)を使用する。

例 12  次の例は,《一重引用符文字列メタ文字》でない《ソース文字》を表す。

  《ソース文字》  −  《一重引用符文字列メタ文字》

5.2.5 

概念的名前 

開始記号が参照していない非終端記号(ただし,開始記号を除く。

)を概念的名前という。概念的名前と

非終端記号とを区別するため,概念的名前に対する生成規則は,::  を ::= に置き換えて表記する。

注記  この規格では,意味的に関連のある非終端記号が,構文規則上では離れた位置にあることがあ

る。このような非終端記号をまとめる名前[例えば,《代入》(11.4.2 参照)

]を付けるために,


9

X 3017

:2013 (ISO/IEC 30170:2012)

概念的名前を使用する。また,概念的名前は,意味規則の中だけで参照する非終端記号[例え

ば,《2 項演算子》(11.4.4 参照)

]を定義する場合にも使用する。

例  次の例は,《代入》という概念的名前を定義する。《代入》は,《代入式》又は《代入文》のいずれかに

言及するために使うことができる。

《代入》 ::=

  《代入式》

|《代入文》

5.3 

意味規則 

構文規則に対応する意味規則は,必要とする細分箇条の中に“

意味規則”という見出しを設けその下に

記す。この規格では,プログラムの動作を,そのプログラムを評価するという過程によって規定する。プ

ログラム構成要素(非終端記号の表す文字の並び)を評価すると,通常,値がもたらされる。これをその

プログラム構成要素の(評価結果の)値という。意味規則は,対応する構文規則で規定されるプログラム

構成要素に対する評価の方法と評価結果の値とを規定する。

意味規則に記述されたあるプログラム構成要素に対する評価の手順の開始を,そのプログラム構成要素

の評価の開始,そのプログラム構成要素に対して行うべき手順がなくなった時点を,そのプログラム構成

要素の評価の終了という。あるプログラム構成要素の評価が開始され,かつ,そのプログラム構成要素の

評価が終了していない場合,そのプログラム構成要素は評価中であるという。

ある非終端記号 に対する意味規則の記述がなく,かつ,の生成規則の右辺が他の非終端記号を縦線

(|)で区切って並べたものである場合,の意味規則は,が参照する他の非終端記号の意味規則に従

う。

例 1  《変数》(11.5.4 参照)は次の生成規則をもち,意味規則の記述をもたない。

《変数》 ::

  《定数識別子》

|《大域変数識別子》

|《クラス変数識別子》

|《インスタンス変数識別子》

|《局所変数識別子》

この場合,《変数》の意味規則は,《定数識別子》,《大域変数識別子》,《クラス変数識別子》,《イ

ンスタンス変数識別子》又は《局所変数識別子》の意味規則に従う。

生成規則の右辺に同じ非終端記号が複数出現する場合,意味規則でそれぞれの非終端記号を区別するた

めに,非終端記号の末尾に添字で番号を付けることがある(例えば,《演算子式》

1

概念的名前の意味規則は,その概念的名前が表す文字の並びの集合の要素であるプログラム構成要素の

意味規則をまとめて記述する。意味規則において,概念的名前《X》に言及する  “《X》”  は,非終端記号《X

が表す文字の並びの集合の要素であるプログラム構成要素を表す。

例 2  《論理 AND 式》(11.2.3 参照)は次の生成規則をもつ。

《論理AND式》 ::=

  《キーワードAND式》

|《演算子AND式》

《論理 AND 式》は概念的名前であり,プログラムテキストの構文解析の過程で,《キーワー


10

X 3017

:2013 (ISO/IEC 30170:2012)

ド AND 式》又は《演算子 AND 式》が表す文字の並びが《論理 AND 式》であるとみなされること

はない。しかし,《キーワード AND 式》及び《演算子 AND 式》は,同じような意味規則をもつ

ため,それらをまとめて《論理 AND 式》の意味規則として記述する。意味規則において,

“《論

理 AND 式》”は,《キーワード AND 式》又は《演算子 AND 式》が表すプログラム構成要素を示

す。

5.4 

実行環境の属性 

実行環境(7.1 参照)の属性の名前は,二重亀甲括弧(⟦⟧)で囲んで表示する。

例  ⟦self⟧は実行環境の属性の一つである。

基本概念 

6.1 

オブジェクト 

オブジェクトは,状態及び動作をもつ。オブジェクトの状態は,そのオブジェクトの属性によって表現

される。全てのオブジェクトは,インスタンス変数の束縛(6.2.2 参照)の集合を,そのオブジェクトの属

性としてもつ。オブジェクトは,そのオブジェクトのクラスによっては,インスタンス変数の集合に加え

て,幾つかの他の属性をもつことができる。オブジェクトの動作は,そのオブジェクトに対して呼び出す

ことができるメソッド(6.3 参照)の集合によって定義される。メソッドは,クラス,特異クラス又はモジ

ュール(6.5 参照)の中に定義される。

プログラムによって直接操作される全ての値は,オブジェクトである。例えば,次の値は全てオブジェ

クトである。

−  変数(6.2 参照)によって参照される値。

−  実引数としてメソッドに渡される値。

−  メソッドによって返される値。

−  《式》(箇条 11 参照)

,《文》(箇条 12 参照)

,《複合文》(10.2 参照)又は《プログラム》(10.1 参照)の

評価結果として返される値。

その他の値は,その値がオブジェクトとして明示的に規定されていない限り,オブジェクトではない。

注記  この規格では,整数のような基本的な値もまたオブジェクトである。例えば,《整数リテラル》

8.7.6.2 参照)の評価結果は,オブジェクトである。

6.2 

変数 

6.2.1 

概要 

変数は名前によって表され,オブジェクトを参照する。そのオブジェクトは,その変数の値と呼ばれる。

変数自身はオブジェクトではない。一つの変数は一つのオブジェクトしか同時に参照できないが,一つの

オブジェクトは二つ以上の変数によって同時に参照できる。

変数があるオブジェクトを参照している場合,その変数はそのオブジェクトに束縛されているという。

この変数とオブジェクトとの結び付きを,変数束縛と呼ぶ。名前 の変数が,オブジェクト に束縛され

ているとき,をその束縛の名前と呼び,をその束縛の値と呼ぶ。

変数には,次の五つの種類がある。

−  インスタンス変数(6.2.2 参照)

,その名前は一つの  “@”  で始まる(

例:“@var”)。

−  定数(6.5.2 参照)

,その名前は大文字で始まる(

例:“Const”)。

−  クラス変数(6.5.2 参照)

,その名前は“@@”  で始まる(

例:“@@var”)。

−  局所変数(9.2 参照)

,その名前は小文字又は  “_”  で始まる(

例:“var”又は“_var”)。


11

X 3017

:2013 (ISO/IEC 30170:2012)

−  大域変数(9.3 参照)

,その名前は“$”  で始まる(

例:“$var”)。

任意の変数は,任意の種類のオブジェクトに束縛されることができる。

例  次のプログラムでは,局所変数  “x”  は,まず整数を参照し,次に文字列を参照し,最後に配列を

参照する。

x = 123

x = "abc"

x = [1, 2, 3]

6.2.2 

インスタンス変数 

オブジェクトは,変数束縛の集合をもつ。この変数束縛の集合の中にある変数は,そのオブジェクトの

インスタンス変数である。インスタンス変数の束縛の集合は,オブジェクトの状態を表す。

あるオブジェクトのインスタンス変数には,そのオブジェクトの外側では直接にはアクセスできない。

インスタンス変数には,通常アクセサと呼ばれるメソッドを介してアクセスする。この意味で,インスタ

ンス変数の束縛の集合は,オブジェクト内にカプセル化されている。

例  次のプログラムでは,ValueHolder クラスのインスタンス変数  “@value”  が,initialize

メソッドによって初期化され

15.2.3.3.1 参照)

アクセサメソッド value を介してアクセスされ,

Kernel

モジュールの puts メソッド(15.3.1.2.11 参照)によって出力される。“#”  以降のテキス

トはコメント(8.5 参照)である。

class ValueHolder

 def

initialize(value)

@value = value

 end

 def

value

  return

@value

 end

end

vh  =  ValueHolder.new(10)      #  initialize(10)

が呼ばれる。

puts vh.value

6.3 

メソッド 

メソッドは,オブジェクトに対して呼び出されたときに,そのオブジェクトに対する一連の計算を実行

する手続きである。メソッド自身はオブジェクトではない。オブジェクトに対し呼出し可能なメソッドの

集合によって,そのオブジェクトの動作が定義される。メソッドは一つの名前(又は,別名がある場合は

複数の名前)をもつ。この名前とメソッドとの関係をメソッド束縛と呼ぶ。名前 がメソッド に束縛さ

れている場合,をその束縛の名前と呼び,をその束縛の値と呼ぶ。ある名前にメソッドが束縛されて

いるとき,その名前をそのメソッドのメソッド名と呼ぶ。オブジェクトに対してメソッド名の一つを指定

することによって,メソッドを呼び出すことができる。メソッド呼出しの対象となるオブジェクトを,メ

ソッド呼出しのレシーバと呼ぶ。

例  メソッド呼出し  “obj.method(arg1, arg2)”  において,“obj”  をレシーバと呼び,“method”

をメソッド名と呼ぶ。メソッド呼出し式については,11.3 を参照。


12

X 3017

:2013 (ISO/IEC 30170:2012)

メソッドについては,13.3 でより詳しく示す。

6.4 

ブロック 

ブロックは,メソッド呼出しに渡される手続きである。メソッド呼出しに渡されたブロックは,そのメ

ソッド呼出しの中で 0 回以上呼び出される。

ブロック自身はオブジェクトではない。ただし,ブロックは,Proc クラス(15.2.17 参照)のインスタ

ンスであるオブジェクトによって表現することができる。

例 1  次のプログラムでは,配列のそれぞれの要素について,Array クラスの each メソッド

15.2.12.5.10 参照)によってブロック  “{ |i| puts i }”  が呼び出される。

a = [1, 2, 3]

a.each { |i| puts i }

例 2  次のプログラムでは,ブロック  “{ puts "abc" }”  を表す Proc クラスのインスタンスが作

成され,Proc クラスの call メソッド(15.2.17.4.3 参照)によって呼び出される。

x = Proc.new { puts "abc" }

x.call

ブロックについては,11.3.3 でより詳しく示す。

6.5 

クラス,特異クラス及びモジュール 

6.5.1 

概要 

オブジェクトの動作は,クラス,特異クラス及びモジュールによって定義される。クラスは,同じクラ

スのオブジェクトで共有されるメソッドを定義する。特異クラスは,他のオブジェクトと関連付けられ,

そのオブジェクトの動作に修正を加えることができる。モジュールは,クラス及び他のモジュールにイン

クルードされるメソッドを定義し,提供する。クラス,特異クラス及びモジュールは,それら自身がオブ

ジェクトであり,実行時に動的に生成されたり,修正が加えられる。

6.5.2 

クラス 

クラスはそれ自身オブジェクトであるが,他のオブジェクトを生成する。生成されたオブジェクトを,

そのクラスの直接のインスタンスであるという(13.2.4 参照)

クラスはメソッドの集合を定義する。それらのメソッドは,上書き(13.3.1 参照)されていない限り,

そのクラスの全てのインスタンスに対して呼び出すことができる。これらのメソッドはクラスのインスタ

ンスメソッドである。

クラス自身もオブジェクトであり,《クラス定義》(13.2.2 参照)などのプログラム構成要素を評価する

ことによって生成される。クラスは,インスタンス変数束縛の集合のほかに,二つの変数束縛の集合をも

つ。一つは定数束縛の集合であり,もう一つはクラス変数束縛の集合である。クラス変数束縛の集合は,

クラスの全てのインスタンスで共有される状態を表現する。

クラスのもつ定数,クラス変数,特異メソッド及びインスタンスメソッドを,そのクラスの機能と呼ぶ。

例 1  Array クラス(15.2.12 参照)はそれ自身オブジェクトであり,メソッド呼出しのレシーバとな

ることができる。Array クラスに対する new メソッドの呼出しは,Array クラスの直接の

インスタンスと呼ばれるオブジェクトを作成する。

例 2  次のプログラムでは,Array クラスのインスタンスメソッド push(15.2.12.5.22 参照)が Array

クラスのインスタンスに対して呼び出される。

a = Array.new

a.push(1,  2,  3)    #  a

の値は[1, 2, 3]となる。


13

X 3017

:2013 (ISO/IEC 30170:2012)

例 3  次のプログラムでは,クラス定義によって X クラスが定義される。クラス変数  “@@a”  は,X

クラスのインスタンス群で共有される。

class X

@@a = "abc"

 def

print_a

  puts

@@a

 end

 def

set_a(value)

@@a = value

 end

end

x1 = X.new

x1.print_a  #

abc

を出力する。

x2 = X.new

x2.set_a("def")

x2.print_a

#  def

を出力する。

x1.print_a

#  def

を出力する。

クラスについては,13.2 でより詳しく示す。

6.5.3 

特異クラス 

クラスを含む全てのオブジェクトは,

高々一つの特異クラスと関連付けることができる。

特異クラスは,

そのオブジェクトに対して呼び出すことのできるメソッドを定義する。それらのメソッドは,そのオブジ

ェクトの特異メソッドである。

−  あるオブジェクトがクラスではない場合,そのオブジェクトの特異メソッドは,そのオブジェクトに

対してだけ呼び出すことができる。

−  あるオブジェクトがクラスである場合,そのクラスの特異メソッドは,そのクラスのサブクラス及び

そのクラス自身に対してだけ呼び出すことができる(6.5.4 参照)

特異クラスは,特異クラス定義(13.4.2 参照)又は特異メソッド定義(13.4.3 参照)によって作成され,

オブジェクトと関連付けられる。

例 1  次のプログラムでは,特異クラス定義によって  “x”  の特異クラスが作成される。show メソッ

ドは,“x”  の特異メソッドと呼び,“x”  に対してだけ呼び出すことができる。

x = "abc"

y = "def"

# x

の特異クラスの定義

class << x

 def

show

  puts

self

#

レシーバを出力する。

 end


14

X 3017

:2013 (ISO/IEC 30170:2012)

end

x.show

   #

abc

を出力する。

y.show

   #

例外が発生する。

例 2  次のプログラムでは,特異メソッド定義によって,例 と同じ特異メソッド show が定義され

る。“x”  の特異クラスは,特異メソッド定義によって暗黙のうちに作成される。

x = "abc"

# x

の特異メソッドの定義

def x.show

 puts

self

 #

レシーバを出力する。

end

x.show #

abc

を出力する。

例 3  次のプログラムでは,特異メソッド定義によって,X クラスの特異メソッド a が定義される。

class X

 #

X

クラスの特異メソッドの定義

 def

X.a

  puts

"a

メソッドが呼び出された。"

 end

end

X.a #

"a

メソッドが呼び出された。" を出力する。

注記  クラスの特異メソッドは,クラスに対して呼び出すことができるので,他のオブジェクト指向

言語でのいわゆるクラスメソッドと類似している。

特異クラスについては,13.4 でより詳しく示す。

6.5.4 

継承 

クラスは,高々一つのクラスをその直接のスーパークラスとしてもつ。クラス がクラス をその直接

のスーパークラスとしてもつ場合,は の直接のサブクラスという。

あるプログラムで定義される全てのクラス(組込みクラスを含む。

)は,クラス継承木と呼ばれる根付き

木構造を形成する。クラス継承木において,あるクラスの親はそのクラスの直接のスーパークラスとし,

あるクラスの子はそのクラスの直接のサブクラスとする。スーパークラスをもたないクラスは,一つだけ

あり,そのクラスはクラス継承木の根である。クラス継承木において,あるクラスの全ての祖先をそのク

ラスのスーパークラスと呼び,あるクラスの全ての子孫をそのクラスのサブクラスと呼ぶ。

クラスは,スーパークラスをもつ場合,定数,クラス変数,特異メソッド及びインスタンスメソッドを

そのスーパークラスから継承する(13.2.3 参照)

。オブジェクト がクラス の直接のインスタンスであ

る場合,は,及び の全てのスーパークラスに対して,そのインスタンスであるという。

例  次のプログラムは,三つのクラス,X クラス,Y クラス及び Z クラスを定義する。

class X

end

class Y < X


15

X 3017

:2013 (ISO/IEC 30170:2012)

end

class Z < Y

end

X

クラスを Y クラスの直接のスーパークラスと呼び,Y クラスを X クラスの直接のサブクラス

と呼ぶ。Y クラスは,X クラスの機能を継承する。X クラスを Z クラスのスーパークラスと呼び,

Z

クラスを X クラスのサブクラスと呼ぶ。Z クラスは,X クラス及び Y クラスの機能を継承する。

Z

クラスの直接のインスタンスは,X クラス,Y クラス及び Z クラスのインスタンスと呼ぶ。

6.5.5 

モジュール 

クラスの多重継承を行うことはできない。すなわち,クラスは,直接のスーパークラスを一つだけしか

もてない。しかし,モジュールのインクルード機能を用いて,複数のモジュールからクラスに機能を追加

することができる。

モジュールは,クラスと同じ構造をもつオブジェクトであるが,クラスとは異なり,モジュールのイン

スタンスを作ることはできない。また,継承することもできない。モジュールは,クラスと同様に,定数

束縛の集合,クラス変数束縛の集合及びインスタンスメソッドの集合をもつ。あるモジュールに定義され

たインスタンスメソッド,定数及びクラス変数は,そのモジュールを他のクラス,モジュール又は特異ク

ラスがインクルードした場合,そこから利用できるようになる。

クラスが直接のスーパークラスを一つしかもてないのに対し,クラス,モジュール又は特異クラスは,

複数のモジュールをインクルードすることができる。モジュールに定義されたインスタンスメソッドは,

そのモジュールをインクルードしたクラスのインスタンスに対して呼び出すことができる。

モジュールは,

モジュール定義(13.1.2 参照)によって作成される。

例  次の例は Ruby の規格に厳密に適合するプログラムではない。なぜならば,クラスは複数の直接

のスーパークラスをもてないからである。

class Stream

end

class ReadStream < Stream

 def

read(n)

  #

ストリームからnバイト読み込む。

 end

end

class WriteStream < Stream

 def

write(str)

  #

ストリームにstrを書き込む。

 end

end

class ReadWriteStream < ReadStream, WriteStream

end


16

X 3017

:2013 (ISO/IEC 30170:2012)

その代わりに,クラスは複数のモジュールをインクルードすることができる。次の例は,多重

継承の代わりにモジュールのインクルードを利用している。

class Stream

end

module Readable

def read(n); end

end

module Writable

def write(str); end

end

class ReadStream < Stream

 include

Readable

end

class WriteStream < Stream

 include

Writable

end

class ReadWriteStream

 include

Readable

 include

Writable

end

モジュールについては,13.1 でより詳しく示す。

6.6 

真理値 

オブジェクトは,真又は偽のいずれかに分類される。

偽に分類されるオブジェクトは,false 及び nil だけである。false は FalseClass クラス(15.2.6 参照)

の唯一のインスタンスであり,《false 式》(11.5.4.8.3 参照)の評価結果の値である。nil は NilClass クラ

ス(15.2.4 参照)の唯一のインスタンスであり,《nil 式》(11.5.4.8.2 参照)の評価結果の値である。

false と nil とを除く全てのオブジェクトは,真に分類される。true は TrueClass クラス(15.2.5 参照)

の唯一のインスタンスであり,《true 式》(11.5.4.8.3 参照)の評価結果の値である。

実行環境 

7.1 

概要 

実行環境とは,プログラムの評価に影響を与える属性の集合である。

実行環境は Ruby 言語の一部ではなく,プログラムの意味を記述するために,この規格において便宜的

に定義されている。処理系によるプログラムの評価結果は,この規格が規定するとおり,実行環境上で評

価した結果と同じでなければならない。


17

X 3017

:2013 (ISO/IEC 30170:2012)

実行環境は,次に示す属性の集合からなる。実行環境のそれぞれの属性は,⟦大域変数束縛集合⟧を除き,

スタックを構成する。実行環境のそれぞれの属性の値は,プログラムの構成要素が評価されるときに変更

される。

実行環境は次のような属性をもつ。

self⟧:オブジェクトを要素とする,スタックである。このスタックの一番上のオブジェクトは,現在の self

と呼ばれる。《self 式》の評価結果の値は現在の self である(11.5.4.8.4 参照)

⟦クラスモジュールリスト⟧:このスタックには,クラス,モジュール又は特異クラスのリストが積まれる。

このスタックの一番上のリストの先頭の要素を,現在のクラス又はモジュールと呼ぶ。

⟦省略時可視性⟧:このスタックには,メソッドの可視性が積まれる。メソッドの可視性は,public,private

又は protected のいずれかである。このスタックの一番上の可視性を現在の可視性と呼ぶ。

⟦局所変数束縛集合⟧:このスタックには,局所変数束縛の集合が積まれる。このスタックの一番上の局所

変数束縛の集合を,現在の局所変数束縛の集合と呼ぶ。制御が局所変数のスコープ(9.2 参照)に入る

ごとに,局所変数束縛の集合がこのスタックに積まれる。制御が局所変数のスコープから出ると,ス

タックの一番上の要素が取り除かれる。このスタックの要素である局所変数束縛の集合が対応する局

所変数のスコープを,局所変数束縛の集合のスコープと呼ぶ。

⟦呼出し時メソッド名⟧:このスタックには,メソッド呼出し時に与えられたメソッド名が積まれる。 
⟦定義時メソッド名⟧:このスタックには,呼び出されたメソッドの定義名が積まれる。

注記  ⟦呼出し時メソッド名⟧及び⟦定義時メソッド名⟧の一番上の要素は,通常同じである。ただし,

呼び出されたメソッドが別名をもつ場合,違う名前になることがある。

⟦ブロック⟧:このスタックには,メソッド呼出し時に渡された《ブロック》又は block-not-given が積まれる。

block-not-given は,メソッド呼出しに《ブロック》が渡されなかったことを示す特別な値である。

⟦大域変数束縛集合⟧:大域変数束縛の集合である。 
7.2 

初期状態 

プログラムの実行直前に,実行環境のそれぞれの属性を次のように初期化する。

a)  空集合を⟦大域変数束縛集合⟧に設定する。規格適合処理系は任意の大域変数に対する変数束縛を⟦大域

変数束縛集合⟧に追加してもよい。

b)  箇条 15 に規定する組込みクラス及び組込みモジュールを作る。 
c)  ⟦大域変数束縛集合⟧を除き,属性のそれぞれに対して空のスタックを新規に作成し設定する。 
d)  Object クラスの直接のインスタンスを作り,⟦self⟧に積む。

e)  Object クラスだけを要素にもつ一要素のリストを作成し,そのリストを⟦クラスモジュールリスト⟧

に積む。

f)  可視性 private を⟦省略時可視性⟧に積む。

g) block-not-given を⟦ブロック⟧に積む。


18

X 3017

:2013 (ISO/IEC 30170:2012)

字句構造 

8.1 

概要 

構文規則

《入力要素》 ::

  《行終端子》

|《空白類》

|《コメント》

|《プログラム終端指示子》

|《字句》

あるプログラムのプログラムテキストは,最初に《入力要素》(すなわち,《行終端子》,《空白類》,《コメ

ント》,《プログラム終端指示子》又は《字句》のいずれか)の並びに変換される。変換過程において,入力が

複数の生成規則にマッチする場合は,先頭からのマッチ部分が最長となる生成規則が選択される。

8.2 

プログラムテキスト 

構文規則

《ソース文字》 ::

  [ISO/IEC 646:1991の国際基準版で規定されている任意の文字]

プログラムは,プログラムテキストで表現される。プログラムテキストは,《ソース文字》の並びである。

《ソース文字》は,ISO/IEC 646:1991 の国際基準版(IRV:International Reference Version)にある文字である。

その他の文字集合及びエンコーディングをサポートするかどうかは,未規定とする。

注記  規格適合処理系は,ISO/IEC 646:1991 の国際基準版のサポートが必須となる。規格適合処理系

は,規格に厳密に適合するプログラムの動作を変えない限りにおいて,他の文字集合及びエン

コーディングをサポートしてもよい。ただし,ISO/IEC 646:1991 の国際基準版に含まれない文

字の扱い,及び,ISO/IEC 646:1991 の国際基準版の文字に対して ISO/IEC 646:1991 とは別の符

号を使用する符号化文字集合の扱いについては,この規格では規定していない。

終端記号は,ISO/IEC 646:1991 の国際基準版で規定された文字を並べたものである。ISO/IEC 646:1991

の国際基準版の文字のうち,印字不可能な文字及び他の文字と識別しにくい文字については,“0x”  の後に

16 進数の数字を二つ並べて表す。1 番目及び 2 番目の数字は,ISO/IEC 646 の 5.1 に規定された x/y という

記法における x 及び y をそれぞれ表す。

例 “0x0a” は,文字 LF(ISO/IEC 646 に規定されたビット組合せは 0/10)を表す。

8.3 

行終端子 

構文規則

《行終端子》 ::

0x0d

?

 0x0a

5.2.3 に規定しているとおり,箇条 及び 15.2.15.4 以外では,《行終端子》は生成規則から省かれている。

ただし,《行終端子》が現れてはならない場所,又は,現れなければならない場所をそれぞれ,特記項の禁

止[5.2.4 d) 2)参照]又は必須[5.2.4 d) 3)参照]で示す。


19

X 3017

:2013 (ISO/IEC 30170:2012)

例  《文》は,《分離子》によって区切られる(10.2 参照)。《分離子》の構文規則を次に示す。

《分離子》 ::

    “;”

|[《行終端子》必須]

次のプログラムを考える。

x = 1 + 2

puts x

このプログラムは,《行終端子》によって二つの《文》“x = 1 + 2”  及び  “puts x”  に分割され

る。

次のプログラムを考える。

x =

1 + 2

このプログラムは,“x =”  が《文》ではないため,単一の《文》“x = 1 + 2”  に構文解析される。

次のプログラムを考える。

x

= 1 + 2

このプログラムは,Ruby の規格に厳密に適合するプログラムとはみなされない。《単一変数代

入式》において  “=”  の前に《行終端子》が現れてはならず,“= 1 + 2”  は《文》ではないからであ

る。“=”  の前に《行終端子》が現れてはならないことは,《単一変数代入式》の構文規則において,

次のとおり示されている(11.4.2.2.2 参照)

《単一変数代入式》 ::

  《変数》  [《行終端子》禁止] “=” 《演算子式》

8.4 

空白類 

構文規則

《空白類》 ::

0x09|0x0b|0x0c|0x0d|0x20|《行終端子エスケープ列》

《行終端子エスケープ列》 ::

  “\”  《行終端子》

5.2.3 に規定しているとおり,箇条 及び 15.2.15.4 以外では,《空白類》は生成規則から省かれている。た

だし,《空白類》が現れてはならない場所,又は,現れなければならない場所をそれぞれ,特記項の禁止[5.2.4

d) 2)参照]又は必須[5.2.4 d) 3)参照]で示す。


20

X 3017

:2013 (ISO/IEC 30170:2012)

8.5 

コメント 

構文規則

《コメント》 ::

  《単一行コメント》

|《複数行コメント》

《単一行コメント》 ::

  “#”  《コメント内容》

?

《コメント内容》 ::

  《行内容》

《行内容》 ::

  《ソース文字》

+

  −  (  《ソース文字》

*

  《行終端子》  《ソース文字》

*

  )

《複数行コメント》 ::

  《複数行コメント開始行》  《複数行コメント行》

?

  《複数行コメント終了行》

《複数行コメント開始行》 ::

  [行頭]  “=begin”  《開始・終了行残り》

?

  《行終端子》

《複数行コメント終了行》 ::

  [行頭]  “=end”  《開始・終了行残り》

?

  (  《行終端子》|[プログラムの末尾]  )

《開始・終了行残り》 ::

  《空白類》

+

  《コメント内容》

《複数行コメント行》 ::

  《コメント行》  −  《複数行コメント終了行》

《コメント行》 ::

  《コメント内容》  《行終端子》

[行頭]という記法は,プログラムの先頭,又は《行終端子》の直後の位置を表す。

《コメント》は,《単一行コメント》又は《複数行コメント》のいずれかである。5.2.3 に規定しているとおり,

箇条 及び 15.2.15.4 以外では,《コメント》は生成規則から省かれている。

《単一行コメント》は,“#”  で開始され,行末まで続く。行末の《行終端子》は,コメントには含まれない。

《単一行コメント》は,《行終端子》以外の任意の文字を含むことができる。

《複数行コメント》は,“=begin”  が行頭に出現する行から開始され,“=end”  が行頭に出現する行まで

続く。《単一行コメント》と異なり,《複数行コメント終了行》の《行終端子》は,コメントの一部とみなされ

る。

注記 1  《行内容》は《ソース文字》の並びである。ただし,《行内容》の生成規則で規定しているとおり,

《行内容》の中に《行終端子》が出現してはならない。

注記 2  コメントに ISO/IEC 646:1991 の国際基準版にない文字を含むプログラムは規格に厳密に適

合するプログラムではないが,規格適合プログラムにはなり得る。この規格のコード例では

利用者の利便性を考慮し,便宜上コメントに日本語を使用している。


21

X 3017

:2013 (ISO/IEC 30170:2012)

8.6 

プログラム終端指示子 

構文規則

《プログラム終端指示子》 ::

  [行頭]  “__END__”  (  《行終端子》|[プログラムの末尾]  )

《プログラム終端指示子》は,プログラムの終端を指示する。《プログラム終端指示子》より後のいかなる

文字も,プログラムテキストとして扱ってはならない。

注記  “__END__”  はキーワードではなく,《局所変数識別子》とすることができる。

8.7 

字句 

8.7.1 

概要 

構文規則

《字句》 ::

  《キーワード》

|《識別子》

|《区切り子》

|《演算子》

|《リテラル》

《区切り子》及び《演算子》は,独立した構文的及び意味的な機能をもつ記号とし,その意味は箇条 9∼箇

条 14 で定義する。

8.7.2 

キーワード 

構文規則

《キーワード》 ::

  “__LINE__”|“__ENCODING__”|“__FILE__”|“BEGIN”|“END”|“alias”

|“and”|“begin”|“break”|“case”|“class”|“def”|“defined?”|“do”

|“else”|“elsif”|“end”|“ensure”|“for”|“false”|“if”|“in”

|“module”|“next”|“nil”|“not”|“or”|“redo”|“rescue”|“retry”

|“return”|“self”|“super”|“then”|“true”|“undef”|“unless”

|“until”|“when”|“while”|“yield”

キーワード中の大文字と小文字とは区別される。

注記  “__LINE__”,“__ENCODING__”,“__FILE__”,“BEGIN”  及び  “END”  は,将来の使用のため

予約されている。

8.7.3 

識別子 

構文規則

《識別子》 ::

  《局所変数識別子》

|《大域変数識別子》

|《クラス変数識別子》

|《インスタンス変数識別子》

|《定数識別子》

|《メソッド専用識別子》


22

X 3017

:2013 (ISO/IEC 30170:2012)

|《代入風メソッド識別子》

《局所変数識別子》 ::

  (  (  《小文字》|“_”  )  《識別子文字》

*

  )  −  《キーワード》

《大域変数識別子》 ::

  “$”  《識別子開始文字》  《識別子文字》

*

《クラス変数識別子》 ::

  “@@”  《識別子開始文字》  《識別子文字》

*

《インスタンス変数識別子》 ::

  “@”  《識別子開始文字》  《識別子文字》

*

《定数識別子》 ::

  (  《大文字》  《識別子文字》

*

  )  −  《キーワード》

《メソッド専用識別子》 ::

  (  《定数識別子》|《局所変数識別子》  )  (  “!”|“?”  )

《代入風メソッド識別子》 ::

  (  《定数識別子》|《局所変数識別子》  )  “=”

《識別子文字》 ::

  《小文字》

|《大文字》

|《10進数字》

|“_”

《識別子開始文字》 ::

  《小文字》

|《大文字》

|“_”

《大文字》 ::

  “A”|“B”|“C”|“D”|“E”|“F”|“G”|“H”|“I”|“J”|“K”|“L”

|“M”|“N”|“O”|“P”|“Q”|“R”|“S”|“T”|“U”|“V”|“W”|“X”

|“Y”|“Z”

《小文字》 ::

  “a”|“b”|“c”|“d”|“e”|“f”|“g”|“h”|“i”|“j”|“k”|“l”

|“m”|“n”|“o”|“p”|“q”|“r”|“s”|“t”|“u”|“v”|“w”|“x”

|“y”|“z”

10進数字》 ::

  “0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”

8.7.4 

区切り子 

構文規則

《区切り子》 ::

“[”|“]”|“(”|“)”|“{”|“}”|“::”|“,”|“;”|“..”|“...”

|“?”|“:”|“=>”


23

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.5 

演算子 

構文規則

《演算子》 ::

  “!”|“!=”|“!~”|“&&”|“||”

|《演算子メソッド名》

|“=”

|《代入演算子》

《演算子メソッド名》 ::

  “^”|“&”|“|”|“<=>”|“==”|“===”|“=~”|“>”|“>=”|“<”|“<=”

|“<<”|“>>”|“+”|“-”|“*”|“/”|“%”|“**”|“~”|“+@”|“-@”

|“[]”|“[]=”|“‘”

《代入演算子》 ::

  《代入演算子名》  “=”

《代入演算子名》 ::

  “&&”|“||”|“^”|“&”|“|”|“<<”|“>>”|“+”|“-”|“*”|“/”|“%”|“**”

8.7.6 

リテラル 

8.7.6.1  概要 

《リテラル》 ::

  《数値リテラル》

|《文字列リテラル》

|《配列リテラル》

|《正規表現リテラル》

|《シンボル》

8.7.6.2  数値リテラル 

構文規則

《数値リテラル》 ::

  《符号付き数》

|《符号なし数》

《符号付き数》 ::

  (  “+”|“-”  )  《符号なし数》

《符号なし数》 ::

  《整数リテラル》

|《浮動小数点数リテラル》

《整数リテラル》 ::

  《10進整数リテラル》

|《2進整数リテラル》

|《8進整数リテラル》

|《16進整数リテラル》

10進整数リテラル》 ::


24

X 3017

:2013 (ISO/IEC 30170:2012)

  《前置子なし10進整数リテラル》

|《前置子付き10進整数リテラル》

《前置子なし10進整数リテラル》 ::

  “0”

|《0以外の10進数字》  (  “_”

?

  《10進数字》  )

*

《前置子付き10進整数リテラル》 ::

  “0”  (  “d”|“D”  )  《10進整数部》

10進整数部》 ::

  《10進数字》  (  “_”

?

  《10進数字》  )

*

2進整数リテラル》 ::

  “0”  (  “b”|“B”  )  《2進数字》  (  “_”

?

  《2進数字》  )

*

8進整数リテラル》 ::

  “0”  (  “_”|“o”|“O”  )

?

  《8進数字》  (  “_”

?

  《8進数字》  )

*

16進整数リテラル》 ::

  “0”  (  “x”|“X”  )  《16進数字》  (  “_”

?

  《16進数字》  )

*

《浮動小数点数リテラル》 ::

  《指数なし浮動小数点数リテラル》

|《指数付き浮動小数点数リテラル》

《指数なし浮動小数点数リテラル》 ::

  《前置子なし10進整数リテラル》  “.”  《10進整数部》

《指数付き浮動小数点数リテラル》 ::

  《有効数字部》  《指数部》

《有効数字部》 ::

  《指数なし浮動小数点数リテラル》

|《前置子なし10進整数リテラル》

《指数部》 ::

  (  “e”|“E”  )  (  “+”|“-”  )

?

  《10進整数部》

0以外の10進数字》 ::

  “1”|“2”|“3”|“4”|“5”|“6”|“7”|“8”|“9”

2進数字》 ::

  “0”|“1”

8進数字》 ::

  “0”|“1”|“2”|“3”|“4”|“5”|“6”|“7”

16進数字》 ::

  《10進数字》|“a”|“b”|“c”|“d”|“e”|“f”|“A”|“B”|“C”|“D”|“E”|“F”

《符号付き数》の直前の字句が《局所変数識別子》,《定数識別子》又は《メソッド専用識別子》の場合,その

《局所変数識別子》,《定数識別子》又は《メソッド専用識別子》と,《符号付き数》との間に,少なくとも一つ

の《空白類》又は《行終端子》が存在しなければならない。

例  次のプログラムでは,“x”  と  “-123”  との間に《空白類》があるため,“-123”  は《符号付き数》で


25

X 3017

:2013 (ISO/IEC 30170:2012)

ある。

x -123

上記のプログラムでは,x メソッドが  “-123”  の値を実引数として呼び出される。

ただし,次のプログラムでは,“x”  と  “-123”  との間に《空白類》が存在しないため,“-123”  は

“-”  と  “123”  という二つの字句に分割される。

x-123

上記のプログラムでは,“-”  メソッドが  “x”  の値に対して  “123”  の値を実引数として呼び出さ

れる。

意味規則

《数値リテラル》の評価結果は,Integer クラスのインスタンス又は Float クラスの直接のインスタン

スとする。

注記  15.2.8.1 で規定するとおりに Integer クラスのサブクラス群を定義してもよい。

《整数リテラル》という形式の《符号なし数》の評価結果は,《整数リテラル》の生成規則のいずれかの項列

の値を表す Integer クラスのインスタンスとする。

《浮動小数点数リテラル》という形式の《符号なし数》の評価結果は,《浮動小数点数リテラル》の生成規則

のいずれかの項列の値を表す Float クラスの直接のインスタンスとする。

“+”  で始まる《符号付き数》の評価結果は,《符号なし数》の評価結果のインスタンスとする。“-”  で始ま

る《符号付き数》の評価結果は,《符号なし数》の評価結果のインスタンスの値の符号を反転した値を表す

Integer

クラスのインスタンス又は Float クラスの直接のインスタンスとする。

《整数リテラル》,《10 進整数リテラル》,《浮動小数点数リテラル》又は《有効数字部》の値は,それらの生

成規則のいずれかの項列の値とする。

《前置子なし 10 進整数リテラル》の値は,“0”  の場合は 0 であり,そうではない場合は,一つの《0 以外

の 10 進数字》の後に幾つかの《10 進数字》が続いた文字列を,途中の  “_”  を無視して 10 進数として解釈し

た値とする。

《前置子付き 10 進整数リテラル》の値は,《10 進整数部》の値とする。

10 進整数部》の値は,《10 進数字》の並びを,途中の  “_”  を無視して 10 進数として解釈した値とする。

2 進整数リテラル》の値は,《2 進数字》の並びを,“_”  を除いて 2 進数として解釈した値とする。

8 進整数リテラル》の値は,《8 進数字》の並びを,“_”  を除いて 8 進数として解釈した値とする。

16 進整数リテラル》の値は,“_”  を除いた《16 進数字》の並びを,16 進数として解釈した値とする。“a”

(又は  “A”)から  “f”(又は  “F”)までの《16 進数字》の値は,それぞれ 10 から 15 までとする。

《指数なし浮動小数点数リテラル》の値は,《10 進整数部》の《10 進数字》の個数を として,《前置子なし

10 進整数リテラル》の値と,《10 進整数部》の値×10

n

とを加算した値とする。

《指数付き浮動小数点数リテラル》の値は,を《指数部》の値とするとき,《有効数字部》×10

n

の値とする。

《指数部》の値は,“-”  が出現する場合,《10 進整数部》の負数とし,そうではない場合,《10 進整数部》

の値とする。

Integer

クラスのインスタンスの値の範囲については,15.2.8.1 を参照。

Float

クラスのインスタンスの値の精度については,15.2.9.1 を参照。


26

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.6.3  文字列リテラル 
8.7.6.3.1  
概要 

構文規則

《文字列リテラル》 ::

  《一重引用符文字列》

|《二重引用符文字列》

|《引用符非展開リテラル文字列》

|《引用符展開リテラル文字列》

|《ヒアドキュメント》

|《外部コマンド実行》

意味規則

《文字列リテラル》の評価結果は,String クラスの直接のインスタンスとする。

注記  《文字列リテラル》の中には,プログラムテキスト上の文字の列だけでなく,任意の式の評価結

果を内容にできるものがある(8.7.6.3.3 参照)

8.7.6.3.2  一重引用符文字列 

構文規則

《一重引用符文字列》 ::

  “'”  《一重引用符文字列文字》

*

 “'”

《一重引用符文字列文字》 ::

  《一重引用符文字列非エスケープ文字》

|《一重引用符エスケープ列》

《一重引用符エスケープ列》 ::

  《単一エスケープ文字並び》

|《一重引用符文字列非エスケープ文字並び》

《単一エスケープ文字並び》 ::

  “\”  《一重引用符文字列メタ文字》

《一重引用符文字列非エスケープ文字並び》 ::

  “\”  《一重引用符文字列非エスケープ文字》

《一重引用符文字列メタ文字》 ::

  “'”|“\”

《一重引用符文字列非エスケープ文字》 ::

  《ソース文字》  −  《一重引用符文字列メタ文字》

意味規則

《一重引用符文字列》は,一重引用符でくくられた 0 個以上の文字からなる。一重引用符の対で囲まれた

《一重引用符文字列文字》の並びは,《単一エスケープ文字並び》を除き,プログラムテキスト中に出現する

文字列を,文字どおりに表す。“\\”  は,文字  “\”  を表す。“\'”  は,文字  “'”  を表す。

注記  《単一エスケープ文字並び》と異なり,《一重引用符文字列非エスケープ文字並び》は,プログラ

ムテキスト中に出現する二つの文字を,文字どおりに表す。例えば,“\a”  は,二つの文字  “\”

及び  “a”  を表す。


27

X 3017

:2013 (ISO/IEC 30170:2012)

例  '\a\'\\'  は,“\a'\”  を内容としてもつ文字列を表す。

8.7.6.3.3  二重引用符文字列 

構文規則

《二重引用符文字列》 ::

  “"”  《二重引用符文字列文字》

*

 “"”

《二重引用符文字列文字》 ::

  《ソース文字》  −  (  “"”|“#”|“\”  )

|“#”  [先読み∉{“$”, “@”, “{”}

|《二重エスケープ列》

|《挿入文字並び》

《二重エスケープ列》 ::

  《単純エスケープ列》

|《非エスケープ列》

|《行終端子エスケープ列》

|《8進エスケープ列》

|《16進エスケープ列》

|《制御エスケープ列》

《単純エスケープ列》 ::

  “\”  《二重エスケープ文字》

《二重エスケープ文字》 ::

  “n”|“t”|“r”|“f”|“v”|“a”|“e”|“b”|“s”

《非エスケープ列》 ::

  “\”  《非エスケープ二重引用符文字列文字》

《非エスケープ二重引用符文字列文字》 ::

  《ソース文字》  −  (  《英数字》|《行終端子》  )

8進エスケープ列》 ::

  “\”  《8進数字》  《8進数字》

?

  《8進数字》

?

16進エスケープ列》 ::

  “\” “x”  《16進数字》  《16進数字》

?

《制御エスケープ列》 ::

  “\”  (  “C-”|“c”  )  《制御エスケープ文字》

《制御エスケープ文字》 ::

  《二重エスケープ列》

|“?”

|《ソース文字》  −  (  “\”|“?”  )

《挿入文字並び》 ::

  “#”  《大域変数識別子》

|“#”  《クラス変数識別子》

|“#”  《インスタンス変数識別子》


28

X 3017

:2013 (ISO/IEC 30170:2012)

|“#” “{”  《複合文》  “}”

《英数字》 ::

  《大文字》

|《小文字》

|《10進数字》

意味規則

《二重引用符文字列》は,二重引用符によってくくられた 0 個以上の文字からなる。二重引用符の対の中

の《二重引用符文字列文字》の並びは,文字列の内容を表す。

《二重エスケープ列》と《挿入文字並び》とを除き,《二重引用符文字列文字》は,プログラムテキスト中に

出現する文字を,文字どおりに表す。

《単純エスケープ列》は,表 に示す文字を表す。

表 1−単純エスケープ列

エスケープ列

文字符号

“\n” 0x0a 
“\t” 0x09 
“\r” 0x0d 
“\f” 0x0c 
“\v” 0x0b 
“\a” 0x07 
“\e” 0x1b 
“\b” 0x08 
“\s” 0x20

8 進エスケープ列》は,その《8 進数字》の並びを 8 進数として解釈したときの値を文字符号としてもつ文

字を表す。

16 進エスケープ列》は,その《16 進数字》の並びを 16 進数として解釈したときの値を文字符号としても

つ文字を表す。

《非エスケープ列》は,その《非エスケープ二重引用符文字列文字》を表す。

《行終端子エスケープ列》を使うことによって,文字列の中に《行終端子》を挿入せずに,プログラムテキ

スト上で文字列を複数の行に分割することができる。《行終端子エスケープ列》は,文字列の文字とはみな

されない。

《制御エスケープ列》は,0x9f と《制御エスケープ文字》が表す文字の文字コードとのビットごとの論理積

の結果を文字コードとしてもつ文字を表す。ただし,《制御エスケープ文字》が  “?”  である場合は,文字コ

ードが 0x7f である文字を表す。

《挿入文字並び》は,《文字列リテラル》の一部であり,その《文字列リテラル》の評価時に動的に評価され

る。《挿入文字並び》を含む《文字列リテラル》の値は String クラスの直接のインスタンスであり,その内

容は《文字列リテラル》内の《挿入文字並び》を,それを動的に評価した結果である文字列の内容で置き換え

た《文字列リテラル》である。

《挿入文字並び》は,次の手順で評価する。

a)  “#”  《大域変数識別子》という形式の場合,《大域変数識別子》(11.5.4.4 参照)として評価する。評価結

果の値を とする。


29

X 3017

:2013 (ISO/IEC 30170:2012)

b)  “#”  《クラス変数識別子》という形式の場合,《クラス変数識別子》(11.5.4.5 参照)として評価する。評

価結果の値を とする。

c)  “#”  《インスタンス変数識別子》という形式の場合,《インスタンス変数識別子》(11.5.4.6 参照)として

評価する。評価結果の値を とする。

d)  “#” “{”  《複合文》  “}”  という形式の場合,《複合文》(10.2 参照)として評価する。評価結果の値を V

とする。

e)  が String クラスのインスタンスの場合,を《挿入文字並び》の値とする。 
f)  そうではない場合,に対して to_s メソッドを実引数なしで呼び出す。評価結果の値を とする。

g)  が String クラスのインスタンスの場合,を《挿入文字並び》の値とする。 
h)  そうではない場合,動作は未規定とする。

例  "1 + 1 = #{1 + 1}"  は,“1 + 1 = 2”  を内容としてもつ文字列を表す。


30

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.6.3.4  引用符非展開リテラル文字列 

構文規則

《引用符非展開リテラル文字列》 ::

  “%q”  《非展開区切り文字列》

《非展開区切り文字列》 ::

  《リテラル開始区切り子》  《非展開リテラル文字列》

*

  《リテラル終了区切り子》

《非展開リテラル文字列》 ::

  《非展開リテラル文字》

|《非展開区切り文字列》

《非展開リテラル文字》 ::

  《非エスケープリテラル文字》

|《非展開リテラルエスケープ列》

《非エスケープリテラル文字》 ::

  《ソース文字》  −  《引用符リテラルエスケープ文字》

《非展開リテラルエスケープ列》 ::

  《非展開リテラルエスケープ文字並び》

|《非エスケープ非展開リテラル文字並び》

《非展開リテラルエスケープ文字並び》 ::

  “\”  《非展開リテラルエスケープ文字》

《非展開リテラルエスケープ文字》 ::

  《リテラル開始区切り子》

|《リテラル終了区切り子》

|“\”

《引用符リテラルエスケープ文字》 ::

  《非展開リテラルエスケープ文字》

《非エスケープ非展開リテラル文字並び》 ::

  “\”  《非エスケープ非展開リテラル文字》

《非エスケープ非展開リテラル文字》 ::

  《ソース文字》  −  《非展開リテラルエスケープ文字》

《リテラル開始区切り子》 ::

  《ソース文字》  −  《英数字》

《リテラル終了区切り子》 ::

  《ソース文字》  −  《英数字》

《非展開区切り文字列》内の全ての《リテラル開始区切り子》は,同じ文字でなければならない。《非展開区

切り文字列》内の全ての《リテラル終了区切り子》は,同じ文字でなければならない。

《リテラル開始区切り子》が表 の左側の列の文字である場合,対応する《リテラル終了区切り子》は,表

の右側の列の対応する文字でなければならない。そうではない場合,《リテラル終了区切り子》は,対応

する《リテラル開始区切り子》と同じ文字でなければならない。


31

X 3017

:2013 (ISO/IEC 30170:2012)

表 2−《リテラル開始区切り子》と《リテラル終了区切り子》との対応

《リテラル開始区切り子》

《リテラル終了区切り子》

“{” “}” 
“(” “)” 
“[” “]” 
“<” “>”

《引用符非展開リテラル文字列》内の《非展開リテラル文字列》の《非展開区切り文字列》は,その《非展開区

切り文字列》の《リテラル開始区切り子》が

表 の左側の列の文字である場合にだけ適用する。

注記 1  《引用符非展開リテラル文字列》は,《リテラル開始区切り子》及び対応する《リテラル終了区切

り子》について,入れ子の括弧をもつことができる(例えば  “%q[[abc][def]]”)

。これら

の二つの括弧と異なる括弧及びエスケープされた括弧は,この入れ子関係では無視される。

例えば,“%q[\[abc\)def(]”  は,“[abc\)def(”  を内容としてもつ String クラスの直

接のインスタンスを表す。この場合,《リテラル開始区切り子》及び対応する《リテラル開始区

切り子》はそれぞれ  “[”  及び  “]”  であるため,“[”,“]”  及び  “\”  だけが《非展開リテラル

エスケープ文字》となることができる。

意味規則

《引用符非展開リテラル文字列》の値は,その《引用符非展開リテラル文字列》の《非展開区切り文字列》の

《非展開リテラル文字列》群が表す内容を連結した内容をもつ文字列を表す。

《非展開リテラル文字列》の値は,《非展開リテラルエスケープ文字並び》を除き,プログラムテキスト中

に出現する文字列を,文字どおりに表す。

注記 2  《非展開リテラル文字列》によって表される文字列の内容は,その《非展開リテラル文字列》内

の《非展開区切り文字列》の《リテラル開始区切り子》及び《リテラル終了区切り子》を含む。例

えば,“%q((abc))”  は  “(abc)”  という内容をもつ String クラスの直接のインスタンス

を表す。

《非展開リテラルエスケープ文字並び》の値は次のような文字を表す。“\\”  は単一の  “\”  を表す。“\”

《リテラル開始区切り子》は《リテラル開始区切り子》を表す。“\”  《リテラル終了区切り子》は《リテラル終了

区切り子》を表す。


32

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.6.3.5  引用符展開リテラル文字列 

構文規則

《引用符展開リテラル文字列》 ::

  “%” “Q”

?

  《展開区切り文字列》

《展開区切り文字列》 ::

  《リテラル開始区切り子》  《展開リテラル文字列》

*

  《リテラル終了区切り子》

《展開リテラル文字列》 ::

  《展開リテラル文字》

|《展開区切り文字列》

《展開リテラル文字》 ::

  《非エスケープリテラル文字》  −  “#”

|“#”  [先読み∉{“$”, “@”, “{”}

|《二重エスケープ列》

|《挿入文字並び》

《展開区切り文字列》内の全ての《リテラル開始区切り子》は,同じ文字でなければならない。《展開区切り

文字列》内の全ての《リテラル終了区切り子》は,同じ文字でなければならない。

《リテラル終了区切り子》は,8.7.6.3.4 で規定されるとおり,《リテラル開始区切り子》と対応した文字で

なければならない。

《引用符展開リテラル文字列》内の《展開リテラル文字列》の《展開区切り文字列》は,その《展開区切り文字

列》の《リテラル開始区切り子》が 8.7.6.3.4 

表 の左側の列の文字である場合にだけ適用する。

意味規則

《引用符展開リテラル文字列》の値は,その《引用符展開リテラル文字列》の《展開区切り文字列》の《展開リ

テラル文字列》群が表す内容を連結した内容をもつ文字列を表す。

《展開リテラル文字列》中の文字は,《二重エスケープ列》及び《挿入文字並び》を除き,プログラムテキス

ト中に出現する文字を文字どおりに表現する。《二重エスケープ列》及び《挿入文字並び》は 8.7.6.3.3 で規定

する文字を表現する。

注記  《展開リテラル文字列》によって表される文字列の内容は,その《展開リテラル文字列》内の《展開

区切り文字列》の《リテラル開始区切り子》及び《リテラル終了区切り子》を含む。例えば,

“%Q((#{1 + 2}))”  は  “(3)”  という内容をもつ文字列を表す。

8.7.6.3.6  ヒアドキュメント 

構文規則

《ヒアドキュメント》 ::

  《ヒアドキュメント開始行》  《ヒアドキュメント本体》  《ヒアドキュメント終端行》

《ヒアドキュメント開始行》 ::

  《ヒアドキュメント指示子》  《行残り》

《ヒアドキュメント指示子》 ::

  “<<”  《ヒアドキュメント区切り子特定子》

《行残り》 ::

  《行内容》

?

  《行終端子》


33

X 3017

:2013 (ISO/IEC 30170:2012)

《ヒアドキュメント本体》 ::

  《ヒアドキュメント本体行》

*

《ヒアドキュメント本体行》 ::

  (  《行内容》  《行終端子》  )  −  《ヒアドキュメント終端行》

《ヒアドキュメント区切り子特定子》 ::

  “-”

?

  《ヒアドキュメント区切り子》

《ヒアドキュメント区切り子》 ::

  《非引用区切り子》

|《一重引用符区切り子》

|《二重引用符区切り子》

|《コマンド引用区切り子》

《非引用区切り子》 ::

  《非引用区切り子識別子》

《非引用区切り子識別子》 ::

  《識別子文字》

*

《一重引用符区切り子》 ::

  “'”  《一重引用符区切り子識別子》  “'”

《一重引用符区切り子識別子》 ::

  (  《ソース文字》

*

  )  −  (  《ソース文字》

*

  (  “'”|《行終端子》  )  《ソース文字》

*

  )

《二重引用符区切り子》 ::

  “"”  《二重引用符区切り子識別子》  “"”

《二重引用符区切り子識別子》 ::

  (  《ソース文字》

*

  )  −  (  《ソース文字》

*

  (  “"”|《行終端子》  )  《ソース文字》

*

  )

《コマンド引用区切り子》 ::

    “‘”  《コマンド引用区切り子識別子》  “‘”

《コマンド引用区切り子識別子》 ::

  (  《ソース文字》

*

  )  −  (  《ソース文字》

*

  (  “‘”|《行終端子》  )  《ソース文字》

*

  )

《ヒアドキュメント終端行》 ::

  《インデント付きヒアドキュメント終端行》

|《インデントなしヒアドキュメント終端行》

《インデント付きヒアドキュメント終端行》 ::

  [行頭]  《空白類》

*

  《ヒアドキュメント区切り子識別子》  《行終端子》

《インデントなしヒアドキュメント終端行》 ::

  [行頭]  《ヒアドキュメント区切り子識別子》  《行終端子》

《ヒアドキュメント区切り子識別子》 ::

  《非引用区切り子識別子》

|《一重引用符区切り子識別子》

|《二重引用符区切り子識別子》

|《コマンド引用区切り子識別子》


34

X 3017

:2013 (ISO/IEC 30170:2012)

《ヒアドキュメント》内の《ヒアドキュメント指示子》,《ヒアドキュメント本体》及び《ヒアドキュメント終

端行》は一つの単位として扱われ,

《ヒアドキュメント指示子》が現れた位置に現れる単一の字句であるとみ

なされる。《行残り》の最初の文字が,《ヒアドキュメント》が処理された直後の入力の先頭となる。

《ヒアドキュメント終端行》の形式は,《ヒアドキュメント区切り子特定子》の  “-”  が出現するかどうかに

よって決まる。

《ヒアドキュメント区切り子特定子》が文字  “-”  から始まる場合,《インデント付きヒアドキュメント終

端行》という形式の行が,《ヒアドキュメント終端行》とみなされる。そうではない場合,《インデントなし

ヒアドキュメント終端行》という形式の行が,《ヒアドキュメント終端行》とみなされる。どちらの形式にお

いても,《ヒアドキュメント区切り子識別子》は,《ヒアドキュメント区切り子》の該当する部分と同じ文字

の並びでなければならない。

《ヒアドキュメント区切り子》が《非引用区切り子》という形式の場合,《ヒアドキュメント区切り子識別

子》は,

《非引用区切り子識別子》と同じ文字の並びでなければならない。《ヒアドキュメント区切り子》が《一

重引用符区切り子》という形式の場合,《ヒアドキュメント区切り子識別子》は,《一重引用符区切り子識別

子》と同じ文字の並びでなければならない。

《ヒアドキュメント区切り子》が《二重引用符区切り子》という形

式の場合,《ヒアドキュメント区切り子識別子》は,《二重引用符区切り子》と同じ文字の並びでなければな

らない。《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式の場合,《ヒアドキュメント区

切り子識別子》は,《コマンド引用区切り子識別子》と同じ文字の並びでなければならない。

意味規則

《ヒアドキュメント》の評価結果の値は,String クラスの直接のインスタンス,又は  “‘”  メソッドの呼

出し結果である。

《ヒアドキュメント》の評価結果であるオブジェクトは,次のように作成する。

a)  《ヒアドキュメント本体》から String クラスの直接のインスタンス を作る。その内容は,次に示す

とおり《ヒアドキュメント区切り子》の形式に依存する。

−  《ヒアドキュメント区切り子》が《一重引用符区切り子》という形式の場合,の内容は,この《ヒアド

キュメント本体》の《ソース文字》の並びとする。

−  《ヒアドキュメント区切り子》が《非引用区切り子》,《二重引用符区切り子》又は《コマンド引用区切り

子》という形式である場合,の内容は,《ヒアドキュメント本体》を《二重引用符文字列文字》

8.7.6.3.3 参照)の並びとみなした場合に,その《ヒアドキュメント本体》が表す文字の並びとする。

b)  《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式でない場合,を とする。

c)  《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式である場合,現在の self に対し,S

を要素とする一要素のリストを実引数リストとして,“‘”  メソッドを呼び出す。呼出し結果の値を V

とする。

d)  《ヒアドキュメント》の評価結果の値は,とする。


35

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.6.3.7  外部コマンド実行 

構文規則

《外部コマンド実行》 ::

  《逆引用符外部コマンド実行》

|《引用符外部コマンド実行》

《逆引用符外部コマンド実行》 ::

  “‘”  《逆引用符外部コマンド実行文字》

*

 “‘”

《逆引用符外部コマンド実行文字》 ::

  《ソース文字》  −  (  “‘”|“#”|““”  )

|“#”  [先読み∉{“$”, “@”, “{”}]

|《二重エスケープ列》

|《挿入文字並び》

《引用符外部コマンド実行》 ::

  “%x”  《展開区切り文字列》

意味規則

《外部コマンド実行》は,“‘”  メソッドを呼び出すための形式である。

《外部コマンド実行》は,次の手順で評価する。

a)  《外部コマンド実行》が《逆引用符外部コマンド実行》の場合,《逆引用符外部コマンド実行文字》が表現

する文字の並びを内容とする String クラスの直接のインスタンス を作成する。《逆引用符外部コ

マンド実行文字》は,《二重エスケープ列》及び《挿入文字並び》を除き,プログラムテキスト中に出現す

る文字を文字どおりに表現する。《二重エスケープ列》及び《挿入文字並び》は,8.7.6.3.3 で規定する文

字を表現する。

b)  《外部コマンド実行》が《引用符外部コマンド実行》の場合,“%x”  を  “%Q”  で置き換えてできる《引用符

展開リテラル文字列》を,8.7.6.3.5 で規定するとおりに評価することで,String クラスの直接のイン

スタンス を作成する。

c)  現在の self に対し,“‘”  メソッドを,を要素とする一要素のリストを実引数リストとして呼び出す。 
d)  呼出し結果の値を《外部コマンド実行》の値とする。 
8.7.6.4  配列リテラル 

構文規則

《配列リテラル》 ::

  《引用符非展開配列生成子》

|《引用符展開配列生成子》

《引用符非展開配列生成子》 ::

  “%w”  《リテラル開始区切り子》  《非展開配列内容》  《リテラル終了区切り子》

《非展開配列内容》 ::

  《引用符配列要素分離子リスト》

?

  《非展開配列要素リスト》

?

  《引用符配列要素分離子リスト》

?

《非展開配列要素リスト》 ::

  《非展開配列要素》  (  《引用符配列要素分離子リスト》  《非展開配列要素》  )

*

《引用符配列要素分離子リスト》 ::


36

X 3017

:2013 (ISO/IEC 30170:2012)

  《引用符配列要素分離子》

+

《引用符配列要素分離子》 ::

  《空白類》

|《行終端子》

《非展開配列要素》 ::

  《非展開配列要素文字》

+

《非展開配列要素文字》 ::

  《非エスケープ配列文字》

|《非展開配列エスケープ列》

《非エスケープ配列文字》 ::

  《非エスケープリテラル文字》  −  《引用符配列要素分離子》

《非展開配列エスケープ列》 ::

  《非展開リテラルエスケープ列》

|“\”  《引用符配列要素分離子》

《引用符展開配列生成子》 ::

  “%W”  《リテラル開始区切り子》  《展開配列内容》  《リテラル終了区切り子》

《展開配列内容》 ::

  《引用符配列要素分離子リスト》

?

  《展開配列要素リスト》

?

  《引用符配列要素分離子リスト》

?

《展開配列要素リスト》 ::

  《展開配列要素》  (  《引用符配列要素分離子リスト》  《展開配列要素》  )

*

《展開配列要素》 ::

  《展開配列要素文字》

+

《展開配列要素文字》 ::

  《非エスケープ配列要素文字》

|“#”  [先読み∉{“$”, “@”, “{”}

|《展開配列エスケープ列》

|《挿入文字並び》

《非エスケープ配列要素文字》 ::

  《ソース文字》  −  (  《引用符配列要素分離子》|“\”|“#”  )

《展開配列エスケープ列》 ::

  《二重エスケープ列》

|“\”  《引用符配列要素分離子》

《リテラル終了区切り子》は,8.7.6.3.4 で規定されるとおり,《リテラル開始区切り子》に対応した文字で

なければならない。

《リテラル開始区切り子》が 8.7.6.3.4 の表 の左側の列のいずれの文字でもない場合,《非エスケープ配列

要素文字》はその《リテラル開始区切り子》であってはならない。

《リテラル開始区切り子》が 8.7.6.3.4 の表 の左側の列の文字であった場合,《引用符非展開配列生成子》

又は《引用符展開配列生成子》は,次の条件を満たさなければならない。ここで,はその《引用符非展開配

列生成子》又は《引用符展開配列生成子》を,は《リテラル開始区切り子》を,は 8.7.6.3.4 

表 で に対


37

X 3017

:2013 (ISO/IEC 30170:2012)

応する《リテラル終了区切り子》を,

内の の数”は 内に現れる の数(ただし,《非展開配列エスケ

ープ列》又は《展開配列エスケープ列》内に現れる場合を除く。

)を表す。

−  内の の数と 内の の数とが等しい。

−  最初の から始まり,最後の より前の位置で終わる の任意の部分文字列 について,内の 

数が 内の の数より大きい。

注記  上記の条件は《配列リテラル》内の入れ子の括弧のためにある。括弧の対応は,《配列リテラル》

の値の構造とは関係がない。例えば,“%w[[ab cd][ef]]”  は  “["[ab", "cd][ef]"]”  を

表す。

意味規則

《配列リテラル》の評価結果は Array クラスの直接のインスタンスとし,次の手順で評価を行う。

a)  《引用符非展開配列生成子》は次の手順で評価する。

1)  Array クラスの空の直接のインスタンスを作成する。をこのインスタンスとする。 
2)  《非展開配列要素リスト》が存在する場合,《非展開配列要素リスト》のそれぞれの《非展開配列要素》

について,次の手順を行う。

i)

《非展開配列要素文字》の並びで表現される中身をもった String クラスの直接のインスタンス S

を作成する。

《非展開配列エスケープ列》を除く《非展開配列要素文字》は,プログラムテキストに現れるままの

文字を表現する。《非展開配列エスケープ列》は,8.7.6.3.4 で示されているとおりに《非展開リテラ

ルエスケープ列》で表現される文字を表現する。ただし,“\”  《引用符配列要素分離子》という形式

の《非展開配列エスケープ列》は,その《引用符配列要素分離子》をプログラムテキスト中に出現す

る文字どおりに表現する。

ii)  を の末尾に追加する。

3)  《引用符非展開配列生成子》の値は とする。

b)  《引用符展開配列生成子》は,次の手順で評価する。

1)  Array クラスの空の直接のインスタンスを作成する。をこのインスタンスとする。 
2)  《展開配列要素リスト》が存在する場合,《展開配列要素リスト》のそれぞれの《展開配列要素》を次の

とおり処理する。

i)

《展開配列要素文字》の並びで表現される中身をもった String クラスの直接のインスタンス 

作成する。

《展開配列要素文字》は,《展開配列エスケープ列》及び《挿入文字並び》を除き,プログラムテキス

トに現れるままの文字を表現する。《展開配列エスケープ列》は,8.7.6.3.3 で示されているとおり

に《二重エスケープ列》の表現する文字を表す。ただし,“\”  《引用符配列要素分離子》という形式

の《展開配列エスケープ列》は,その《引用符配列要素分離子》をプログラムテキスト中に出現する

文字どおりに表現する。《挿入文字並び》は,8.7.6.3.3 で示されているような文字の並びを表現す

る。

ii)  を の末尾に追加する。

3)  《引用符展開配列生成子》の値は とする。


38

X 3017

:2013 (ISO/IEC 30170:2012)

8.7.6.5  正規表現リテラル 

構文規則

《正規表現リテラル》 ::

  “/”  《正規表現本体》  “/”  《正規表現オプション》

*

|“%r”  《リテラル開始区切り子》  《展開リテラル文字列》

*

    《リテラル終了区切り子》  《正規表現オプション》

*

《正規表現本体》 ::

  《正規表現文字》

*

《正規表現文字》 ::

  《ソース文字》  −  (  “/”|“#”|“\”  )

|“#”  [先読み∉{“$”, “@”, “{”}

|《正規表現非エスケープ列》

|《正規表現区切り文字エスケープ列》

|《行終端子エスケープ列》

|《挿入文字並び》

《正規表現非エスケープ列》 ::

  “\”  《正規表現非エスケープ文字》

《正規表現非エスケープ文字》 ::

  《ソース文字》  −  (0x0d|0x0a)

|0x0d  [先読み∉{0x0a}

《正規表現区切り文字エスケープ列》 ::

  “\” “/”

《正規表現オプション》 ::

  “i”|“m”

《正規表現リテラル》の《展開リテラル文字列》中に出現する《リテラル開始区切り子》は,その《正規表現リ

テラル》の《リテラル開始区切り子》と同じ文字でなければならない。

《リテラル終了区切り子》は,8.7.6.3.4 で規定されるとおり,《リテラル開始区切り子》と対応していなけ

ればならない。

意味規則

《正規表現リテラル》の評価結果は,Regexp クラスの直接のインスタンスとする。

《正規表現リテラル》の評価結果である Regexp クラスのインスタンスのパターン属性(15.2.15.1 参照)

は,《正規表現文字》の並び又は《展開リテラル文字列》の並びが表す文字列とする。その文字列は,《パター

ン》(15.2.15.4 参照)という形式でなければならない。

《正規表現文字》(ただし,《正規表現区切り文字エスケープ列》,《行終端子エスケープ列》又は《挿入文字

並び》を除く。

)は,プログラムテキスト中に出現するそれ自身の文字列を表す。《展開リテラル文字列》(た

だし,《行終端子エスケープ列》又は《挿入文字並び》を除く。

)は,プログラムテキスト中に出現するそれ自

身の文字列を表す。

《正規表現区切り文字エスケープ列》は,文字  “/”  を表す。

《正規表現文字》内及び《展開リテラル文字列》内の《行終端子エスケープ列》は,評価結果の Regexp クラ


39

X 3017

:2013 (ISO/IEC 30170:2012)

スのインスタンスのパターン属性内では無視する。

《正規表現リテラル》内及び《展開リテラル文字列》内の《挿入文字並び》の評価結果の値は,その《挿入文字

並び》を 8.7.6.3.3 で規定するとおりに評価した結果である String クラスのインスタンスの内容とする。

《正規表現オプション》は,《正規表現リテラル》の評価結果である Regexp クラスのインスタンスの大小

文字同一視フラグ属性及び複数行フラグ属性を指定する。

《正規表現オプション》の  “i”  が存在する場合は,

評価結果の Regexp クラスのインスタンスの大小文字同一視フラグ属性を真とする。《正規表現オプショ

ン》の  “m”  が存在する場合は,

評価結果の Regexp クラスのインスタンスの複数行フラグ属性を真とする。

《正規表現リテラル》から作られる Regexp クラスのインスタンスのパターン属性の構文規則は,

15.2.15.4 で規定する。 
8.7.6.6  シンボルリテラル 

構文規則

《シンボル》 ::

  《シンボルリテラル》

|《動的シンボル》

《シンボルリテラル》 ::

  “:”  《シンボル名》

《動的シンボル》 ::

  “:”  《一重引用符文字列》

|“:”  《二重引用符文字列》

|“%s”  《リテラル開始区切り子》  《非展開リテラル文字列》

*

  《リテラル終了区切り子》

《シンボル名》 ::

  《インスタンス変数識別子》

|《大域変数識別子》

|《クラス変数識別子》

|《定数識別子》

|《局所変数識別子》

|《メソッド専用識別子》

|《代入風メソッド識別子》

|《演算子メソッド名》

|《キーワード》

《動的シンボル》の,《一重引用符文字列》,《二重引用符文字列》又は《非展開リテラル文字列》は,その《一

重引用符文字列》,《二重引用符文字列》又は《非展開リテラル文字列》を,8.7.6.3.28.7.6.3.3 又は 8.7.6.3.4

に規定されているとおりに評価した場合に,評価結果の文字列中で文字 0x00 となるような,いかなるプロ

グラムテキスト上の文字の並びも含んではならない。

《非展開リテラル文字列》中に出現する《リテラル開始区切り子》は,《動的シンボル》の《リテラル開始区切

り子》と同じ文字でなければならない。

《リテラル終了区切り子》は,8.7.6.3.4 で規定されるとおり,《リテラル開始区切り子》と対応していなけ

ればならない。

意味規則


40

X 3017

:2013 (ISO/IEC 30170:2012)

《シンボル》の評価結果は,Symbol クラスの直接のインスタンスとする。《シンボルリテラル》の評価結

果は,名前が《シンボル名》であるような Symbol クラスの直接のインスタンスとする。《動的シンボル》の

評価結果は,《一重引用符文字列》(8.7.6.3.2 参照)

,《二重引用符文字列》(8.7.6.3.3 参照)

,又は《非展開リ

テラル文字列》

8.7.6.3.4 参照)

の値である String クラスのインスタンスの内容をその名前にもつような,

Symbol

クラスの直接のインスタンスとする。その String クラスのインスタンスの内容に文字 0x00 が含

まれる場合,ArgumentError クラスの直接のインスタンスを例外として発生させてもよい。

注記  国際規格では例外を発生させることを“raise”と 1 単語で表現しているが,この規格では,

“例外

として発生させる”と訳す。

変数のスコープ 

9.1 

概要 

局所変数又は大域変数のスコープは静的スコープであり,それはプログラムテキスト上の範囲の集合と

する。

インスタンス変数,定数及びクラス変数は実行環境によって動的に決まるスコープをもつ。それらの束

縛は,実行環境の属性の値に従って探索される(11.5.4.211.5.4.5 及び 11.5.4.6 参照)

9.2 

局所変数のスコープ 

局所変数は《局所変数識別子》によって参照される。

局所変数のスコープは,次のプログラム構成要素によって導入される。

−  《プログラム》(10.1 参照)

−  《クラス本体》(13.2.2 参照)

−  《モジュール本体》(13.1.2 参照)

−  《特異クラス本体》(13.4.2 参照)

−  《メソッド定義》(13.3.1 参照)及び《特異メソッド定義》(13.4.3 参照)

。この両者におけるスコープは,

《メソッド仮引数部》で始まり《メソッド本体》まで(《メソッド本体》を含む。)となる。

−  《ブロック》(11.3.3 参照)

を上記のプログラム構成要素の一つとする。の範囲から,の内部に入れ子になっているプログラ

ム構成要素(ただし《ブロック》を除く。

)が占める部分を除いた範囲を,とする。この を,そのプログ

ラム構成要素に対応する局所変数のスコープと呼ぶ。

ある局所変数のスコープは,その局所変数の束縛を含んでいる局所変数束縛の集合に対応している局所

変数のスコープである。

局所変数の参照となっている《局所変数識別子》に対して,その局所変数の束縛は,次の手順で解決され

る。

a)  を《局所変数識別子》とする。を現在の局所変数束縛の集合とする。 
b)  を のスコープとする。 
c)  名前が である束縛が の中に存在する場合,その束縛が解決された束縛となる。

d)  名前が である束縛が の中に存在しない場合には,次の手順を行う。

1)  がある《ブロック》に対応する局所変数のスコープの場合,次の手順を行う。

i)

その《局所変数識別子》が《ブロック仮引数リスト》の《左辺》の場合,次の手順を実行するかどうか

は,処理系定義とする。

ii)  を新たに,⟦局所変数束縛集合⟧の中で現在の のすぐ下にある要素とする。そして,名前 


41

X 3017

:2013 (ISO/IEC 30170:2012)

束縛を探索する処理を,手順 b)から継続する。

2)  そうではない場合,束縛は解決されないとみなされる。

9.3 

大域変数のスコープ 

大域変数のスコープは,プログラムの任意の位置から,その大域変数が参照できるという意味で大域的

である。大域変数束縛は,⟦大域変数束縛集合⟧の中に作られる。

10  プログラム構造 
10.1  
プログラム 

構文規則

《プログラム》 ::

  《複合文》

規格に厳密に適合するプログラムのプログラムテキストは,非終端記号《プログラム》が表す文字の並び

の集合の要素でなければならない。評価される可能性のないプログラム構成要素を含むプログラムの動作

は,未規定とする。

意味規則

《プログラム》は,次の手順で評価する。

a)  空集合を,⟦局所変数束縛集合⟧に積む。 
b)  《複合文》を評価する。 
c)  《複合文》の評価結果の値を,《プログラム》の値とする。

d)  ⟦局所変数束縛集合⟧の一番上の要素を取り除くことによって実行環境を復元する。 
10.2  複合文 

構文規則

《複合文》 ::

  《文リスト》

?

  《分離子リスト》

?

《文リスト》 ::

  《文》  (  《分離子リスト》  《文》  )

*

《分離子リスト》 ::

  《分離子》

+

《分離子》 ::

  “;”

|[《行終端子》必須]

意味規則

《複合文》は,次の手順で評価する。

a)  その《複合文》の《文リスト》がない場合,《複合文》の値は nil とする。 
b)  その《複合文》の《文リスト》がある場合,《文リスト》のそれぞれの《文》を,プログラムテキストに現れ

る順に評価する。《文リスト》の中で最後に評価した《文》の評価結果の値を,《複合文》の値とする。


42

X 3017

:2013 (ISO/IEC 30170:2012)

11   
11.1  
概要 

構文規則

《式》 ::

  《NOT式》

|《キーワードAND式》

|《キーワードOR式》

NOT式》 ::

  《演算子式》

|《括弧なしメソッド呼出し》

|“!”  《括弧なしメソッド呼出し》

|《キーワードNOT式》

《式》は,《文》(箇条 12 参照)を構成するプログラム要素である。《式》一つだけで《式文》(12.2 参照)と

して《文》を構成することもできる。

注記  《式》と《文》との違いは,通常,《式》は値を必要とする場所で使われ,《文》は必ずしも値を必要

としない場所で使われることである。ただし,《ジャンプ式》(11.5.2.4 参照)のように値をもた

ない《式》があったり,《複合文》の最後の《文》のように《文》でも値が使われることがあったりす

るなど,幾つかの例外がある。

意味規則

《キーワード AND 式》については,11.2.3 を参照。《キーワード OR 式》については,11.2.4 を参照。

《演算子式》という形式の《NOT 式》は 11.4 に規定されるように評価する。《括弧なしメソッド呼出し》とい

う形式の《NOT 式》は 11.3 に規定されるように評価する。その他の《NOT 式》については,11.2.2 を参照。

11.2  論理式 
11.2.1  
概要 

構文規則

《論理式》 ::=

  《論理NOT式》

|《論理AND式》

|《論理OR式》

《論理 NOT 式》,《論理 AND 式》及び《論理 OR 式》のいずれも概念的名前であり,キーワードを使った形

式(例えば,

“not x”

)と演算子を使った形式(例えば,

“!x”

)とをまとめて表すために使用する。

《論理 NOT 式》については,11.2.2 を参照。《論理 AND 式》については,11.2.3 を参照。《論理 OR 式》につ

いては,11.2.4 を参照。


43

X 3017

:2013 (ISO/IEC 30170:2012)

11.2.2  論理 NOT  

構文規則

《論理NOT式》 ::=

  《キーワードNOT式》

|《演算子NOT式》

《キーワードNOT式》 ::

  “not”  《NOT式》

《演算子NOT式》 ::=

  “!”  (  《括弧なしメソッド呼出し》|《単項式》  )

注記  “!”  《単項式》という形式の《演算子 NOT 式》は《単項式》(11.4.3.1 参照)である。“!”  《括弧なし

メソッド呼出し》という形式の《演算子 NOT 式》は《NOT 式》(11.1 参照)である。

意味規則

a)  《論理 NOT 式》は,次の手順で評価する。

1)  評価対象の式が,“not”  《NOT 式》という形式の場合,《NOT 式》を評価する。評価結果の値を 

する。

2)  評価対象の式が《演算子 NOT 式》の場合,その《括弧なしメソッド呼出し》又は《単項式》を評価する。

評価結果の値を とする。

3)  が真の場合,《論理 NOT 式》の値は false とする。 
4)  そうではない場合,《論理 NOT 式》の値は true とする。

b)  手順 a) 3)及び a) 4)の代わりに《論理 NOT 式》を次のとおり評価してもよい。

1)  空の実引数リスト を作成する。に対し,“!@”  メソッドを,を実引数リストとして呼び出す。

呼出し結果の値を《論理 NOT 式》の値とする。

この場合,処理系は次のことを行わなければならない。

−  “!@”  演算子を《演算子メソッド名》に含める。

−  Object クラス,Object クラスのいずれかのスーパークラス(6.5.4 参照)

,又は Object クラス

がインクルードしているいずれかのモジュールに,インスタンスメソッド  “!@”  を定義する。“!@”

メソッドは実引数をとってはならず,レシーバが false 又は nil の場合に true を返し,そうではない

場合に false を返さなければならない。

11.2.3  論理 AND  

構文規則

《論理AND式》 ::=

  《キーワードAND式》

|《演算子AND式》

《キーワードAND式》 ::

  《式》  [《行終端子》禁止]  “and”  《NOT式》

《演算子AND式》 ::

  《等価式》

|《演算子AND式》  [《行終端子》禁止]  “&&”  《等価式》


44

X 3017

:2013 (ISO/IEC 30170:2012)

意味規則

《論理 AND 式》は,次の手順で評価する。

a)  《論理 AND 式》が《等価式》である場合,その《等価式》を 11.4.4 で規定するとおりに評価する。 
b)  そうではない場合,次の手順を行う。

1)  《式》又は《演算子 AND 式》を評価する。評価結果の値を とする。

2)  が真の場合,《NOT 式》又は《等価式》を評価する。評価結果の値を とする。《論理 AND 式》の値

は とする。

3)  そうではない場合,《論理 AND 式》の値は とする。

11.2.4  論理 OR  

構文規則

《論理OR式》 ::=

  《キーワードOR式》

|《演算子OR式》

《キーワードOR式》 ::

  《式》  [《行終端子》禁止]  “or”  《NOT式》

《演算子OR式》 ::

  《演算子AND式》

|《演算子OR式》  [《行終端子》禁止]  “||”  《演算子AND式》

意味規則

《論理 OR 式》は,次の手順で評価する。

a)  《論理 OR 式》が《演算子 AND 式》である場合,その《演算子 AND 式》を 11.2.3 で規定するとおりに評価

する。

b)  そうではない場合,次の手順を行う。

1)  《式》又は《演算子 OR 式》を評価する。評価結果の値を とする。 
2)  が偽の場合,《NOT 式》又は《演算子 AND 式》を評価する。評価結果の値を とする。《論理 OR 式》

の値は とする。

3)  そうではない場合,《論理 OR 式》の値は とする。

11.3  メソッド呼出し式 
11.3.1  
概要 

構文規則

《メソッド呼出し式》 ::=

  《一次式メソッド呼出し》

|《括弧なしメソッド呼出し》

|《局所変数識別子》

《一次式メソッド呼出し》 ::

  《省略可能実引数付きsuper》

|《添字メソッド呼出し》

|《メソッド専用識別子》

|《メソッド識別子》  《ブロック》


45

X 3017

:2013 (ISO/IEC 30170:2012)

|《メソッド識別子》  《括弧付き実引数》  《ブロック》

?

|《一次式》  [《行終端子》禁止]  “.”  《メソッド名》  《括弧付き実引数》

?

  《ブロック》

?

|《一次式》  [《行終端子》禁止]  “::”  《メソッド名》  《括弧付き実引数》  《ブロック》

?

|《一次式》  [《行終端子》禁止]  “::”  《定数以外のメソッド名》  《ブロック》

?

《メソッド識別子》 ::

  《局所変数識別子》

|《定数識別子》

|《メソッド専用識別子》

《メソッド名》 ::

  《メソッド識別子》

|《演算子メソッド名》

|《キーワード》

《添字メソッド呼出し》 ::

  《一次式》  [《行終端子》禁止]  [《空白類》禁止]  “[”  《添字実引数リスト》

?

“]”

《定数以外のメソッド名》 ::

  《メソッド名》  −  《定数識別子》

《括弧なしメソッド呼出し》 ::

  《コマンド》

|《doブロック付き連鎖コマンド》

|《doブロック付き連鎖コマンド》  (  “.”|“::”  )  《メソッド名》  《括弧なし実引数》

|《実引数付きreturn》

|《実引数付きbreak》

|《実引数付きnext》

《コマンド》 ::

  《実引数付きsuper》

|《実引数付きyield》

|《メソッド識別子》  《括弧なし実引数》

|《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  《メソッド名》  《括弧なし実引数》

doブロック付き連鎖コマンド》 ::

  《doブロック付きコマンド》  《連鎖メソッド呼出し》

*

《連鎖メソッド呼出し》 ::

  (  “.”|“::”  )  《メソッド名》

|(  “.”|“::”  )  《メソッド名》  《括弧付き実引数》

doブロック付きコマンド》 ::

  《実引数・doブロック付きsuper》

|《メソッド識別子》  《括弧なし実引数》  《doブロック》

|《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  《メソッド名》

    《括弧なし実引数》  《doブロック》

《局所変数識別子》という形式の《メソッド呼出し式》については,11.5.4.7 を参照。


46

X 3017

:2013 (ISO/IEC 30170:2012)

《一次式メソッド呼出し》の《括弧付き実引数》(11.3.2 参照)が存在し,かつ,その《括弧付き実引数》内

の《実引数リスト》の《ブロック実引数》が存在する場合,《一次式メソッド呼出し》の《ブロック》は存在して

はならない。

do ブロック付きコマンド》の《括弧なし実引数》が存在し,かつ,その《実引数リスト》の《ブロック実引

数》が存在する場合(11.3.2 参照)

,《do ブロック付きコマンド》の《do ブロック》は存在してはならない。

《コマンド》又は《do ブロック付きコマンド》の《括弧なし実引数》が存在し,かつ,その《括弧なし実引数》

が  “&”,“<<”,“+”,“-”,“*”,“/”  及び  “%”  のいずれかで始まり,かつ,その《コマンド》又は《do ブロ

ック付きコマンド》の《メソッド識別子》が《局所変数識別子》である場合,その《局所変数識別子》は,

11.5.4.7.2 の手順によって局所変数への参照であるとみなされるものであってはならない。

意味規則

《メソッド呼出し式》は,次の手順で評価する。

a)  《一次式メソッド呼出し》は,次の手順で評価する。

1)  《一次式メソッド呼出し》が《省略可能実引数付き super》の場合,それを 11.3.4 で規定するとおりに評

価する。評価結果の値を《一次式メソッド呼出し》の値とする。

2)  《一次式メソッド呼出し》が《添字メソッド呼出し》の場合,それを手順 b)で規定するとおりに評価す

る。評価結果の値を《一次式メソッド呼出し》の値とする。

3) i)  《一次式メソッド呼出し》が《メソッド専用識別子》の場合,を現在の self,をその《メソッド専

用識別子》とする。空の実引数リスト を作成する。

ii)  《一次式メソッド呼出し》の《メソッド識別子》が存在する場合,次の手順を行う。

I)  現在の self を O,その《メソッド識別子》を とする。

II)  《括弧付き実引数》が存在する場合,11.3.2 で規定するとおりに,《括弧付き実引数》から実引数

リスト及び《ブロック》を作成する。結果のリストを とする。結果の《ブロック》(もしあれば)

を とする。

《括弧付き実引数》が存在しない場合,空の実引数リスト を作成する。

III)  《ブロック》が存在する場合,それを とする。

iii)  《一次式メソッド呼出し》の  “.”  が存在する場合,次の手順を行う。

I)  《一次式》を評価し,評価結果の値を とする。《メソッド名》を とする。 
II)  《括弧付き実引数》が存在する場合,11.3.2 で規定するとおりに,《括弧付き実引数》から実引数

リスト及び《ブロック》を作成する。結果のリストを とする。結果の《ブロック》(もしあれば)

を とする。

《括弧付き実引数》が存在しない場合,空の実引数リスト を作成する。

III)  《ブロック》が存在する場合,それを とする。

iv)  《一次式メソッド呼出し》の  “::”  及び《メソッド名》が存在する場合,次の手順を行う。

I)  《一次式》を評価し,評価結果の値を とする。《メソッド名》を とする。 
II)  11.3.2 で規定するとおりに,《括弧付き実引数》から実引数リスト及び《ブロック》を構成する。

結果のリストを とする。結果の《ブロック》(もしあれば)を とする。

III)  《ブロック》が存在する場合,それを とする。

v)  《一次式メソッド呼出し》の  “::”  及び《定数以外のメソッド名》が存在する場合,次の手順を行う。

I)  《一次式》を評価し,評価結果の値を とする。《定数以外のメソッド名》を とする。 
II)  空の実引数リスト を作成する。


47

X 3017

:2013 (ISO/IEC 30170:2012)

III)  《ブロック》が存在する場合,それを とする。

4)  メソッド を,に対し,を実引数リスト,を《ブロック》(もしあれば)として呼び出す(13.3.3

参照)

。呼出し結果の値を《一次式メソッド呼出し》の値とする。

b)  《添字メソッド呼出し》は,次の手順で評価する。

1)  《一次式》を評価する。評価結果の値を とする。

2)  《添字実引数リスト》が存在する場合,11.3.2 で規定するとおりに,《添字実引数リスト》から実引数

リストを作成する。このリストを とする。

3)  《添字実引数リスト》が存在しない場合,空の実引数リスト を作成する。

4)  “[]”  メソッドを,に対し,を実引数リストとして呼び出す。呼出し結果の値を《添字メソッド

呼出し》の値とする。

c)  《括弧なしメソッド呼出し》は,次の手順で評価する。

1)  《括弧なしメソッド呼出し》が《コマンド》の場合,それを手順 d)で規定するとおりに評価する。評価

結果の値を《括弧なしメソッド呼出し》の値とする。

2)  《括弧なしメソッド呼出し》が《実引数付き return》,《実引数付き break》又は《実引数付き next》(11.5.2.4

参照)の場合,それを評価する。この評価によって,11.5.2.4 で規定するように他のプログラム要素

に制御が移る。

3)  《括弧なしメソッド呼出し》の《do ブロック付き連鎖コマンド》が存在する場合,次の手順を行う。

i)

do ブロック付き連鎖コマンド》を手順 e)で規定するとおりに評価する。評価結果の値を とする。

ii)  《括弧なしメソッド呼出し》の《メソッド名》及び《括弧なし実引数》が存在する場合,次の手順を行

う。

I)  《メソッド名》を とする。 
II)  11.3.2 で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストを 

する。《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック

実引数》に対応する《ブロック》[11.3.2 e) 6)  参照]を とする。

III)  メソッド を,に対し,を実引数リスト,を《ブロック》(もしあれば)として呼び出す。 
IV)  の値を,呼出し結果の値に置き換える。

iii)  《括弧なしメソッド呼出し》の値は とする。

d)  《コマンド》は,次の手順で評価する。

1)  《コマンド》が《実引数付き super》又は《実引数付き yield》の場合,それを 11.3.4 又は 11.3.5 で規定す

るとおりに評価する。評価結果の値を《コマンド》の値とする。

2)  そうではない場合,次の手順を行う。

i)

《コマンド》の《メソッド識別子》が存在する場合,次の手順を行う。

I)  現在の self を O,その《メソッド識別子》を とする。 
II)  11.3.2 で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストを 

する。

《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック実引

数》に対応する《ブロック》を とする。

ii)  《コマンド》の《一次式》(11.5 参照),《メソッド名》及び《括弧なし実引数》が存在する場合,次の手

順を行う。

I)  《一次式》を評価する。評価結果の値を とする。《メソッド名》を とする。


48

X 3017

:2013 (ISO/IEC 30170:2012)

II)  11.3.2 で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストを 

する。

《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック実引

数》に対応する《ブロック》を とする。

iii)  メソッド を,に対し,を実引数リスト,を《ブロック》(もしあれば)として呼び出す。

呼出し結果の値を《コマンド》の値とする。

e)  《do ブロック付き連鎖コマンド》は,次の手順で評価する。

1)  《do ブロック付きコマンド》を手順 f)で規定するとおりに評価し,評価結果の値を とする。

2)  プログラムテキストに現れる順に,それぞれの《連鎖メソッド呼出し》について次の手順を行う。

i)

《連鎖メソッド呼出し》の《メソッド名》を とする。

ii)  《括弧付き実引数》が存在する場合,11.3.2 で規定するとおりに,《括弧付き実引数》から実引数リ

スト及び《ブロック》を作成する。結果のリストを とする。結果の《ブロック》(もしあれば)を

とする。

《括弧付き実引数》が存在しない場合,空の実引数リスト を作成する。

iii)  メソッド を,に対し,を実引数リスト,を《ブロック》(もしあれば)として呼び出す。 
iv)  の値を,呼出し結果の値で置き換える。

3)  《do ブロック付き連鎖コマンド》の値は,とする。

f)  《do ブロック付きコマンド》は,次の手順で評価する。

1)  《do ブロック付きコマンド》が《実引数・do ブロック付き super》の場合,それを 11.3.4 で規定すると

おりに評価する。評価結果の値を《do ブロック付きコマンド》の値とする。

2)  そうではない場合,次の手順を行う。

i)

do ブロック付きコマンド》の《メソッド識別子》が存在する場合,現在の self を O,《メソッド

識別子》を とする。

ii)  《do ブロック付きコマンド》の《一次式》が存在する場合,《一次式》を評価し,評価結果の値を O

《メソッド名》を とする。

iii)  《do ブロック付きコマンド》の《括弧なし実引数》から実引数リストを作成し,そのリストを 

する。

iv)  メソッド を,に対し,を実引数リスト,《do ブロック》を《ブロック》として呼び出す。呼

出し結果の値を《do ブロック付きコマンド》の値とする。


49

X 3017

:2013 (ISO/IEC 30170:2012)

11.3.2  メソッド実引数 

構文規則

《メソッド実引数》 ::=

  《添字実引数リスト》

|《括弧付き実引数》

|《括弧なし実引数》

《添字実引数リスト》 ::

  《コマンド》

|《演算子式リスト》  (  [《行終端子》禁止]  “,”  )

?

|《演算子式リスト》  [《行終端子》禁止]  “,”  《散開実引数》

|《連想リスト》  (  [《行終端子》禁止]  “,”  )

?

|《散開実引数》

《散開実引数》 ::

  “*”  《演算子式》

《演算子式リスト》 ::

  《演算子式》  (  [《行終端子》禁止]  “,”  《演算子式》  )

*

《括弧付き実引数》 ::

  [《行終端子》禁止]  [《空白類》禁止]  《括弧及び実引数》

《括弧及び実引数》 ::

  “(” “)”

|“(”  《実引数リスト》  “)”

|“(”  《演算子式リスト》  [《行終端子》禁止]  “,”  《doブロック付き連鎖コマンド》  “)”

|“(”  《doブロック付き連鎖コマンド》  “)”

《括弧なし実引数》 ::

  [先読み∉{“{”}]  [《行終端子》禁止]  《実引数リスト》

《実引数リスト》 ::

  《ブロック実引数》

|《散開実引数》  (  “,”  《ブロック実引数》  )

?

|《演算子式リスト》  [《行終端子》禁止]  “,”  《連想リスト》

  (  [《行終端子》禁止]  “,”  《散開実引数》  )

?

  (  [《行終端子》禁止]  “,”  《ブロック実引数》  )

?

|(  《演算子式リスト》|《連想リスト》  )

  (  [《行終端子》禁止]  “,”  《散開実引数》  )

?

  (  [《行終端子》禁止]  “,”  《ブロック実引数》  )

?

|《コマンド》

《ブロック実引数》 ::

  “&”  《演算子式》

《括弧なし実引数》が,“&”,“<<”,“+”,“-”,“*”,“/”  及び  “%”  のいずれかの文字の並びで始まる場

合,次の条件を満たさなければならない。

−  その《括弧なし実引数》の直前に一つ以上の《空白類》が存在しなければならない。

−  その文字の並びの直後に《空白類》が存在してはならない。


50

X 3017

:2013 (ISO/IEC 30170:2012)

注記  例えば,“x␣-y”  は,“x(-y)”  と同じとみなされる。“x-y”  及び  “x␣-␣y”  は,“x()␣-␣

y

”  とみなされる。ここで,“␣”は空白を表す。

意味規則

《メソッド実引数》の値は,実引数リスト及び《ブロック》の二つとし,メソッド呼出し時にそれらの値を

使用する。ただし,評価手順によっては《ブロック》を値としてもたないこともある。

《メソッド実引数》は次の手順で評価する。

a)  《添字実引数リスト》は,次の手順で評価する。

1)  空の実引数リスト を作成する。

2)  プログラムテキストに現れる順に,《コマンド》,《演算子式リスト》の《演算子式》又は《連想リスト》

を評価し,評価結果の値を の末尾に追加する。

3)  《散開実引数》が存在する場合,それを評価し,評価結果の実引数リストを の末尾に連結する。

4)  を《添字実引数リスト》の値の実引数リストとする。

b)  《散開実引数》は,次の手順で評価する。

1)  空の実引数リスト を作成する。

2)  《演算子式》を評価する。評価結果の値を とする。 
3)  が Array クラスのインスタンスでない場合の動作は未規定とする。 
4)  のそれぞれの要素を,添字順に,の末尾に追加する。 
5)  を《散開実引数》の値の実引数リストとする。

c)  《括弧付き実引数》は,次の手順で評価する。

1)  空の実引数リスト を作成する。

2)  《実引数リスト》が存在する場合,それを手順 e)のとおり評価し,その評価結果の実引数リストを L

の末尾に連結する。《実引数リスト》の《ブロック実引数》が存在する場合,《実引数リスト》の値の《ブ

ロック》を,《括弧付き実引数》の値の《ブロック》とする。

3)  《演算子式リスト》が存在する場合,《演算子式リスト》のそれぞれの《演算子式》に対し,それらがプ

ログラムテキストに現れる順に,次の手順を実行する。

i)

《演算子式》を評価する。評価結果の値を とする。

ii)  を,の末尾に追加する。

4)  《do ブロック付き連鎖コマンド》が存在する場合,それを評価する。評価結果の値を の末尾に追加

する。

5)  を《括弧付き実引数》の値の実引数リストとする。

d)  《括弧なし実引数》は,次の手順で評価する。

1)  《括弧なし実引数》の最初の文字が  “(”  である場合,動作は未規定とする。

2)  《実引数リスト》を,手順 e)のとおり評価する。 
3)  を処理結果のリストとする。

e)  《実引数リスト》は,次の手順で評価する。

1)  空の実引数リスト を作成する。 
2)  《コマンド》が存在する場合,それを評価する。評価結果の値を の末尾に追加する。 
3)  《演算子式リスト》が存在する場合,《演算子式リスト》のそれぞれの《演算子式》に対し,それらがプ

ログラムテキストに現れる順に,次のとおり処理する。

i)

《演算子式》を評価する。評価結果の値を とする。


51

X 3017

:2013 (ISO/IEC 30170:2012)

ii)  を,の末尾に追加する。

4)  《連想リスト》が存在する場合,それを評価する。評価結果の値を の末尾に追加する。

5)  《散開実引数》が存在する場合,それを基に実引数リストを作成し,その実引数リストを の末尾に

連結する。

6)  《ブロック実引数》が存在する場合,次の手順を行う。

i)

《ブロック実引数》の《演算子式》を評価する。評価結果の値を とする。

ii)  が Proc クラスのインスタンスでない場合,動作は未規定とする。 
iii)  が Proc クラスのインスタンスである場合,が表す《ブロック》を,《ブロック実引数》の値の《ブ

ロック》とする。

7)  を《実引数リスト》の値の実引数リストとする。

11.3.3  ブロック 

構文規則

《ブロック》 ::

  《波括弧ブロック》

|《doブロック》

《波括弧ブロック》 ::

  [《行終端子》禁止]  “{”  《ブロック仮引数》

?

  《ブロック本体》  “}”

doブロック》 ::

  [《行終端子》禁止]  “do”  《ブロック仮引数》

?

  《ブロック本体》  “end”

《ブロック仮引数》 ::

  “|” “|”

|“||”

|“|”  《ブロック仮引数リスト》  “|”

《ブロック仮引数リスト》 ::

  《左辺》

|《多重代入左辺》

《ブロック本体》 ::

  《複合文》

《ブロック仮引数リスト》の中に存在する,《左辺》(11.4.2.4 参照)が,次のいずれかの形式であることが

許可されるか否かは,処理系定義とする。

−  《定数識別子》

−  《大域変数識別子》

−  《インスタンス変数識別子》

−  《クラス変数識別子》

−  《一次式》  “[”  《添字実引数リスト》

?

 “]”

−  《一次式》  (  “.”|“::”  )  (  《局所変数識別子》  |  《定数識別子》  )

−  “::”  《定数識別子》

注記  既存の処理系の中には《ブロック仮引数》内に《定数識別子》などのプログラム構成要素を許すも

のがあるため,これらのプログラム構成要素が許されるかは処理系定義としている。今後の実


52

X 3017

:2013 (ISO/IEC 30170:2012)

装では,これらのプログラム構成要素を許さないようにするのが望ましい。

《ブロック仮引数リスト》の《多重代入左辺》の《グループ化された左辺》(11.4.2.4 参照)が,次の形式であ

ることが許可されるか否かは,処理系定義とする。

−  “(”  (  《多重代入左辺項目》  “,”  )

+

“)”

意味規則

《ブロック》は,メソッド呼出しに渡される手続きである。

《ブロック》は,《yield 式》(11.3.5 参照)によって呼び出すことができる。その呼出しを《ブロック》呼出

しという。また,Proc クラスに対して,その《ブロック》を渡して new メソッドを呼び出すことによって

生成された Proc クラスのインスタンスに対して,call メソッド(15.2.17.4.3 参照)を呼び出すことによ

っても,呼び出すことができる。

《ブロック》呼出しには,実引数を与えることができる。《ブロック》が《yield 式》によって呼び出された場

合は,《yield 式》に与えられた実引数が,《ブロック》呼出しの実引数となる。《ブロック》が call メソッド

の呼出しによって呼び出された場合は,call メソッドの呼出しに与えられた実引数が,《ブロック》呼出

しの実引数となる。

《ブロック》は,それが渡されたメソッド呼出しの直前の実行環境の下で評価される。ただし,《ブロック》

が,メソッド呼出しに渡された後に,⟦局所変数束縛集合⟧内の変数束縛に変更を加えた場合,実行環境に

も影響が及ぶ。この(影響を受けている可能性のある)実行環境を E

b

とする。

《ブロック》が呼び出された際に,その《ブロック》は次の手順で評価する。

a)  現在の実行環境を E

o

とする。《ブロック》に与えられた実引数のリストを とする。

b)  実行環境を E

b

に変更する。

c)  空の局所変数束縛の集合を⟦局所変数束縛集合⟧に積む。 
d)  《do ブロック》又は《波括弧ブロック》内に《ブロック仮引数リスト》が存在する場合,次の処理を行う。

1)  《ブロック仮引数リスト》が《左辺》又は《グループ化された左辺》のいずれかの形式である場合は,次

の手順を行う。

i)

の長さが 0 である場合,nil を とする。

ii)  の長さが 1 である場合,の唯一の要素を とする。

iii)  の長さが 1 より大きい場合,この手順の結果は未規定とする。 
iv)  《ブロック仮引数リスト》が《左辺》という形式である場合,《単一変数代入式》(11.4.2.2.2 参照)E

を評価する。ここで,の《変数》は《左辺》であり,の《演算子式》の値は とする。

v)  《ブロック仮引数リスト》が《グループ化された左辺》という形式である場合,《多対多代入文》

11.4.2.4 参照)を評価する。ここで,の《多重代入左辺》は《グループ化された左辺》であり,

の《括弧なしメソッド呼出し》又は《演算子式》の値は とする。

2)  《ブロック仮引数リスト》が《多重代入左辺》という形式であり,《多重代入左辺》が《グループ化された

左辺》ではない場合は,次の手順を行う。

i)

の長さが 1 の場合,次の手順を行う。

I)  の唯一の要素が Array クラスのインスタンスでない場合は,この手順の結果は未規定とする。 
II)  の要素を,同じ順序で含む実引数リスト を作る。

ii)  の長さが 0 であるか,1 より大きい場合は,を とする。

iii)  《多対多代入文》を,11.4.2.4 で規定するとおりに評価する。ここで,の《多重代入左辺》は《ブ

ロック仮引数リスト》であり,の《多重代入右辺》から作られる実引数リストは とする。


53

X 3017

:2013 (ISO/IEC 30170:2012)

e)  《ブロック本体》を評価する。

1)  《ブロック本体》の評価が《break 式》によって終了した場合は,次の手順を行う。

i)

《ブロック》が呼び出された時点で,《ブロック》が渡されたメソッド呼出しが既に終了していた場

合は,次の手順を行う。

I)  名前が  “break”  である Symbol クラスのインスタンスを,とする。

II)  《break 式》の《ジャンプ実引数》が存在した場合,その《ジャンプ実引数》の値を とする。それ

以外の場合は,nil を とする。

III)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”

であって値が であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のイン

スタンスを例外として発生させる。

ii)  それ以外の場合は,実行環境を E

o

に復元し,現在のメソッド呼出しの 13.3.3 i)の手順を終了し,

13.3.3 j)の手順を実行する。

break 式》の《ジャンプ実引数》が存在した場合,現在のメソッド呼出しの値はその《ジャンプ実引数》

の値とする。それ以外の場合は,現在のメソッド呼出しの値は nil とする。

2)  《ブロック本体》の評価が《redo 式》によって終了された場合は,手順 e)を再び実行する。 
3)  《ブロック本体》の評価が《next 式》によって終了された場合は,次の手順を行う。

i)

next 式》の《ジャンプ実引数》が存在した場合,その《ジャンプ実引数》の値を とする。

ii)  そうではない場合,nil を とする。

4)  《ブロック本体》の評価が《return 式》によって終了された場合は,⟦局所変数束縛集合⟧の一番上の値を

取り除く。

5)  それ以外によって終了された場合は,《ブロック本体》の評価結果の値を とする。

f)  手順 e)  が《return 式》によって終了された場合を除き,実行環境を E

o

に復元する。

g)  《do ブロック》又は《波括弧ブロック》の呼出しの評価結果は,とする。

11.3.4  super  

構文規則

super式》 ::=

  《省略可能実引数付きsuper》

|《実引数付きsuper》

|《実引数・doブロック付きsuper》

《省略可能実引数付きsuper》 ::

  “super”  (  [《行終端子》禁止]  [《空白類》禁止]  《括弧付き実引数》  )

?

  《ブロック》

?

《実引数付きsuper》 ::

  “super”  《括弧なし実引数》

《実引数・doブロック付きsuper》 ::

  “super”  《括弧なし実引数》  《doブロック》

《実引数・do ブロック付き super》の《括弧なし実引数》の《実引数リスト》(11.3.2 参照)に,《ブロック実

引数》が存在してはならない。

意味規則

super 式》は,次の手順で評価する。


54

X 3017

:2013 (ISO/IEC 30170:2012)

a)  現在の self が《特異クラス定義》(13.4.2 参照)によって積まれた場合,又は次のいずれかのメソッド

の呼出しによって積まれた場合は,動作は未規定とする。

−  Module クラスの class_eval メソッド(15.2.2.4.15 参照)

−  Module クラスの module_eval メソッド(15.2.2.4.35 参照)

−  Kernel クラスの instance_eval メソッド(15.3.1.3.18 参照)

b)  を空のリストとする。を⟦ブロック⟧の一番上の要素とする。

1)  《super 式》が《省略可能実引数付き super》であり,《括弧付き実引数》及び《ブロック》のいずれも存在

しない場合は,次のとおり実引数のリストを作成する。

i)

を現在のメソッド呼出しに対応するメソッドとする。の《メソッド仮引数部》の《仮引数リス

ト》を,とする。現在のメソッド呼出しに対応する⟦局所変数束縛集合⟧内の局所変数束縛の集合

を,とする。

ii)  《必須仮引数リスト》が 内に存在した場合,それぞれの《必須仮引数》に対し,次の手順を行う。

I)  内の名前が である束縛の値を,とする。 
II)  を の末尾に追加する。

iii)  《省略可能仮引数リスト》が 内に存在した場合,それぞれの《省略可能仮引数》に対し,次の手

順を行う。

I)  の《省略可能仮引数名》を,とする。

II)  内の名前が である束縛の値を,とする。 
III)  を の末尾に追加する。

iv)  《配列仮引数》が 内に存在した場合,次の手順を行う。

I)  《配列仮引数》の《配列仮引数名》を,とする。 
II)  内の名前が である束縛の値を,とする。のそれぞれの要素に対し,添字順に,の末尾

に追加する。

2)  《super 式》が《省略可能実引数付き super》であり,《括弧付き実引数》若しくは《ブロック》のいずれか,

又は両方が存在する場合は,次の手順を実行する。

i)

《括弧付き実引数》が存在する場合,11.3.2 で規定するとおりに,実引数のリスト及び《ブロック》

を作成する。作成されたリストを とし,作成された《ブロック》(もしあれば)を とする。

ii)  《ブロック》が存在する場合,その《ブロック》を とする。

3)  《super 式》が《実引数付き super》の場合,11.3.2 で規定するとおりに,《括弧なし実引数》から実引数の

リストを作成する。作成したリストを とする。《括弧なし実引数》の《実引数リスト》の《ブロック

実引数》が存在する場合,《ブロック実引数》から作成された《ブロック》を とする。

4)  《super 式》が《実引数・do ブロック付き super》の場合,11.3.2 で規定するとおりに,《括弧なし実引数》

から実引数のリストを作成する。作成されたリストを とする。《do ブロック》を とする。

c)  呼び出すメソッドを,次の手順によって決定する。

1)  を現在のクラス又はモジュールとする。を⟦定義時メソッド名⟧の一番上の要素とする。

2)  が Class クラスのインスタンスである場合,次の手順を行う。

i)

名前が であるメソッド束縛の探索を,13.3.4 の手順 b)のとおりに行う。ここで,13.3.4 の 

上記の とする。

ii)  束縛が見つかり,その値が undef  でない場合(13.1.1 参照),をその束縛の値とする。 
iii)  そうではない場合,次の手順を行う。


55

X 3017

:2013 (ISO/IEC 30170:2012)

I)  名前が である Symbol クラスの直接のインスタンスを の先頭に追加する。 
II)  を実引数,を《ブロック》として,現在の self に対し method_missing メソッド(15.3.1.3.30

参照)を呼び出す。

III)  呼出し結果の値を《super 式》の値とし,《super 式》の評価を終了する。

3)  が Module クラスのインスタンスであり,Class クラスのインスタンスではない場合,次の手順

を行う。

i)

を とし,現在の self のクラスを新たな とする。

ii)  のインクルードモジュールリスト L

m

に,が含まれているどうかを確認する。

iii)  が見つかった場合,次の手順を行う。

I)  L

m

中のモジュールに対して逆順に,の直前のモジュールから,先頭のモジュールまで処理す

る。それぞれのモジュールに対して,そのインスタンスメソッド束縛の集合内に,名前が 

あるメソッド束縛が存在するかどうか確認する。

II)  束縛が見つかり,その値が undef でない場合,その束縛の値を とする。 
III)  束縛が見つかり,その値が undef(13.1.1 参照)である場合,手順 c) 2) iii) I)から手順 c) 2) iii) III)

までを行う。

IV)  束縛が見つからず,が直接のスーパークラスをもつ場合,そのスーパークラスを とし,手

順 c) 2)を行う。ここで,手順 c) 2)の は であるとする。

V)  束縛が見つからず,が直接のスーパークラスをもたない場合,手順 c) 2) iii) I)から手順 c) 2) iii)

III)までを行う。

iv)  そうではない場合,の直接のスーパークラスを新たな とし,手順 c) 3) ii)から繰り返す。

直接のスーパークラスをもたない場合の動作は未規定とする。

d)  13.3.3 の g)h)i)及び j)を実行する。ここで,13.3.3 の ABM及び は,それぞれ,この細分

箇条の ABN,現在の self 及び とする。《super 式》の値は,これらの手順の実行結果の値とする。

11.3.5  yield  

構文規則

yield式》 ::=

  《省略可能実引数付きyield》

|《実引数付きyield》

《省略可能実引数付きyield》 ::

  《括弧・実引数付きyield》

|《括弧付き実引数なしyield》

|“yield”

《括弧・実引数付きyield》 ::

  “yield”  [《行終端子》禁止]  [《空白類》禁止]  “(”  《実引数リスト》  “)”

《括弧付き実引数なしyield》 ::

  “yield”  [《行終端子》禁止]  [《空白類》禁止]  “(” “)”

《実引数付きyield》 ::

  “yield”  《括弧なし実引数》

《括弧・実引数付き yield》の《実引数リスト》(11.3.2 参照)に,《ブロック実引数》が存在してはならない。


56

X 3017

:2013 (ISO/IEC 30170:2012)

《実引数付き yield》の《括弧なし実引数》の《実引数リスト》に,《ブロック実引数》が存在してはならない

11.3.2 参照)

意味規則

yield 式》は,次の手順で評価する。

a)  ⟦ブロック⟧の一番上の要素を とする。が block-not-given の場合,次の手順を行う。

1)  名前が  “noreason”  である Symbol クラスの直接のインスタンスを,とする。 
2)  処理系定義の値を とする。 
3)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”  で

あって値が であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のインスタン

スを例外として発生させる。

b)  《省略可能実引数付き yield》は,次の手順で評価する。

1)  《省略可能実引数付き yield》が《括弧・実引数付き yield》という形式の場合,11.3.2 で規定するとおり

に,《実引数リスト》から実引数のリストを作成する。作成されたリストを とする。

2)  《省略可能実引数付き yield》が《括弧付き実引数なし yield》又は  “yield”  のいずれかの形式の場合,

空の実引数のリストを作成する。そのリストを とする。

3)  を実引数として を呼び出す(11.3.3 参照)。 
4)  《ブロック》呼出しの評価結果の値を,《省略可能実引数付き yield》の値とする。

c)  《実引数付き yield》は,次の手順で評価する。

1)  11.3.2 で規定するとおりに,《括弧なし実引数》から実引数のリストを作成する。作成されたリスト

を とする。

2)  11.3.3 で規定するとおりに,を実引数として を呼び出す。 
3)  《ブロック》呼出しの評価結果の値を,《実引数付き yield》の値とする。

11.4  演算子式 
11.4.1  
概要 

構文規則

《演算子式》 ::

  《代入式》

|《括弧なしdefined?式》

|《条件演算子式》

《代入式》については,11.4.2 を参照。

注記 1  《代入文》は《演算子式》ではなく,《文》(12.1 参照)である。

《括弧なし defined?式》については,11.4.3.2 を参照。

注記 2  《括弧付き defined?式》は,《演算子式》ではなく《一次式》(11.5.1 参照)である。

《条件演算子式》については,11.5.2.2.5 を参照。


57

X 3017

:2013 (ISO/IEC 30170:2012)

11.4.2  代入 
11.4.2.1  
概要 

構文規則

《代入》 ::=

  《代入式》

|《代入文》

《代入式》 ::

  《単一代入式》

|《演算付き代入式》

|《rescue修飾子付き代入》

《代入文》 ::

  《単一代入文》

|《演算付き代入文》

|《多重代入文》

意味規則

《代入》は,変数束縛の作成若しくは更新を行うか,又は,“=”  で終わる名前のメソッドの呼出しを行う。

《代入式》及び《代入文》の評価は,11.4.2.211.4.2.5 で規定するとおりに行う。

11.4.2.2  単一代入 
11.4.2.2.1  
概要 

構文規則

《単一代入》 ::=

  《単一代入式》

|《単一代入文》

《単一代入式》 ::

  《単一変数代入式》

|《スコープ付き定数代入式》

|《単一添字代入式》

|《単一メソッド代入式》

《単一代入文》 ::

  《単一変数代入文》

|《スコープ付き定数代入文》

|《単一添字代入文》

|《単一メソッド代入文》


58

X 3017

:2013 (ISO/IEC 30170:2012)

11.4.2.2.2  単一変数代入 

構文規則

《単一変数代入》 ::=

  《単一変数代入式》

|《単一変数代入文》

《単一変数代入式》 ::

  《変数》  [《行終端子》禁止]  “=”  《演算子式》

《単一変数代入文》 ::

  《変数》  [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

意味規則

《単一変数代入》は,次の手順で評価する。

a)  《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。 
b) 1)   《変数》(11.5.4 参照)が《定数識別子》の場合,次の手順を行う。

i)

をその《定数識別子》とする。

ii)  現在のクラス又はモジュールの定数束縛の集合内に,名前が である束縛が存在する場合,その

束縛の値を で置き換える。

iii)  そうではない場合,名前が で,値が である束縛を作成し,それを現在のクラス又はモジュー

ルの定数束縛の集合に追加する。

2)  《変数》が《大域変数識別子》の場合,次の手順を行う。

i)

をその《大域変数識別子》とする。

ii)  名前が である束縛が,⟦大域変数束縛集合⟧内に存在する場合,その束縛の値を で置き換える。

ただし,その束縛が,実行環境の初期化時に処理系が追加した束縛(7.2 参照)である場合,その

動作は未規定とする。

iii)  そうではない場合,名前が で,値が である束縛を作成し,それを⟦大域変数束縛集合⟧に追加

する。

3)  《変数》が《クラス変数識別子》の場合,次の手順を行う。

i)

⟦クラスモジュールリスト⟧の一番上のリスト内の,特異クラスでない最初のクラス又はモジュー

ルを,とする。

とその全てのスーパークラスとを含む集合を,CS とする。CS のそれぞれの要素のインクル

ードモジュールリストについて,そこに含まれるモジュールを全て合わせた集合を,MS とする。

CS 及び MS の和集合を,CM とする。

をその《クラス変数識別子》とする。

ii)  CM 内のクラス又はモジュールに,そのクラス変数束縛の集合内に名前が である束縛をもつも

のが一つだけ存在した場合,その束縛を とする。

CM 内のクラス又はモジュールのうち,二つ以上のクラス又はモジュールが,名前が である

束縛をそのクラス変数束縛の集合内にもつ場合,これらの束縛の中から,処理系定義のやり方で,

束縛 を選ぶ。

の値を,で置き換える。

iii)  CM 内のクラス又はモジュールに,名前が である束縛をそのクラス変数束縛の集合内にもつも


59

X 3017

:2013 (ISO/IEC 30170:2012)

のが存在しなかった場合は,名前が で,値が である束縛を作成し,それを のクラス変数束

縛の集合に追加する。

4)  《変数》が《インスタンス変数識別子》の場合,次の手順を行う。

i)

をその《インスタンス変数識別子》とする。

ii)  現在の self のインスタンス変数束縛の集合内に,名前が である束縛が存在する場合,その束縛

の値を で置き換える。

iii)  そうではない場合,名前が で,値が である束縛を作成し,それを現在の self のインスタンス

変数束縛の集合に追加する。

5)  《変数》が《局所変数識別子》の場合,次の手順を行う。

i)

をその《局所変数識別子》とする。

ii)  名前が である局所変数束縛を,9.2 で規定するとおりに探す。

iii)  束縛が見つかった場合,その値を で置き換える。 
iv)  そうではない場合,名前が で,値が である束縛を作成し,それを現在の局所変数束縛の集合

に追加する。

c)  《単一変数代入》の値は,とする。 
11.4.2.2.3  スコープ付き定数代入 

構文規則

《スコープ付き定数代入》 ::=

  《スコープ付き定数代入式》

|《スコープ付き定数代入文》

《スコープ付き定数代入式》 ::

  《一次式》  [《行終端子》禁止]  [《空白類》禁止]  “::”  《定数識別子》

    [《行終端子》禁止]  “=”  《演算子式》

|“::”  《定数識別子》  [《行終端子》禁止]  “=”  《演算子式》

《スコープ付き定数代入文》 ::

  《一次式》  [《行終端子》禁止]  [《空白類》禁止]  “::”  《定数識別子》

    [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

|“::”  《定数識別子》  [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

意味規則

《スコープ付き定数代入》は,次の手順で評価する。

a)  《一次式》が存在する場合,それを評価し,評価結果の値を とする。そうではない場合,を Object

クラスとする。

b)  が Module クラスのインスタンスの場合,次の手順を行う。

1)  を《定数識別子》とする。

2)  《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。 
3)  の定数束縛の集合内に,名前が である束縛が存在する場合,その束縛の値を で置き換える。 
4)  そうではない場合,名前が で,値が である束縛を作成し,それを の定数束縛の集合に追加

する。

5)  《スコープ付き定数代入》の値は,とする。


60

X 3017

:2013 (ISO/IEC 30170:2012)

c)  が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外と

して発生させる。

11.4.2.2.4  単一添字代入 

構文規則

《単一添字代入》 ::=

  《単一添字代入式》

|《単一添字代入文》

《単一添字代入式》 ::

  《一次式》  [《行終端子》禁止]  [《空白類》禁止]  “[”  《添字実引数リスト》

?

 “]”

    [《行終端子》禁止]  “=”  《演算子式》

《単一添字代入文》 ::

  《一次式》  [《行終端子》禁止][《行終端子》禁止]  “[”  《添字実引数リスト》

?

 “]”

    [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

意味規則

《単一添字代入》は,次の手順で評価する。

a)  《一次式》を評価する。を評価結果の値とする。

b)  11.3.2 で規定するとおりに,《添字実引数リスト》から実引数のリストを作成する。をそのリストとす

る。

c)  《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。

d)  を,の末尾に追加する。 
e)  “[]=”  メソッドを,に対し,を実引数リストとして呼び出す。 
f)  《単一添字代入》の値は,とする。

11.4.2.2.5  単一メソッド代入 

構文規則

《単一メソッド代入》 ::=

  《単一メソッド代入式》

|《単一メソッド代入文》

《単一メソッド代入式》 ::

  《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  《局所変数識別子》

    [《行終端子》禁止]  “=”  《演算子式》

|《一次式》  [《行終端子》禁止]  “.”  《定数識別子》

    [《行終端子》禁止]  “=”  《演算子式》

《単一メソッド代入文》 ::

  《一次式》  [《行終端子》禁止] (“.”|“::”)  《局所変数識別子》

    [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

|《一次式》  [《行終端子》禁止]  “.”  《定数識別子》

    [《行終端子》禁止]  “=”  《括弧なしメソッド呼出し》

意味規則

《単一メソッド代入》は,次の手順で評価する。


61

X 3017

:2013 (ISO/IEC 30170:2012)

a)  《一次式》を評価する。を評価結果の値とする。 
b)  《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。

c)  を《局所変数識別子》又は《定数識別子》とする。と  “=”  とを連結したものを とする。 
d)  名前が であるメソッドを,に対し,ただ一つの値 を含む実引数リストとともに呼び出す。 
e)  《単一メソッド代入》の値は,とする。

11.4.2.3  演算付き代入 
11.4.2.3.1  
概要 

構文規則

《演算付き代入》 ::=

  《演算付き代入式》

|《演算付き代入文》

《演算付き代入式》 ::

  《演算付き変数代入式》

|《演算付き添字代入式》

|《演算付きメソッド代入式》

《演算付き代入文》 ::

  《演算付き変数代入文》

|《演算付き添字代入文》

|《演算付きメソッド代入文》

11.4.2.3.2  演算付き変数代入 

構文規則

《演算付き変数代入》 ::=

  《演算付き変数代入式》

|《演算付き変数代入文》

《演算付き変数代入式》 ::

  《変数》  [《行終端子》禁止]  《代入演算子》  《演算子式》

《演算付き変数代入文》 ::

  《変数》  [《行終端子》禁止]  《代入演算子》  《括弧なしメソッド呼出し》

意味規則

《演算付き変数代入》は,次の手順で評価する。

a)  《変数》を,変数参照として評価する(11.5.4 参照)。を評価結果の値とする。 
b)  《代入演算子》が  “&&=”  であり,かつ,が偽の場合,を《演算付き変数代入》の値とする。 
c)  《代入演算子》が  “||=”  であり,かつ,が真の場合,を《演算付き変数代入》の値とする。

d)  それ例外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。 
e)  OP を《代入演算子》の《代入演算子名》とする。 
f)  を,V OP W  という形式の《演算子式》とする。

g)  《演算付き変数代入式》又は《演算付き変数代入文》の《変数》を,とする。 
h)  その《変数》が で,《演算子式》が であるような《単一変数代入式》(11.4.2.2.2 参照)を評価する。 
i)

評価結果の値を《演算付き変数代入》の値とする。


62

X 3017

:2013 (ISO/IEC 30170:2012)

11.4.2.3.3  演算付き添字代入 

構文規則

《演算付き添字代入》 ::=

  《演算付き添字代入式》

|《演算付き添字代入文》

《演算付き添字代入式》 ::

  《一次式》  [《行終端子》禁止]  [《空白類》禁止]  “[”  《添字実引数リスト》

?

 “]”

    [《行終端子》禁止]  《代入演算子》  《演算子式》

《演算付き添字代入文》 ::

  《一次式》  [《行終端子》禁止][《空白類》禁止]  “[”  《添字実引数リスト》

?

 “]”

    [《行終端子》禁止]  《代入演算子》  《括弧なしメソッド呼出し》

意味規則

《演算付き添字代入》は,次の手順で評価する。

a)  《一次式》を評価する。を評価結果の値とする。 
b)  11.3.2 で規定するとおりに,《添字実引数リスト》から実引数リストを作成する。をこのリストとする。 
c)  “[]”  メソッドを,に対し,を実引数リストとして呼び出す。呼出し結果の値を とする。

d)  《代入演算子》が  “&&=”  であり,かつ,が偽の場合,を《演算付き添字代入》の値とする。 
e)  《代入演算子》が  “||=”  であり,かつ,が真の場合,を《演算付き添字代入》の値とする。 
f)  それ以外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。

g)  OP を《代入演算子》の《代入演算子名》とする。 
h)  V OP という形式の《演算子式》を評価する。を評価結果の値とする。 
i)

を の末尾に追加する。

j)  “[]=”  メソッドを,に対し,を実引数リストとして呼び出す。 
k)  《演算付き添字代入》の値は,とする。 
11.4.2.3.4  演算付きメソッド代入 

構文規則

《演算付きメソッド代入》 ::=

  《演算付きメソッド代入式》

|《演算付きメソッド代入文》

《演算付きメソッド代入式》 ::

  《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  《局所変数識別子》

    [《行終端子》禁止]  《代入演算子》  《演算子式》

|《一次式》  [《行終端子》禁止]  “.”  《定数識別子》

    [《行終端子》禁止]  《代入演算子》  《演算子式》

《演算付きメソッド代入文》 ::

  《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  《局所変数識別子》

    [《行終端子》禁止]  《代入演算子》  《括弧なしメソッド呼出し》

|《一次式》  [《行終端子》禁止]  “.”  《定数識別子》

    [《行終端子》禁止]  《代入演算子》  《括弧なしメソッド呼出し》


63

X 3017

:2013 (ISO/IEC 30170:2012)

意味規則

《演算付きメソッド代入》は,次の手順で評価する。

a)  《一次式》を評価する。を評価結果の値とする。 
b)  空の実引数リスト を作成する。名前が《局所変数識別子》又は《定数識別子》であるメソッドを,

対し,を実引数リストとして呼び出す。を呼出し結果の値とする。

c)  《代入演算子》が  “&&=”  であり,かつ,が偽の場合,を《演算付きメソッド代入》の値とする。 
d)  《代入演算子》が  “||=”  であり,かつ,が真の場合,を《演算付きメソッド代入》の値とする。 
e)  それ以外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。を評価結果の値とする。

f)  OP を《代入演算子》の《代入演算子名》とする。 
g)  V OP という形式の《演算子式》を評価する。を評価結果の値とする。 
h)  を《局所変数識別子》又は《定数識別子》とする。と  “=”  とを連結したものを とする。

i)

名前が であるメソッドを,に対し,ただ一つの値 を含む実引数リストとともに呼び出す。

j)  《演算付きメソッド代入》の値は,とする。


64

X 3017

:2013 (ISO/IEC 30170:2012)

11.4.2.4  多重代入 

構文規則

《多重代入文》 ::

  《多対一代入文》

|《一対一括代入文》

|《多対多代入文》

《多対一代入文》 ::

  《左辺》  [《行終端子》禁止]  “=”  《多重代入右辺》

《一対一括代入文》 ::

  《一括左辺》  [《行終端子》禁止]  “=”

      (  《括弧なしメソッド呼出し》|《演算子式》  )

《多対多代入文》 ::

  《多重代入左辺》  [《行終端子》禁止]  “=”  《多重代入右辺》

|(  《多重代入左辺》  −  《一括左辺》  )  [《行終端子》禁止]  “=”

    (  《括弧なしメソッド呼出し》|《演算子式》  )

《左辺》 ::

  《変数》

|《一次式》  [    《行終端子》禁止]  [《空白類》禁止]  “[”  《添字実引数リスト》

?

“]”

|《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  (  《局所変数識別子》|《定数識別子》  )

|“::”  《定数識別子》

《多重代入左辺》 ::

  (  《多重代入左辺項目》  [《行終端子》禁止]  “,”  )

+

  《多重代入左辺項目》

?

|(  《多重代入左辺項目》  [《行終端子》禁止]  “,”  )

+

  《一括左辺》

?

|《一括左辺》

|《グループ化された左辺》

《一括左辺》 ::

  “

*

”  《左辺》

?

《グループ化された左辺》 ::

  “(”  《多重代入左辺》  “)”

《多重代入左辺項目》 ::

  《左辺》

|《グループ化された左辺》

《多重代入右辺》 ::

  《演算子式リスト》  (  [《行終端子》禁止]  “,”  《散開右辺》  )

?

|《散開右辺》

《散開右辺》 ::

  《散開実引数》

意味規則

《多重代入文》は,次の手順で評価する。


65

X 3017

:2013 (ISO/IEC 30170:2012)

a)  《多対一代入文》は,次の手順で評価する。

1)  《多重代入右辺》を基に,値のリスト を次のとおり作成する。

i)

《演算子式リスト》が存在する場合,プログラムテキストに現れる順に,その《演算子式》を評価す

る。これらの評価結果の値を評価した順に含むリストを,L1 とする。

ii)  《演算子式リスト》が存在しない場合,空の値のリスト L1 を作成する。

iii)  《散開右辺》が存在する場合,11.3.2 で規定するとおりに,《散開実引数》から値のリストを作成し,

L2 をそのリストとする。

iv)  《散開右辺》が存在しない場合,空の値のリスト L2 を作成する。

v)  L1 と L2 とを連結したリストを処理結果とする。

2)  の長さが 0 又は 1 の場合,を処理系定義の値とする。 
3)  の長さが 1 より大きい場合,Array クラスの直接のインスタンスを作成し,の要素を,同じ順

序でそこに保存する。をこの Array クラスのインスタンスとする。

4)  その《変数》が《左辺》であって,かつ,その《演算子式》の値が であるような《単一変数代入式》

11.4.2.2.2 参照)を評価する。

5)  《多対一代入文》の値は,とする。

b)  《一対一括代入文》は,次の手順で評価する。

1)  《括弧なしメソッド呼出し》又は《演算子式》を評価する。を評価結果の値とする。

2)  が Array クラスのインスタンスの場合,新しく作った Array クラスの直接のインスタンスを A

とする。は だけを要素としてもつか,又は の全ての要素を 内と同順にもつとする。どちら

を選ぶかは処理系定義とする。

3)  が Array クラスのインスタンスではない場合,を唯一の要素とする Array クラスの直接のイ

ンスタンス を作る。

4)  《一括左辺》の《左辺》が存在する場合,その《変数》がこの《左辺》であって,かつ,その《演算子式》の

値が であるような《単一変数代入式》(11.4.2.2.2 参照)を評価する。そうではない場合,この手順

を飛ばす。

5)  《一対一括代入文》の値は,とする。

c)  《多対多代入文》は,次の手順で評価する。

1)  《多重代入右辺》が存在する場合,それを基に値のリストを作成し[a) 1)参照],をそのリストとす

る。

2)  《多重代入右辺》が存在しない場合,次の手順を行う。

i)

《括弧なしメソッド呼出し》又は《演算子式》を評価する。を評価結果の値とする。

ii)  が Array クラスのインスタンスでない場合の動作は未規定とする。

iii)  の全ての要素を同順に含む実引数リスト を作る。

3) i)   空の変数リスト を作成する。

ii)  プログラムテキストに現れる順に,それぞれの《多重代入左辺項目》の《左辺》又は《グループ化され

た左辺》を,の末尾に追加する。

iii)  《多重代入左辺》の《一括左辺》が存在する場合,それを の末尾に追加する。 
iv)  《多重代入左辺》が《グループ化された左辺》の場合,その《グループ化された左辺》を の末尾に追

加する。

4)  のそれぞれの要素 L

i

について,内と同順に,次の手順を行う。


66

X 3017

:2013 (ISO/IEC 30170:2012)

i)

を L

i

の 内における添字とする。N

R

を の要素数とする。

ii)  L

i

が《左辺》の場合,次の手順を行う。

I)  が N

R

よりも大きい場合,を nil とする。

II)  そうではない場合,を の 番目の要素とする。 
III)  L

i

 “=” という形式の《単一変数代入》を評価する。

iii)  L

i

が《一括左辺》であって,かつ,その《左辺》が存在する場合,次の手順を行う。

I)  が N

R

よりも大きい場合,

Array

クラスの空の直接のインスタンスを作成し,

それを とする。

II)  そうではない場合,の要素のうち,添字が 以上であるものを同じ順序で含む Array クラス

の直接のインスタンスを作成し,それを とする。

III)  その《変数》が《左辺》であって,かつ,その《演算子式》の値が であるような《単一変数代入式》

11.4.2.2.2 参照)を評価する。

iv)  L

i

が《グループ化された左辺》の場合,次の手順を行う。

I)  が N

R

よりも大きい場合,を nil とする。

II)  そうではない場合,を の 番目の要素とする。

III)  その《多重代入左辺》が《グループ化された左辺》の《多重代入左辺》であって,かつ,その《多重代

入右辺》が であるような《多対多代入文》を評価する。

11.4.2.5  rescue 修飾子付き代入 

構文規則

rescue修飾子付き代入》 ::

  《左辺》  [《行終端子》禁止]  “=”  《演算子式》

1

  [《行終端子》禁止]  “rescue”  《演算子式》

2

意味規則

rescue 修飾子付き代入》は,次の手順で評価する。

a)  《演算子式》

1

を評価する。を評価結果の値とする。

b)  この《演算子式》

1

の評価中に例外が発生し,処理されず,かつ,その例外が StandardError クラス

のインスタンスの場合,《演算子式》

2

を評価し,の値を,評価結果の値に置き換える。

c)  その《変数》が《左辺》で,《演算子式》の値が であるような《単一変数代入式》(11.4.2.2.2 参照)を評価

する。評価結果の値を《rescue 修飾子付き代入》の値とする。


67

X 3017

:2013 (ISO/IEC 30170:2012)

11.4.3  単項演算子式 
11.4.3.1  
概要 

構文規則

《単項演算子式》 ::=

  《単項マイナス式》

|《単項式》

《単項マイナス式》 ::

  《べき乗式》

|“-”  《べき乗式》

《単項式》 ::

  《一次式》

|“~”  《単項式》

1

|“+”  《単項式》

2

|“!”  《単項式》

3

意味規則

《単項演算子式》は,次の手順で評価する。

a)  《べき乗式》という形式の《単項マイナス式》は,11.4.4 e)で規定するとおりに評価する。 
b)  “-”  《べき乗式》という形式の《単項マイナス式》は,次の手順で評価する。

1)  《べき乗式》を評価する。を評価結果の値とする。

2)  空の実引数リスト を作成する。に対し,“-@”  メソッドを,を実引数リストとして呼び出す。

呼出し結果の値を《単項マイナス式》の値とする。

c)  “~”  《単項式》

1

という形式の《単項式》は,次の手順で評価する。

1)  《単項式》

1

を評価する。を評価結果の値とする。

2)  空の実引数リスト を作成する。に対し,“~”  メソッドを,を実引数リストとして呼び出す。

呼出し結果の値を《単項式》の値とする。

d)  “+”  《単項式》

2

という形式の《単項式》は,次の手順で評価する。

1)  《単項式》

2

を評価する。を評価結果の値とする。

2)  空の実引数リスト を作成する。に対し  “+@”  メソッドを,を実引数リストとして呼び出す。

呼出し結果の値を《単項式》の値とする。

e)  “!”  《単項式》

3

という形式の《単項式》は,11.2 で規定するとおりに評価する。

11.4.3.2  defined? 

構文規則

defined?式》 ::=

  《括弧付きdefined?式》

|《括弧なしdefined?式》

《括弧付きdefined?式》 ::

  “defined?” “(”  《式》  “)”

《括弧なしdefined?式》 ::

  “defined?”  《演算子式》


68

X 3017

:2013 (ISO/IEC 30170:2012)

意味規則

defined?式》は,次の手順で評価する。

a)  を《括弧付き defined?式》の《式》,又は《括弧なし defined?式》の《演算子式》とする。 
b)  が《定数識別子》の場合,次の手順を行う。

1)  11.5.4.2 で示されている《定数識別子》の評価と同じ評価を行って,名前が である定数束縛を探す。

ただし,束縛が見つからなかった場合に NameError クラスの直接のインスタンスを発生させない。

2)  束縛が見つかった場合,《defined?式》の値は,処理系定義の真とする。 
3)  そうではない場合,《defined?式》の値は nil とする。

c)  が《大域変数識別子》の場合,次の手順を行う。

1)  名前が である束縛が⟦大域変数束縛集合⟧内に存在する場合,《defined?式》の値は処理系定義の真と

する。

2)  そうではない場合,《defined?式》の値は nil とする。

d)  が《クラス変数識別子》の場合,次の手順を行う。

1)  を現在のクラス又はモジュールとする。とその全てのスーパークラスとを含む集合を,CS とす

る。CS のそれぞれの要素のインクルードモジュールリストについて,そこに含まれるモジュールを

全て合わせた集合を,MS とする。CS 及び MS の和集合を,CM とする。

2)  CM 内のクラス又はモジュールに,そのクラス束縛の集合内に名前が である束縛をもつものが存

在する場合,《defined?式》の値は処理系定義の真とする。

3)  そうではない場合,《defined?式》の値は nil とする。

e)  が《インスタンス変数識別子》の場合,次の手順を行う。

1)  名前が である束縛が,現在の self のインスタンス変数束縛の集合内に存在する場合,《defined?式》

の値は処理系定義の真とする。

2)  そうではない場合,《defined?式》の値は nil とする。

f)  が《局所変数識別子》の場合,次の手順を行う。

1)  《局所変数識別子》が局所変数への参照(11.5.4.7.2 参照)の場合,《defined?式》の値は処理系定義の

真とする。

2)  そうではない場合,現在のクラス又はモジュールを起点として,名前が であるメソッド束縛を

13.3.4 で規定するとおりにして探す。

i)

束縛が見つかり,その値が undef  でない場合,《defined?式》の値は処理系定義の真とする。

ii)  そうではない場合,《defined?式》の値は nil とする。

g)  それ以外の場合,《defined?式》の値は処理系定義とする。 
11.4.4 2 項演算子式 

構文規則

2項演算子式》 ::=

  《等価式》

《等価式》 ::

  《関係式》

|《関係式》  [《行終端子》禁止]  “<=>”  《関係式》

|《関係式》  [《行終端子》禁止]  “==”  《関係式》


69

X 3017

:2013 (ISO/IEC 30170:2012)

|《関係式》  [《行終端子》禁止]  “===”  《関係式》

|《関係式》  [《行終端子》禁止]  “!=”  《関係式》

|《関係式》  [《行終端子》禁止]  “=~”  《関係式》

|《関係式》  [《行終端子》禁止]  “!~”  《関係式》

《関係式》 ::

  《ビット単位OR式》

|《関係式》  [《行終端子》禁止]  “>”  《ビット単位OR式》

|《関係式》  [《行終端子》禁止]  “>=”  《ビット単位OR式》

|《関係式》  [《行終端子》禁止]  “<”  《ビット単位OR式》

|《関係式》  [《行終端子》禁止]  “<=”  《ビット単位OR式》

《ビット単位OR式》 ::

  《ビット単位AND式》

|《ビット単位OR式》  [《行終端子》禁止]  “|”  《ビット単位AND式》

|《ビット単位OR式》  [《行終端子》禁止]  “^”  《ビット単位AND式》

《ビット単位AND式》 ::

  《ビット単位シフト式》

|《ビット単位AND式》  [《行終端子》禁止]  “&”  《ビット単位シフト式》

《ビット単位シフト式》 ::

  《加減式》

|《ビット単位シフト式》  [《行終端子》禁止]  “<<”  《加減式》

|《ビット単位シフト式》  [《行終端子》禁止]  “>>”  《加減式》

《加減式》 ::

  《乗除式》

|《加減式》  [《行終端子》禁止]  “+”  《乗除式》

|《加減式》  [《行終端子》禁止]  “-”  《乗除式》

《乗除式》 ::

  《単項マイナス式》

|《乗除式》  [《行終端子》禁止]  “*”  《単項マイナス式》

|《乗除式》  [《行終端子》禁止]  “/”  《単項マイナス式》

|《乗除式》  [《行終端子》禁止]  “%”  《単項マイナス式》

《べき乗式》 ::

  《単項式》

|《単項式》  [《行終端子》禁止]  “**”  《べき乗式》

2項演算子》 ::=

  “<=>”|“==”|“!=”|“===”|“=~”|“!~”|“>”|“>=”|“<”|“<=”

|“|”|“^”|“&”|“<<”|“>>”|“+”|“-”|“*”|“/”|“%”|“**”

次のいずれかの演算子の直前に《空白類》がある場合,その演算子の直後にも一つ以上の《空白類》がなけ

ればならない。

−  《ビット単位 AND 式》の  “&”


70

X 3017

:2013 (ISO/IEC 30170:2012)

−  《ビット単位シフト式》の  “<<”

−  《加減式》の  “+”

−  《加減式》の  “-”

−  《乗除式》の  “*”

−  《乗除式》の  “/”

−  《乗除式》の  “%”

注記  例えば,“x␣-y”  は《加減式》ではない。ただし,“x”  が局所変数への参照である場合,“x␣-y”

を  “x␣-␣y”  という《加減式》と同じように評価してもよい。しかし,“x”  が局所変数への参

照ではない場合は,“x␣-y”  を  “x()␣-␣y”  ではなく  “x(-y)”  と同じ動作を行う《コマン

ド》(11.3.1 参照)として評価しなければならない。ここで,“␣”は空白を表す。

意味規則

《等価式》は,次の手順で評価する。

a)  《等価式》が x “!=” という形式の場合,次の手順を行う。

1)  を評価し,を評価結果の値とする。

2)  を評価し,を評価結果の値とする。 
3)  “==”  メソッドを,に対し,を実引数として呼び出す。呼出し結果の値が真の場合,《等価式》の

値は false とする。それ以外の場合,《等価式》の値は true とする。

b)  手順 a)の代わりに,手順 f) 1)f) 3)を行ってもよい。この場合,次の条件が満たされなければならな

い。

−    “!=”  演算子が《演算子メソッド名》に含まれている。

−  Object クラス,Object クラスのいずれかのスーパークラス,又は Object クラスがインクルー

ドしているいずれかのモジュールに,インスタンスメソッド  “!=”  が定義されている。“!=”  メソ

ッドは実引数を一つとり,手順 a) 3)の《等価式》の値を返さなければならない。ここで,及び 

それぞれレシーバ及び唯一の実引数であるとする。

c)  《等価式》が x “!~” y という形式の場合,次の手順を行う。

1)  を評価し,を評価結果の値とする。

2)  を評価し,を評価結果の値とする。 
3)  “=~”  メソッドを,に対し,を実引数として呼び出す。呼出し結果の値が真の場合,《等価式》の

値は false とする。それ以外の場合,《等価式》の値は true とする。

d)  手順 c)の代わりに,手順 f)  1)f)  3)を行ってもよい。この場合,次の条件が満たされなければならな

い。

−  “!~”  演算子が《演算子メソッド名》に含まれている。

−  Object クラス,Object クラスのいずれかのスーパークラス,又は Object クラスがインクルー

ドしているいずれかのモジュールに,インスタンスメソッド  “!~”  が定義されている。“!~”  メソ

ッドは実引数を一つとり,手順 c) 3)の《等価式》の値を返さなければならない。ここで,及び 

それぞれレシーバ及び唯一の実引数であるとする。

e)  《等価式》が《単項マイナス式》であり,《べき乗式》でない場合,11.4.3 で規定するとおりに評価する。《等

価式》が《単項マイナス式》であり,《べき乗式》である場合,次の手順で《べき乗式》を評価し,その値を

《等価式》の値とする。

1)  その《べき乗式》が《単項式》である場合,それを 11.4.3.1 で規定するとおりに評価し,評価結果の値


71

X 3017

:2013 (ISO/IEC 30170:2012)

を《べき乗式》の値とする。

2)  その《べき乗式》が《単項式》  “**”  《べき乗式》という形式である場合,次の手順を行う。

i)

《単項式》が  “-”  《符号なし数》という形式の《符号付き数》である場合,次の手順を行う。

I)  《符号なし数》を評価し,評価結果の値を とする。 
II)  《べき乗式》を評価し,評価結果の値を とする。

III)  名前が  “**”  であるメソッドを,に対し,を実引数として呼び出す。を呼出し結果の値

とする。

IV)  名前が  “-@”  であるメソッドを,に対し,実引数なしで呼び出す。呼出し結果の値を《べき乗

式》の値とする。

ii)  そうではない場合,次の手順を行う。

I)  《単項式》を評価し,評価結果の値を とする。

II)  《べき乗式》を評価し,評価結果の値を とする。 
III)  名前が  “**”  であるメソッドを,に対し,を実引数として呼び出す。呼出し結果の値を《べ

き乗式》の値とする。

f)  それ以外の場合,x  《2 項演算子》  という形式の《等価式》に対し,次の手順を行う。

1)  を評価し,を評価結果の値とする。 
2)  を評価し,を評価結果の値とする。

3)  名前が《2 項演算子》であるメソッドを,に対し,を実引数として呼び出す。《等価式》の値は,呼

出し結果の値とする。


72

X 3017

:2013 (ISO/IEC 30170:2012)

11.5  一次式 
11.5.1  
概要 

構文規則

《一次式》 ::

  《クラス定義》

|《特異クラス定義》

|《モジュール定義》

|《メソッド定義》

|《特異メソッド定義》

|《省略可能実引数付きyield》

|《if式》

|《unless式》

|《case式》

|《while式》

|《until式》

|《for式》

|《実引数なしreturn》

|《実引数なしbreak》

|《実引数なしnext》

|《redo式》

|《retry式》

|《begin式》

|《グループ化式》

|《変数参照》

|《スコープ付き定数参照》

|《配列生成子》

|《ハッシュ生成子》

|《リテラル》

|《括弧付きdefined?式》

|《一次式メソッド呼出し》

意味規則

《クラス定義》については,13.2.2 を参照。

《特異クラス定義》については,13.4.2 を参照。

《モジュール定義》については,13.1.2 を参照。

《メソッド定義》については,13.3.1 を参照。

《特異メソッド定義》については,13.4.3 を参照。

《省略可能実引数付き yield》については,11.3.5 を参照。

《リテラル》については,8.7.6 を参照。

《括弧付き defined?式》については,11.4.3.2 を参照。


73

X 3017

:2013 (ISO/IEC 30170:2012)

《一次式メソッド呼出し》については,11.3 を参照。

11.5.2  制御構造 
11.5.2.1  
概要 

構文規則

《制御構造》 ::=

  《条件式》

|《繰返し式》

|《ジャンプ式》

|《begin式》

11.5.2.2  条件式 
11.5.2.2.1  
概要 

構文規則

《条件式》 ::=

  《if式》

|《unless式》

|《case式》

|《条件演算子式》

11.5.2.2.2  if  

構文規則

if式》 ::

  “if”  《式》  《then節》  《elsif節》

*

  《else節》

?

 “end”

then節》 ::

  《分離子》  《複合文》

|《分離子》

?

 “then”  《複合文》

else節》 ::

  “else”  《複合文》

elsif節》 ::

  “elsif”  《式》  《then節》

意味規則

if 式》は,次の手順で評価する。

a)  《式》を評価する。を評価結果の値とする。 
b)  が真の場合,《then 節》の《複合文》を評価する。評価結果の値を《if 式》の値とする。この場合,残り

の《elsif 節》及び《else 節》は,

(もしあっても)評価しない。

c)  が偽で,かつ,《elsif 節》も《else 節》も存在しない場合,《if 式》の値は nil とする。 
d)  が偽で,かつ,《elsif 節》が存在せず,《else 節》が存在する場合,《else 節》の《複合文》を評価する。評

価結果の値を《if 式》の値とする。

e)  が偽で,かつ,一つ以上の《elsif 節》が存在する場合,それらを次の手順で評価する。

1)  それぞれの《elsif 節》について,その《式》の値が真であるようなものが見つかるまで,それらがプロ

グラムテキストに現れる順に,その《式》を評価する。見つかった《elsif 節》を とする。


74

X 3017

:2013 (ISO/IEC 30170:2012)

2)  が存在する場合,その《then 節》の《複合文》を評価する。評価結果の値を《if 式》の値とする。残り

の《elsif 節》及び《else 節》は,

(もしあっても)評価しない。

3)  が存在せず,《else 節》が存在する場合,《else 節》の《複合文》を評価する。評価結果の値を《if 式》の

値とする。

4)  が存在せず,《else 節》も存在しない場合,《if 式》の値は nil とする。

11.5.2.2.3  unless  

構文規則

unless式》 ::

  “unless”  《式》  《then節》  《else節》

?

 “end”

意味規則

unless 式》は,次の手順で評価する。

a)  《式》を評価する。を評価結果の値とする。 
b)  が偽の場合,《then 節》の《複合文》を評価する。評価結果の値を《unless 式》の値とする。この場合,

残りの《else 節》は,

(もしあっても)評価しない。

c)  が真で,《else 節》が存在しない場合,《unless 式》の値は nil とする。 
d)  が真で,《else 節》が存在する場合,《else 節》の《複合文》を評価する。評価結果の値を《unless 式》の値

とする。

11.5.2.2.4  case  

構文規則

case式》 ::

  《式付きcase式》

|《式なしcase式》

《式付きcase式》 ::

  “case”  《式》  《分離子リスト》

?

  《when節》

+

  《else節》

?

 “end”

《式なしcase式》 ::

  “case”  《分離子リスト》

?

  《when節》

+

  《else節》

?

 “end”

when節》 ::

  “when”  《when実引数》  《then節》

when実引数》 ::

  《演算子式リスト》  (  [《行終端子》禁止]  “,”  《散開実引数》  )

?

|《散開実引数》

意味規則

case 式》は,次の手順で評価する。

a)  《case 式》が《式付き case 式》の場合,《式》を評価する。を評価結果の値とする。 
b)  手順 c)で使われる“値 はマッチする”という表現は次のとおり定義する。

1)  《case 式》が《式付き case 式》の場合,に対し,“===”  メソッドを,だけを含む実引数リストとと

もに呼び出す。呼出し結果の値が真である場合に限り,はマッチするとする。

2)  《case 式》が《式なし case 式》の場合,が真である場合に限り,はマッチするとする。

c)  次の手順を行う。


75

X 3017

:2013 (ISO/IEC 30170:2012)

1)  それぞれの《when 節》を,それらがプログラムテキストに現れる順に,マッチするかどうか次のとお

り調べる。

i)

when 実引数》の《演算子式リスト》が存在する場合,次の手順を行う。

I)  そのそれぞれの《演算子式》を評価し,評価結果の値がマッチするかどうか判断する。 
II)  マッチする値が見つかった場合,残りの《演算子式》は(もしあっても)評価しない。

ii)  マッチする値が見つからず,《散開実引数》(11.3.2 参照)が存在する場合,次の手順を行う。

I)  11.3.2 で規定するとおりに,《散開実引数》から値のリストを作成する。そのリストのそれぞれ

の要素について,添字順に,マッチする値かどうかを判断する。

II)  マッチする値が見つかった場合,リスト内の残りの値は,(もしあっても)評価しない。

iii)  《when 節》は,その《when 実引数》の中にマッチする値が見つかった場合に限り,マッチするとみ

なす。この場合,残りの《when 節》は,

(もしあっても)判断を行わない。

2)  マッチする《when 節》が見つかった場合,その《when 節》の《then 節》の《複合文》を評価する。評価結

果の値を《case 式》の値とする。

3)  マッチする《when 節》が見つからず,《else 節》が存在する場合,《else 節》の《複合文》を評価する。評

価結果の値を《case 式》の値とする。

4)  それ以外の場合,《case 式》の値は nil とする。

11.5.2.2.5  条件演算子式 

構文規則

《条件演算子式》 ::

  《範囲式》

|《範囲式》  [《行終端子》禁止]  “?”  《演算子式》

1

  [《行終端子》禁止]  “:”  《演算子式》

2

意味規則

《範囲式》  “?”  《演算子式》

1

 “:”  《演算子式》

2

という形式の《条件演算子式》は,次の手順で評価する。

a)  《範囲式》を評価する。 
b)  評価結果の値が真の場合,《演算子式》

1

を評価し,その結果の値を《条件演算子式》の値とする。

c)  そうではない場合,《演算子式》

2

を評価し,評価結果の値を《条件演算子式》の値とする。

11.5.2.3  繰返し式 
11.5.2.3.1  
概要 

構文規則

《繰返し式》 ::=

  《while式》

|《until式》

|《for式》

|《while修飾文》

|《until修飾文》

それぞれの《繰返し式》は条件式及び本体をもつ。

《繰返し式》の条件式は,《繰返し式》の繰返しの条件を決めるために評価される部分である。《while 式》

11.5.2.3.2 参照)

,《until 式》(11.5.2.3.3 参照)

,《for 式》(11.5.2.3.4 参照)

,《while 修飾文》(12.5 参照)又

は《until 修飾文》(12.6 参照)の条件式は,その《式》とする。


76

X 3017

:2013 (ISO/IEC 30170:2012)

《繰返し式》の本体は,《繰返し式》で繰り返し評価される部分である。《while 式》,《until 式》又は《for 式》

の本体は,その《do 節》の《複合文》とする。《while 修飾文》又は《until 修飾文》の本体は,その《文》とする。

while 修飾文》については,12.5 を参照。

until 修飾文》については,12.6 を参照。

11.5.2.3.2  while  

構文規則

while式》 ::

  “while”  《式》  《do節》  “end”

do節》 ::

  《分離子》  《複合文》

|[《行終端子》禁止]  “do”  《複合文》

意味規則

while 式》は,次の手順で評価する。

a)  《式》を評価し,次の手順を行う。

1)  この《式》の評価が《break 式》(11.5.2.4.3 参照)によって終了された場合,《while 式》の評価を終了す

る。

break 式》の《ジャンプ実引数》が存在する場合,《while 式》の値は《ジャンプ実引数》の値とする。

そうではない場合,《while 式》の値は nil とする。

2)  この《式》の評価が《next 式》(11.5.2.4.4 参照)又は《redo 式》(11.5.2.4.5 参照)によって終了された場

合,手順 a)の最初から繰り返す。

3)  それ以外の場合,この《式》の評価結果の値を とする。

b)  が偽の場合,《while 式》の評価は,評価結果を nil として終了する。 
c)  が真の場合,《do 節》の《複合文》を評価し,次の手順を行う。

1)  この《複合文》の評価が《break 式》によって終了された場合,《while 式》の評価を終了する。

break 式》の《ジャンプ実引数》が存在する場合,《while 式》の値は《ジャンプ実引数》の値とする。

そうではない場合,《while 式》の値は nil とする。

2)  この《複合文》の評価が《next 式》によって終了された場合,手順 a)から繰り返す。 
3)  この《複合文》の評価が《redo 式》によって終了された場合,手順 c)から繰り返す。

4)  それ以外の場合,手順 a)から繰り返す。

11.5.2.3.3  until  

構文規則

until式》 ::

  “until”  《式》  《do節》  “end”

意味規則

until 式》は,次の手順で評価する。

a)  《式》を評価し,次の手順を行う。

1)  この《式》の評価が《break 式》(11.5.2.4.3 参照)によって終了された場合,《until 式》の評価を終了す

る。

break 式》の《ジャンプ実引数》が存在する場合,《until 式》の値は《ジャンプ実引数》の値とする。


77

X 3017

:2013 (ISO/IEC 30170:2012)

そうではない場合,《until 式》の値は nil とする。

2)  この《式》の評価が《next 式》(11.5.2.4.4 参照)又は《redo 式》(11.5.2.4.5 参照)によって終了された場

合,手順 a)の最初から繰り返す。

3)  それ以外の場合,この《式》の評価結果の値を とする。

b)  が真の場合,《until 式》の評価は,評価結果を nil として終了する。

c)  が偽の場合,《do 節》の《複合文》を評価し,次の手順を行う。

1)  この《複合文》の評価が《break 式》によって終了された場合,《until 式》の評価を終了する。

break 式》の《ジャンプ実引数》が存在する場合,《until 式》の値は《ジャンプ実引数》の値とする。

そうではない場合,《until 式》の値は nil とする。

2)  この《複合文》の評価が《next 式》によって終了された場合,手順 a)から繰り返す。 
3)  この《複合文》の評価が《redo 式》によって終了された場合,手順 c)から繰り返す。

4)  それ以外の場合,手順 a)から繰り返す。

11.5.2.3.4  for  

構文規則

for式》 ::

  “for”  《for変数》  [《行終端子》禁止]  “in”  《式》  《do節》  “end”

for変数》 ::

  《左辺》

|《多重代入左辺》

意味規則

for 式》は,次の手順で評価する。

a)  《式》を評価する。この《式》の評価が《break 式》,《next 式》又は《redo 式》によって終了された場合の動作

は未規定とする。そうではない場合,を評価結果の値とする。

b)  《一次式》  [《行終端子》禁止]  “.” “each” “do” “|”  《ブロック仮引数リスト》  “|”  《ブロック本体》

“end”  という形式の《一次式メソッド呼出し》を,とする。ここで,《一次式》の値は O,《ブロック

仮引数リスト》は《for 変数》,《ブロック本体》は《do 節》の《複合文》とする。

を評価する。ただし,評価中にこの《for 式》の《do 節》の《複合文》を《ブロック本体》とする《ブロッ

ク》呼出しが行われた場合,その呼出しの評価は,11.3.3 の手順 a)から手順 g)までのうち,手順 c)及び

手順 e) 4)を除いたものを実行する。

c)  評価結果の値を《for 式》の値とする。 
11.5.2.4  ジャンプ式 
11.5.2.4.1  
概要 

構文規則

《ジャンプ式》 ::=

  《return式》

|《break式》

|《next式》

|《redo式》

|《retry式》


78

X 3017

:2013 (ISO/IEC 30170:2012)

意味規則

《ジャンプ式》は,《メソッド本体》,《ブロック本体》,《繰返し式》の条件式若しくは本体,又は《rescue 節》

の《then 節》の《複合文》の評価を終了させるために使用される。《ジャンプ式》によって終了されたそのプロ

グラム構成要素自身,及びそのプログラム構成要素に含まれ,かつ,《ジャンプ式》の評価開始時に評価中

であったプログラム構成要素は,評価手順の途中でその評価を終了し,評価結果の値をもたない。

この規格では,現在の《ブロック》又は現在の《繰返し式》という表現は次のものを指す。

a)  現在のメソッド呼出しが存在しない場合は,現在評価中の《ブロック》又は《繰返し式》のうち,最近に

評価を開始した《ブロック》又は《繰返し式》。

b)  現在のメソッド呼出しが存在する場合は,現在のメソッド呼出しの評価中に評価が開始され,現在も

評価中の《ブロック》又は《繰返し式》のうち,最近に評価を開始した《ブロック》又は《繰返し式》。

いずれの場合も,そのようなものが存在しない場合は,現在の《ブロック》又は現在の《繰返し式》は存在

しない。

11.5.2.4.2  return  

構文規則

return式》 ::=

  《実引数なしreturn》

|《実引数付きreturn》

《実引数なしreturn》 ::

  “return”

《実引数付きreturn》 ::

  “return”  《ジャンプ実引数》

《ジャンプ実引数》 ::

  [《行終端子》禁止]  《実引数リスト》

《ジャンプ実引数》の《実引数リスト》(11.3.2 参照)には,《ブロック実引数》が存在してはならない。

意味規則

return 式》及び《ジャンプ実引数》は,次の手順で評価する。

a)  《return 式》は,次の手順で評価する。

1)  現在のメソッド呼出しに対応する《メソッド本体》を とする。現在評価中の《ブロック》であって,

かつ,Kernel モジュールの lambda メソッド(15.3.1.2.6 参照)によって作られたものを とする。

そのような《ブロック》が複数存在する場合は,

それらのうち最近に評価を開始したものを とする。

2)  も も存在しない場合,又は,だけが存在するが現在のメソッド呼出しが終了している場合は,

次の手順を行う。

i)

名前が  “return”  である Symbol クラスの直接のインスタンスを,とする。

ii)  《return 式》の《ジャンプ実引数》が存在する場合,を《ジャンプ実引数》の値とする。そうではない

場合,を nil とする。

iii)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”  で

あって値が であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のインスタ

ンスを例外として発生させる。

3)  《ジャンプ実引数》が存在する場合,それを手順 b)で規定されているとおりに評価する。


79

X 3017

:2013 (ISO/IEC 30170:2012)

4)  の評価が の評価より後に開始されていた場合,次の手順を行う。

i)

この《return 式》を含み,かつ,に含まれているような《ブロック本体》が一つ以上存在する場合,

それらの《ブロック本体》について,内側から外側へと順に,その評価を終了させる(11.3.3 参照)

ii)  の評価を終了する(13.3.3 参照)。

5)  そうではない場合,次の手順を行う。

i)

が現在の《ブロック》である場合,の評価を終了させる[15.3.1.2.6 b)参照]。

ii)  そうではない場合,動作は未規定とする。

b)  《ジャンプ実引数》は,次の手順で評価する。

1)  《ジャンプ実引数》が《散開実引数》の場合,次の手順を行う。

i)

11.3.2 で規定するとおりに《散開実引数》から値のリストを構築し,そのリストを とする。

ii)  の長さが 0 又は 1 の場合,《ジャンプ実引数》の値は処理系定義とする。 
iii)  の長さが 1 より大きい場合,Array クラスの直接のインスタンスを作成し,それに の要素を

同じ順序で保存する。《ジャンプ実引数》の値はこの Array クラスのインスタンスとする。

2)  そうではない場合,次の手順を行う。

i)

11.3.2 で規定するとおりに《実引数リスト》から値のリストを構築し,そのリストを とする。

ii)  の長さが 1 の場合,《ジャンプ実引数》の値は の唯一の要素とする。 
iii)  の長さが 1 より大きい場合,Array クラスの直接のインスタンスを作成し,それに の要素を

同じ順序で保存する。《ジャンプ実引数》の値はこの Array クラスのインスタンスとする。

11.5.2.4.3  break  

構文規則

break式》 ::=

  《実引数なしbreak》

|《実引数付きbreak》

《実引数なしbreak》 ::

  “break”

《実引数付きbreak》 ::

  “break”  《ジャンプ実引数》

意味規則

break 式》は,次の手順で評価する。

a)  《ジャンプ実引数》が存在する場合,それを 11.5.2.4.2 b)で規定するとおりに評価する。 
b)  現在の《ブロック》が存在する場合,現在の《ブロック》の《ブロック本体》の評価を終了させる(11.3.3

参照)

c)  現在の《繰返し式》が存在する場合,《break 式》が現在の《繰返し式》の条件式内にあるときはその条件式

の評価を,本体内にあるときはその本体の評価を終了させる(11.5.2.3 参照)

d)  現在の《ブロック》又は現在の《繰返し式》が存在しない場合,次の手順を行う。

1)  名前が  “break”  である Symbol クラスの直接のインスタンスを,とする。 
2)  《break 式》の《ジャンプ実引数》が存在する場合,をその《ジャンプ実引数》の値とする。そうではな

い場合,を nil とする。

3)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”  で


80

X 3017

:2013 (ISO/IEC 30170:2012)

あって値が であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のインスタン

スを例外として発生させる。

11.5.2.4.4  next  

構文規則

next式》 ::=

  《実引数なしnext》

|《実引数付きnext》

《実引数なしnext》 ::

  “next”

《実引数付きnext》 ::

  “next”  《ジャンプ実引数》

意味規則

next 式》は,次の手順で評価する。

a)  《ジャンプ実引数》が存在する場合,それを 11.5.2.4.2 b)で規定するとおりに評価する。 
b)  現在の《ブロック》が存在する場合,現在の《ブロック》の《ブロック本体》の評価を終了させる(11.3.3

参照)

c)  現在の《繰返し式》が存在する場合,《next 式》が現在の《繰返し式》の条件式内にあるときはその条件式

の評価を,本体内にあるときはその本体の評価を終了させる(11.5.2.3 参照)

d)  現在の《ブロック》又は現在の《繰返し式》が存在しない場合,次の手順を行う。

1)  名前が  “next”  である Symbol クラスの直接のインスタンスを,とする。 
2)  《next 式》の《ジャンプ実引数》が存在する場合,をその《ジャンプ実引数》の値とする。そうではな

い場合,を nil とする。

3)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”  で

あって値が であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のインスタン

スを例外として発生させる。

11.5.2.4.5  redo  

構文規則

redo式》 ::

  “redo”

意味規則

redo 式》は,次の手順で評価する。

a)  現在の《ブロック》が存在する場合,現在の《ブロック》の《ブロック本体》の評価を終了させる(11.3.3

参照)

b)  現在の《繰返し式》が存在する場合,《redo 式》が現在の《繰返し式》の条件式内にあるときはその条件式

の評価を,本体内にあるときはその本体の評価を終了させる(11.5.2.3 参照)

c)  現在の《ブロック》又は現在の《繰返し式》が存在しない場合,次の手順を行う。

1)  名前が  “redo”  である Symbol クラスの直接のインスタンスを,とする。 
2)  名前が  “@reason”  であって値が であるインスタンス変数束縛と,名前が  “@exit_value”  で

あって値が nil であるインスタンス変数束縛とをもつ LocalJumpError クラスの直接のインスタン


81

X 3017

:2013 (ISO/IEC 30170:2012)

スを例外として発生させる。

11.5.2.4.6  retry  

構文規則

retry式》 ::

  “retry”

意味規則

retry 式》は,次の手順で評価する。

a)  現在のメソッド呼出し(13.3.3 参照)が存在した場合,をそのメソッド呼出しに対応する《メソッド

本体》とする。そうではない場合,を現在評価中の《プログラム》(10.1 参照)とする。

b)  内の,この《retry 式》を内包する最も内側の《rescue 節》を とする。そのような《rescue 節》が存在し

ない場合,動作は未規定とする。

c)  の《then 節》の《複合文》の評価を終了する(11.5.2.5 参照)。 
11.5.2.5  begin  

構文規則

begin式》 ::

  “begin”  《本体文》  “end”

《本体文》 ::

  《複合文》  《rescue節》

*

  《else節》

?

  《ensure節》

?

rescue節》 ::

  “rescue”  [《行終端子》禁止]  《例外クラスリスト》

?

  《例外変数代入》

?

  《then節》

《例外クラスリスト》 ::

  《演算子式》

|《多重代入右辺》

《例外変数代入》 ::

  “=>”  《左辺》

ensure節》 ::

  “ensure”  《複合文》

意味規則

begin 式》の値はその《本体文》の評価結果の値とする。

《本体文》は,次の手順で評価する。

a)  《本体文》の《複合文》を評価する。 
b)  手順 a)で例外が発生しなかった場合,又は発生した全ての例外が処理された場合は,次の手順を行う。

1)  《else 節》が存在する場合,《else 節》を 11.5.2.2.2 で規定するとおりに評価する。

2)  《ensure 節》が存在する場合,その《複合文》を評価する。評価結果の値を,《ensure 節》の値とする。 
3)  《else 節》及び《ensure 節》の両方が存在する場合,《本体文》の値は《ensure 節》の値とする。《else 節》

又は《ensure 節》のいずれかだけが存在する場合,《本体文》の値は存在する方の値とする。

4)  《else 節》及び《ensure 節》のどちらも存在しない場合,《本体文》の値はその《複合文》の値とする。

c)  手順 a)で例外が発生し処理されなかった場合は,それぞれの《rescue 節》について,それらがプログラ

ムテキストに現れる順に,次のとおり発生した例外を処理できるかどうか判断する。


82

X 3017

:2013 (ISO/IEC 30170:2012)

1)  発生した例外を とする。 
2)  《rescue 節》の《例外クラスリスト》が存在せず,かつ,が StandardError クラスの直接のインス

タンスの場合,この《rescue 節》は を処理できる。

3)  《rescue 節》の《例外クラスリスト》が存在する場合,次の手順を行う。

i)

《例外クラスリスト》が《演算子式》の場合,その《演算子式》を評価する。空の値リストを作成し,

評価結果の値をそのリストに追加する。

ii)  《例外クラスリスト》が《多重代入右辺》の場合,その《多重代入右辺》から値リストを作成する

11.4.2.4 参照)

iii)  上記のとおりに《例外クラスリスト》を評価することで作成されたリストを とする。のそれぞ

れの要素 について,次の手順を行う。

I)  が Exception クラスでも Exception クラスのサブクラスでもない場合,TypeError クラ

スの直接のインスタンスを例外として発生させる。

II)  が のインスタンスの場合,この《rescue 節》は を処理できる。この場合,この《本体文》の

残りの《rescue 節》は判断を行わない。

d)  を処理できる《rescue 節》が見つかった場合,次の手順を行う。

1)  の《例外変数代入》が存在する場合,《左辺》  “=”  《多重代入右辺》という形式であり,《多重代入右

辺》の値が であるような《多重代入文》と同様にその《例外変数代入》を評価する。

2)  の《then 節》の《複合文》を評価する。この評価が《retry 式》によって終了された場合,手順 a)から処

理を続ける。そうではない場合,を評価結果の値とする。

3)  《ensure 節》が存在する場合,それを評価する。《本体文》の値は,《ensure 節》の値とする。 
4)  《ensure 節》が存在しない場合,《本体文》の値は とする。

e)  《rescue 節》が存在しないか,を処理できる《rescue 節》が存在しなかった場合,次の手順を行う。

1)  《ensure 節》が存在する場合,それを評価する。

2)  《本体文》の値は未規定とする。

《本体文》の《ensure 節》が存在する場合,《ensure 節》は,《本体文》の評価が《ジャンプ式》によって終了さ

れた場合も含め,必ず評価される。

11.5.3  グループ化式 

構文規則

《グループ化式》 ::

  “(”  《式》  “)”

|“(”  《複合文》  “)”

意味規則

《グループ化式》は,次の手順で評価する。

a)  《式》又は《複合文》を評価する。

b)  評価結果の値を《グループ化式》の値とする。


83

X 3017

:2013 (ISO/IEC 30170:2012)

11.5.4  変数参照 
11.5.4.1  
概要 

構文規則

《変数参照》 ::

  《変数》

|《擬似変数》

《変数》 ::

  《定数識別子》

|《大域変数識別子》

|《クラス変数識別子》

|《インスタンス変数識別子》

|《局所変数識別子》

《スコープ付き定数参照》 ::

  《一次式》  [《行終端子》禁止][《空白類》禁止]  “::”  《定数識別子》

|“::”  《定数識別子》

《変数》及び《スコープ付き定数参照》については,11.5.4.2 から 11.5.4.7 までを参照。

《擬似変数》については,11.5.4.8 を参照。

11.5.4.2  定数 

《定数識別子》は,次の手順で評価する。

a)  評価する《定数識別子》を,とする。 
b)  名前が である定数束縛を,次のとおり探す。

次の手順において,束縛が見つかった場合,すぐに《定数識別子》の評価を終了し,見つかった束縛

の値を《定数識別子》の値とする。

c)  を⟦クラスモジュールリスト⟧の一番上の要素とする。のそれぞれの要素に対し,最初(すなわち,

現在のクラス又はモジュール)から最後まで順に,名前が である定数束縛を探す。ただし,の最

後の要素である Object クラスは除く。

d)  束縛が見つからない場合,を現在のクラス又はモジュールとする。

を のインクルードモジュールリストとする。のそれぞれの要素に対し,リスト内と逆順に,

名前が である定数束縛を探す。

e)  束縛が見つからない場合,次の手順を行う。

1)  が Class クラスのインスタンスの場合,次の手順を行う。

i)

が直接のスーパークラスをもたない場合,名前が である Symbol クラスの直接のインスタン

スを作り,それを とする。const_missing メソッドを,現在のクラス又はモジュールに対し,

を実引数として呼び出す。呼出し結果の値を《定数識別子》の値とする。

ii)  が直接のスーパークラスをもつ場合,を の直接のスーパークラスとする。 
iii)  に対し,名前が である定数束縛を探す。 
iv)  束縛が見つからない場合,を のインクルードモジュールリストとし,のそれぞれの要素に

対し,リスト内と逆順に,名前が である定数束縛を探す。

v)  束縛が見つからない場合,を の直接のスーパークラスとする。手順 e) 1) i)から処理を続ける。


84

X 3017

:2013 (ISO/IEC 30170:2012)

2)  が Class クラスのインスタンスでない場合,次の手順を行う。

i)

Object

クラスに対し,名前が である定数束縛を探す。

ii)  束縛が見つからない場合,を Object クラスのインクルードモジュールリストとし,のそれ

ぞれの要素に対し,リスト内と逆順に,名前が である定数束縛を探す。

iii)  束縛が見つからなかった場合,名前が である Symbol クラスの直接のインスタンスを作り,そ

れを とする。const_missing メソッドを,現在のクラス又はモジュールに対し,を実引数

として呼び出す。呼出し結果の値を《定数識別子》の値とする。

11.5.4.3  スコープ付き定数 

《スコープ付き定数参照》は,次の手順で評価する。

a)  《一次式》が存在する場合,それを評価し,を評価結果の値とする。そうではない場合,を Object

クラスとする。

b)  が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外と

して発生させる。

c)  が Module クラスのインスタンスである場合,次の手順を行う。

1)  評価対象の《定数識別子》を,とする。 
2)  名前が である束縛が の定数束縛の集合内に存在する場合,《スコープ付き定数参照》の値はその

束縛の値とする。

3)  そうではない場合,次の手順を行う。

i)

のインクルードモジュールリストを,とする。名前が である定数束縛を 内から,リスト

内と逆順に探す。

ii)  束縛が見つかった場合,《スコープ付き定数参照》の値はその束縛の値とする。 
iii)  束縛が見つからず,かつ,が Class クラスのインスタンスの場合,名前が である定数束縛

の探索を,11.5.4.2 の手順 e)から行う。

iv)  束縛が見つからず,かつ,が Class クラスのインスタンスでない場合,名前が である Symbol

クラスの直接のインスタンスを作り,それを とする。const_missing メソッドを,に対し

を実引数として呼び出す。

11.5.4.4  大域変数 

《大域変数識別子》は,次の手順で評価する。

a)  評価対象の《大域変数識別子》を,とする。

b)  名前が である束縛が⟦大域変数束縛集合⟧内に存在する場合,《大域変数識別子》の値はその束縛の値

とする。ただし,その束縛が,実行環境の初期化時に処理系が追加した束縛(7.2 参照)である場合,

その動作は未規定とする。

c)  そうではない場合,《大域変数識別子》の値は nil とする。 
11.5.4.5  クラス変数 

《クラス変数識別子》は,次の手順で評価する。

a)  を《クラス変数識別子》とする。⟦クラスモジュールリスト⟧の一番上のリスト内の,特異クラスでな

い最初のクラス又はモジュールを,とする。

b)  とその全てのスーパークラスとを含む集合を,CS とする。CS のそれぞれの要素のインクルードモ

ジュールリストについて,そこに含まれるモジュールを全て合わせた集合を,MS とする。CS 及び

MS の和集合を,CM とする。


85

X 3017

:2013 (ISO/IEC 30170:2012)

c)  CM 内のクラス又はモジュールのうちのただ一つが,名前が である束縛をそのクラス変数束縛の集

合内にもつ場合,をその束縛の値とする。

d)  CM 内のクラス又はモジュールのうち,二つ以上のクラス又はモジュールが,名前が である束縛を

そのクラス変数束縛の集合内にもつ場合,をこれらの束縛のいずれかの値とする。どの束縛を選ぶ

かは処理系定義とする。

e)  CM 内のクラス又はモジュールに,名前が である束縛をそのクラス変数束縛の集合内にもつものが

存在しなかった場合は,を名前が である Symbol クラスの直接のインスタンスとし,を名前属

性にもつ NameError クラスの直接のインスタンスを例外として発生させる。

f)  《クラス変数識別子》の値を とする。 
11.5.4.6  インスタンス変数 

《インスタンス変数識別子》は,次の手順で評価する。

a)  評価対象の《インスタンス変数識別子》を とする。 
b)  現在の self のインスタンス変数束縛の集合内に,名前が である束縛が存在した場合,《インスタン

ス変数識別子》の値はその束縛の値とする。

c)  そうではない場合,《インスタンス変数識別子》の値は nil とする。 
11.5.4.7  局所変数又はメソッド呼出し 
11.5.4.7.1  
概要 

《変数参照》内に《局所変数識別子》が存在した場合,その《局所変数識別子》は局所変数への参照又は実引

数なしのメソッド呼出しのいずれかとして評価される。

11.5.4.7.2  局所変数識別子の種類の判別 

《局所変数識別子》の出現が局所変数への参照なのか,メソッド呼出しなのかは,次のとおり判別する。

a)  を が現れたプログラムテキスト上の位置とする。 
b)  を内包し,かつ,《ブロック》に対応しない局所変数のスコープのうち,最も内側のものを とする

9.2 参照)

c)  の開始点と との間のプログラムテキスト上の区間を,とする。 
d)  と同じ識別子が局所変数への参照として 内の《変数参照》内に存在する場合,は局所変数への参照

とする。

e)  と同じ識別子が次の形式として 内に存在する場合,は局所変数への参照とする。

−  《必須仮引数》

−  《省略可能仮引数名》

−  《配列仮引数名》

−  《Proc 仮引数名》

−  《左辺》の《変数》

−  《単一変数代入式》の《変数》

−  《単一変数代入文》の《変数》

−  《演算付き変数代入式》の《変数》

−  《演算付き変数代入文》の《変数》

f)  そうではない場合,はメソッド呼出しとする。

注記  《変数参照》内の《局所変数識別子》以外についても,その《局所変数識別子》の出現が局所変数へ

の参照なのか,メソッド呼出しなのかが,構文規則だけから判別できない場合に,上記の手順


86

X 3017

:2013 (ISO/IEC 30170:2012)

で判別を行う(11.3.1 参照)

11.5.4.7.3  局所変数 

《局所変数識別子》が局所変数への参照である場合は,次の手順で評価する。

a)  を評価対象の《局所変数識別子》とする。 
b)  名前が である局所変数束縛を,9.2 で規定されているとおりに探す。

c)  束縛が見つかった場合,《局所変数識別子》の値はその束縛の値とする。 
d)  そうではない場合,《局所変数識別子》の値は nil とする。 
11.5.4.7.4  メソッド呼出し 

《局所変数識別子》がメソッド呼出しである場合は,次の手順で評価する。

a)  を《局所変数識別子》とする。 
b)  空の実引数リスト を作り,現在の self をメソッド呼出しのレシーバ,をメソッド名,を実引数

のリストとしてメソッド呼出しを行う(13.3.3 参照)

11.5.4.8  擬似変数 
11.5.4.8.1  
概要 

構文規則

《擬似変数》 ::

  《nil式》

|《true式》

|《false式》

|《self式》

注記  《擬似変数》は《局所変数識別子》に似た形式をもつが,変数ではない。

11.5.4.8.2  nil  

構文規則

nil式》 ::

  “nil”

意味規則

nil 式》の評価結果は,NilClass クラスの唯一のインスタンスである nil とする(6.6 参照)。

11.5.4.8.3  true 式及び false  

構文規則

true式》 ::

  “true”

false式》 ::

  “false”

意味規則

true 式》の評価結果は,TrueClass クラスの唯一のインスタンスである true とする。《false 式》の評価

結果は,FalseClass クラスの唯一のインスタンスである false とする(6.6 参照)


87

X 3017

:2013 (ISO/IEC 30170:2012)

11.5.4.8.4  self  

構文規則

self式》 ::

  “self”

意味規則

self 式》の評価結果は,現在の self の値とする。

11.5.5  オブジェクト生成子 
11.5.5.1  
配列生成子 

構文規則

《配列生成子》 ::

  “[”  《添字実引数リスト》

?

 “]”

意味規則

《配列生成子》は,次の手順で評価する。

a)  《添字実引数リスト》がある場合,11.3.2 で規定するとおりに,《添字実引数リスト》から実引数のリス

トを作成する。をそのリストとする。

b)  そうではない場合,空の値のリスト を作成する。 
c)  Array クラス(15.2.12 参照)の直接のインスタンスを作成し,そのインスタンスに のそれぞれの

要素を順序を保ったまま保存したものを とする。

d)  《配列生成子》の値は とする。 
11.5.5.2  ハッシュ生成子 

構文規則

《ハッシュ生成子》 ::

  “{”  (  《連想リスト》  [《行終端子》禁止]  “,”

?

  )

?

 “}”

《連想リスト》 ::

  《連想》  (  [《行終端子》禁止]  “,”  《連想》  )

*

《連想》 ::

  《連想キー》  [《行終端子》禁止]  “=>”  《連想値》

《連想キー》 ::

  《演算子式》

《連想値》 ::

  《演算子式》

意味規則

a)  《ハッシュ生成子》は,次の手順で評価する。

1)  《連想リスト》が存在する場合,その《連想リスト》を評価する。評価結果の値を《ハッシュ生成子》の

値とする。

2)  そうではない場合,Hash クラス(15.2.13 参照)の空の直接のインスタンスを作成する。このイン

スタンスを《ハッシュ生成子》の値とする。

b)  《連想リスト》は,次の手順で評価する。

1)  Hash クラスの空の直接のインスタンス を作成する。


88

X 3017

:2013 (ISO/IEC 30170:2012)

2)  それぞれの《連想》A

i

について,プログラムテキストに現れる順に,次の手順を行う。

i)

A

i

の《連想キー》の《演算子式》を評価する。K

i

を評価結果の値とする。

ii)  《連想値》の《演算子式》を評価する。V

i

を評価結果の値とする。

iii)  K

i

と V

i

との組を,に対し  “[]=”  メソッドを K

i

及び V

i

を実引数として呼び出すことによって,

に保存する。

3)  《連想リスト》の値は とする。

11.5.5.3 

範囲式 

構文規則

《範囲式》 ::

  《演算子OR式》

|《演算子OR式》

1

  [《行終端子》禁止]  《範囲演算子》  《演算子OR式》

2

《範囲演算子》 ::

  “..”

|“...”

意味規則

《演算子 OR 式》

1

《範囲演算子》  《演算子 OR 式》

2

という形式の《範囲式》は,次の手順で評価する。

a)  《演算子 OR 式》

1

を評価する。を評価結果の値とする。

b)  《演算子 OR 式》

2

を評価する。を評価結果の値とする。

c)  《範囲演算子》が終端記号  “..”  の場合,三つの実引数 AB,及び false を含むリスト を作成する。

《範囲演算子》が終端記号  “...”  の場合,三つの実引数 AB,及び true を含むリスト を作成する。

d)  Range クラス(15.2.14 参照)に対し,new メソッドを,を実引数リストとして呼び出す。呼出し結

果の値を《範囲式》の値とする。

12   
12.1  
概要 

構文規則

《文》 ::

  《式文》

|《alias文》

|《undef文》

|《if修飾文》

|《unless修飾文》

|《while修飾文》

|《until修飾文》

|《rescue修飾文》

|《代入文》

意味規則

alias 文》については,13.3.6 を参照。

undef 文》については,13.3.7 を参照。


89

X 3017

:2013 (ISO/IEC 30170:2012)

《代入文》については,11.4.2 を参照。

12.2  式文 

構文規則

《式文》 ::

  《式》

意味規則

《式文》は,次の手順で評価する。

a)  《式》を評価する。 
b)  評価結果の値を,《式文》の値とする。 
12.3  if 修飾文 

構文規則

if修飾文》 ::

  《文》  [《行終端子》禁止]  “if”  《式》

意味規則

S “if” という形式の《if 修飾文》(ここで,は《文》,は《式》とする。)は,次の手順で評価する。

a)  “if” E “then” S “end”  という形式の《if 式》を評価する。 
b)  評価結果の値を,《if 修飾文》の値とする。 
12.4  unless 修飾文 

構文規則

unless修飾文》 ::

  《文》  [《行終端子》禁止]  “unless”  《式》

意味規則

S “unless” という形式の《unless 修飾文》(ここで,は《文》,は《式》とする。)は,次の手順で評価

する。

a)  “unless” E “then” S “end”  という形式の《unless 式》を評価する。 
b)  評価結果の値を,《unless 修飾文》の値とする。

12.5  while 修飾文 

構文規則

while修飾文》 ::

  《文》  [《行終端子》禁止]  “while”  《式》

意味規則

S “while” という形式の《while 修飾文》(ここで,は《文》,は《式》とする。)は,次の手順で評価す

る。

a)  が《begin 式》の場合,動作は処理系定義とする。

b)  “while” E “do” S “end”  という形式の《while 式》を評価する。 
c)  評価結果の値を,《while 修飾文》の値とする。


90

X 3017

:2013 (ISO/IEC 30170:2012)

12.6  until 修飾文 

構文規則

until修飾文》 ::

  《文》  [《行終端子》禁止]  “until”  《式》

意味規則

S “until” という形式の《until 修飾文》(は《文》,は《式》とする。)は,次の手順で評価する。

a)  が《begin 式》の場合,動作は処理系定義とする。

b)  “until” E “do” S “end”  という形式の《until 式》を評価する。 
c)  評価結果の値を,《until 修飾文》の値とする。 
12.7  rescue 修飾文 

構文規則

rescue修飾文》 ::

  《rescue修飾文の主文》  [《行終端子》禁止]  “rescue”  《rescue修飾文の後退文》

rescue修飾文の主文》 ::

  《文》

rescue修飾文の後退文》 ::

  《文》  −  《後退文不許可文》

《後退文不許可文》 ::

  《キーワードAND式》

|《キーワードOR式》

|《if修飾文》

|《unless修飾文》

|《while修飾文》

|《until修飾文》

|《rescue修飾文》

意味規則

rescue 修飾文》は,次の手順で評価する。

a)  《rescue 修飾文の主文》を評価する。評価結果の値を とする。 
b)  手順 a)の評価中に StandardError クラスの直接のインスタンスが例外として発生したが,処理され

なかった場合,《rescue 修飾文の後退文》を評価し,その評価結果の値を《rescue 修飾文》の値とする。

c)  手順 a)の評価中に例外が発生しなかった場合,又は発生した全ての例外が手順 a)で処理された場合,

を《rescue 修飾文》の値とする。

13  クラス及びモジュール 
13.1  
モジュール 
13.1.1  
概要 

全てのモジュールは,Module クラスのインスタンスである(15.2.2 参照)

。ただし,Module クラスは,

Class

クラスのスーパークラスの一つであるため,Module クラスの全てのインスタンスがモジュールで

あるわけではない。Class クラスのインスタンスは,モジュールではなくクラスである。


91

X 3017

:2013 (ISO/IEC 30170:2012)

モジュールは,次の属性をもつ。

インクルードモジュールリスト:モジュールにインクルードされているモジュールのリストである。モ

ジュールのインクルードについては,13.1.3 に示す。

定数:定数束縛の集合である。定数束縛は,次のプログラム構成要素によって作成される。

−  《代入》(11.4.2 参照)

−  《モジュール定義》(13.1.2 参照)

−  《クラス定義》(13.2.2 参照)

クラス変数:クラス変数束縛の集合である。クラス変数束縛は,《代入》(11.4.2 参照)によって作成さ

れる。

インスタンスメソッド:メソッド束縛の集合である。メソッド束縛は,《メソッド定義》(13.3.1 参照),

《特異メソッド定義》(13.4.3 参照),《alias 文》(13.3.6 参照)又は《undef 文》(13.3.7 参照)によって

作成される。この束縛の値は,undef の場合もある。undef は,メソッドが呼出し不可能であること

を意味する(13.3.7 参照)

13.1.2  モジュール定義 

構文規則

《モジュール定義》 ::

  “module”  《モジュールパス》  《モジュール本体》  “end”

《モジュールパス》 ::

  《最上位モジュールパス》

|《モジュール名》

|《入れ子モジュールパス》

《モジュール名》 ::

  《定数識別子》

《最上位モジュールパス》 ::

  “::”  《モジュール名》

《入れ子モジュールパス》 ::

  《一次式》  [《行終端子》禁止]  “::”  《モジュール名》

《モジュール本体》 ::

  《本体文》

意味規則

《モジュール定義》は,次の手順で評価する。

a)  名前が《モジュール名》である定数束縛を作成又は更新するクラス又はモジュール を,次のように決

定する。

1)  《モジュールパス》が《最上位モジュールパス》という形式の場合,を Object クラスとする。

2)  《モジュールパス》が《モジュール名》という形式の場合,を現在のクラス又はモジュールとする。 
3)  《モジュールパス》が《入れ子モジュールパス》という形式の場合,その《一次式》を評価する。評価結

果が Module クラスのインスタンスの場合,そのインスタンスを とする。そうではない場合,

TypeError

クラスの直接のインスタンスを例外として発生させる。

b)  を《モジュール名》とする。


92

X 3017

:2013 (ISO/IEC 30170:2012)

1)  名前が である束縛が,の定数束縛の集合内に存在する場合,をその束縛とする。の値がモ

ジュールである場合,そのモジュールを とする。そうではない場合,TypeError クラスの直接

のインスタンスを例外として発生させる。

2)  それ以外の場合,Module クラスの直接のインスタンス を作成する。名前が で,値が であ

る変数束縛を作成し,それを の定数束縛の集合に追加する。

c)  実行環境を,次の手順を行うことで変更する。

1)  ⟦クラスモジュールリスト⟧の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭

に を追加する。そのリストを⟦クラスモジュールリスト⟧に積む。

2)  を⟦self⟧に積む。 
3)  可視性 public を⟦省略時可視性⟧に積む。 
4)  空の束縛の集合を⟦局所変数束縛集合⟧に積む。

d)  《モジュール本体》の《本体文》(11.5.2.5 参照)を評価する。《本体文》の評価結果を《モジュール定義》

の値とする。

e)  ⟦クラスモジュールリスト⟧,⟦self⟧,⟦省略時可視性⟧及び⟦局所変数束縛集合⟧の一番上の要素を取り除

くことによって,実行環境を復元する。

13.1.3  モジュールのインクルード 

モジュール及びクラスは,他のモジュールをインクルードすることによって拡張することができる。

インクルードされたモジュールのインスタンスメソッド(13.3.1 参照)

,クラス変数(11.5.4.5 参照)及

び定数(11.5.4.2 参照)は,そのモジュールをインクルードしたモジュール又はクラスで利用できる。

モジュールのインクルードは,メソッド include 又はメソッド extend を実行することによって行う

15.2.2.4.27 及び 15.3.1.3.13 参照)

モジュール が別のモジュール にインクルードされているのは,が のインクルードモジュール

リストの要素である場合に限る。モジュール がクラス にインクルードされているのは,が のイ

ンクルードモジュールリストの要素であるか,が のいずれかのスーパークラスによってインクルード

されている場合に限る。

13.2  クラス 
13.2.1  
概要 

全てのクラスは,Class クラスのインスタンスである。Class クラスは,Module クラスの直接のサブ

クラスである(15.2.3 参照)

クラスはモジュールと同じ属性をもつ。それに加えて,それぞれのクラスは高々一つの直接のスーパー

クラスをもつ。


93

X 3017

:2013 (ISO/IEC 30170:2012)

13.2.2  クラス定義 

構文規則

《クラス定義》 ::

  “class”  《クラスパス》  [《行終端子》禁止]  (  “<”  《スーパークラス》  )

?

  《分離子》

  《クラス本体》  “end”

《クラスパス》 ::

  《最上位クラスパス》

|《クラス名》

|《入れ子クラスパス》

《クラス名》 ::

  《定数識別子》

《最上位クラスパス》 ::

  “::”  《クラス名》

《入れ子クラスパス》 ::

  《一次式》  [《行終端子》禁止]  “::”  《クラス名》

《スーパークラス》 ::

  《式》

《クラス本体》 ::

  《本体文》

意味規則

《クラス定義》は,次の手順で評価する。

a)  名前が《クラス名》である定数束縛を作成又は更新するクラス又はモジュール を,次の手順を行うこ

とで決定する。

1)  《クラスパス》が《最上位クラスパス》という形式の場合,を Object クラスとする。 
2)  《クラスパス》が《クラス名》という形式の場合,を現在のクラス又はモジュールとする。

3)  《クラスパス》が《入れ子クラスパス》という形式の場合,その《一次式》を評価する。評価結果が

Module

クラスのインスタンスの場合,そのインスタンスを とする。そうではない場合,

TypeError

クラスの直接のインスタンスを例外として発生させる。

b)  を《クラス名》とする。

1)  名前が である束縛が の定数束縛の集合内に存在する場合,をその束縛とする。

i)

の値が Class クラスのインスタンスの場合,そのインスタンスを とする。そうではない場合,

TypeError

クラスの直接のインスタンスを例外として発生させる。

ii)  《スーパークラス》が存在する場合,それを評価する。評価結果の値が の直接のスーパークラス

と一致しない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

2)  そうではない場合,Class クラスの直接のインスタンスを作成する。そのクラスを とする。

i)

《スーパークラス》が存在する場合,それを評価する。評価結果が Class クラスのインスタンスで

ない場合,TypeError クラスの直接のインスタンスを例外として発生させる。《スーパークラス》

の値が特異クラス又は Class クラスである場合の動作は未規定とする。そうではない場合,《ス

ーパークラス》の値を の直接のスーパークラスとする。


94

X 3017

:2013 (ISO/IEC 30170:2012)

ii)  《クラス定義》が《スーパークラス》をもたない場合,Object クラスを の直接のスーパークラス

とする。

iii)  特異クラスを作り,と関連付ける。この特異クラスは,スーパークラスの一つとして,の直

接のスーパークラスの特異クラスをもたなければならない。

iv)  名前が で,値が である変数束縛を作成し,それを の定数束縛の集合に追加する。

c)  実行環境を,次の手順を行うことで変更する。

1)  ⟦クラスモジュールリスト⟧の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭

に を追加する。そのリストを⟦クラスモジュールリスト⟧に積む。

2)  を⟦self⟧に積む。 
3) public 可視性を⟦省略時可視性⟧に積む。 
4)  空の束縛の集合を⟦局所変数束縛集合⟧に積む。

d)  《クラス本体》の《本体文》(11.5.2.5 参照)を評価する。《本体文》の評価結果を《クラス定義》の値とする。 
e)  ⟦クラスモジュールリスト⟧,⟦self⟧,⟦省略時可視性⟧及び⟦局所変数束縛集合⟧の一番上の要素を取り除

くことで,実行環境を復元する。

13.2.3  継承 

クラスは,そのスーパークラスから属性を継承する。これは,クラスがそのスーパークラスの属性を,

次のように暗黙のうちに含んでいるとみなせる。

−  スーパークラスの定数及びクラス変数を参照できる(11.5.4.2 及び 11.5.4.5 参照)

−  スーパークラスの特異メソッドを呼び出すことができる(13.4 参照)

−  スーパークラスに定義されているインスタンスメソッドは,そのサブクラスのインスタンスに対して

呼び出すことができる(13.3.1 参照)

13.2.4  インスタンス生成 

クラスの直接のインスタンスは,クラスに対し new メソッド(15.2.3.3.3 参照)を呼び出すことで生成

される。

13.3  メソッド 
13.3.1  
メソッド定義 

構文規則

《メソッド定義》 ::

  “def”  《メソッド定義名》  [《行終端子》禁止]  《メソッド仮引数部》

  《メソッド本体》  “end”

《メソッド定義名》 ::

  《メソッド名》

|《代入風メソッド識別子》

《メソッド本体》 ::

  《本体文》

次のプログラム構成要素は,《メソッド仮引数部》又は《メソッド本体》内に存在してはならない。

−  《クラス定義》

−  《モジュール定義》

−  《変数》が《定数識別子》であるような《単一変数代入》


95

X 3017

:2013 (ISO/IEC 30170:2012)

−  《スコープ付き定数代入》

−  次のいずれかの形式の《左辺》をその中にもつ《多重代入文》

−  《定数識別子》

−  《一次式》  [《行終端子》禁止]  (  “.”|“::”  )  (  《局所変数識別子》|《定数識別子》  )

−  “::”  《定数識別子》

ただし,《メソッド仮引数部》内又は《メソッド本体》内の《特異クラス定義》においては,これらの構成要

素が現れてもよい。

意味規則

メソッドは《メソッド定義》又は《特異メソッド定義》(13.4.3 参照)によって定義される。メソッドは,

それを定義する《メソッド定義》又は《特異メソッド定義》の《メソッド仮引数部》及び《メソッド本体》をもつ。

《メソッド本体》は,そのメソッドが呼び出された際に評価される(13.3.3 参照)。《メソッド本体》の評価は,

その《本体文》(11.5.2.5 参照)の評価とする。また,メソッドは次の属性をもつ。

クラスモジュールリスト:メソッド定義時の⟦クラスモジュールリスト⟧  の一番上の要素である。

定義名:メソッド定義時に指定された名前である。

可視性:メソッドの可視性である。

あるクラス又はモジュールは,それのスーパークラス又はそれにインクルードされているモジュールの

いずれかの中にあるメソッドの名前と同じ名前をもつ新しいメソッドを定義することができる。

その場合,

その新しいメソッドは,そのスーパークラス又はインクルードされているモジュールのメソッドを上書き

するという。

《メソッド定義》は,次の手順で評価する。

a)  を《メソッド名》とする。 
b)  この《メソッド定義》によって定義されるメソッド を作成する。の属性を,次のように初期化する。

−  クラスモジュールリスト属性を,⟦クラスモジュールリスト⟧の一番上の値とする。

−  定義名属性を とする。

−  可視性属性を次のように初期化する。

−  現在のクラス又はモジュールが特異クラスの場合,現在の可視性とする。

−  そうではなく,が  “initialize”  又は  “initialize_copy”  の場合,private とする。

−  そうではない場合,現在の可視性とする。

c)  名前が である束縛が,現在のクラス又はモジュールのインスタンスメソッド束縛の集合内に存在す

る場合,その束縛の値を とする。

1)  が undef の場合,この《メソッド定義》の評価方法は処理系定義とする。 
2)  束縛の値 を で置き換える。

d)  そうではない場合,名前が で,値が であるメソッド束縛を作成し,それを現在のクラス又はモジ

ュールのインスタンスメソッド束縛の集合に追加する。

e)  《メソッド定義》の値は,処理系定義とする。


96

X 3017

:2013 (ISO/IEC 30170:2012)

13.3.2  メソッド仮引数 

構文規則

《メソッド仮引数部》 ::

  “(”  《仮引数リスト》

?

 “)”

|《仮引数リスト》

?

  《分離子》

《仮引数リスト》 ::

  《必須仮引数リスト》  (  “,”  《省略可能仮引数リスト》  )

?

    (  “,”  《配列仮引数》  )

?

  (  “,”  《Proc仮引数》  )

?

|《省略可能仮引数リスト》  (  “,”  《配列仮引数》  )

?

  (  “,”  《Proc仮引数》  )

?

|《配列仮引数》  (  “,”  《Proc仮引数》  )

?

|《Proc仮引数》

《必須仮引数リスト》 ::

  《必須仮引数》

|《必須仮引数リスト》  “,”  《必須仮引数》

《必須仮引数》 ::

  《局所変数識別子》

《省略可能仮引数リスト》 ::

  《省略可能仮引数》

|《省略可能仮引数リスト》  “,”  《省略可能仮引数》

《省略可能仮引数》 ::

  《省略可能仮引数名》  “=”  《省略値仮引数式》

《省略可能仮引数名》 ::

  《局所変数識別子》

《省略値仮引数式》 ::

  《演算子式》

《配列仮引数》 ::

  “*”  《配列仮引数名》

|“*”

《配列仮引数名》 ::

  《局所変数識別子》

Proc仮引数》 ::

  “&”  《Proc仮引数名》

Proc仮引数名》 ::

  《局所変数識別子》

《仮引数リスト》において,その《必須仮引数》,《省略可能仮引数名》,《配列仮引数名》及び《Proc 仮引数

名》の,《局所変数識別子》は,全て異なる名前でなければならない。

意味規則

仮引数には,次に示す 4 種類がある。これらの仮引数が,実引数に束縛される仕組みについて,13.3.3

で規定する。


97

X 3017

:2013 (ISO/IEC 30170:2012)

必須仮引数:必須仮引数は,《必須仮引数》によって表される。それぞれの必須仮引数には,対応する実

引数がメソッド呼出し時に与えられなければならない。

省略可能仮引数:省略可能仮引数は,《省略可能仮引数》によって表される。それぞれの省略可能仮引数

は,《省略可能仮引数名》によって表される仮引数名と,《省略値仮引数式》によって表される式とか

ら構成される。省略可能仮引数に対応する実引数がメソッド呼出し時に与えられなかった場合,そ

の省略可能仮引数に対応する実引数の値として,《省略値仮引数式》の値が使用される。

配列仮引数:配列仮引数は,《配列仮引数名》によって表される。メソッド呼出し時に与えらえた《ブロッ

ク実引数》を除く実引数の個数を として,が必須仮引数の個数及び省略可能仮引数の個数の合

計より大きい場合,《ブロック実引数》以外の全ての超過した実引数を含む Array クラスの直接のイ

ンスタンスが配列仮引数に束縛される。超過する実引数がない場合,配列仮引数には Array クラス

の空の直接のインスタンスが束縛される。《配列仮引数》が  “*”  という形式の場合,超過した実引数

は無視される。

Proc 仮引数:Proc 仮引数は,《Proc 仮引数名》によって表される。Proc 仮引数には,メソッド呼出しに渡

されたブロックを表す Proc クラスの直接のインスタンスが束縛される。

13.3.3  メソッド呼出し 

実引数のリストの作成方法については,11.3 で示す。

メソッド呼出しのレシーバを R,メソッド名を M,実引数のリストを とする。この条件の下で,次の

処理を実行する。

a)  メソッド呼出しに《ブロック》が渡された場合,をその《ブロック》とする。そうではない場合,

block-not-given とする。

b)  が特異クラスをもつ場合,その特異クラスを とする。そうではない場合,のクラスを とする。 
c)  を起点とし,名前が であるメソッド束縛を探索する(13.3.4 参照)。 
d)  束縛が見つかり,その値が undef でない場合,をその束縛の値とする。

e)  そうではない場合で,が method_missing の場合の動作は未規定とする。が method_missing

でない場合,名前が である Symbol クラスの直接のインスタンスを の先頭に追加し,

method_missing

メソッド(15.3.1.3.30 参照)を に対し を実引数リスト,を《ブロック》として

呼び出す。を呼出し結果の値とし,手順 j)から処理を続ける。

f)  メソッドが呼出し可能かどうかを調べるため,の可視性をチェックする(13.3.5 参照)。メソッドが

呼び出せない場合は,名前が である Symbol クラスの直接のインスタンスを の先頭に追加し,

method_missing

メソッドを に対し を実引数リスト,を《ブロック》として呼び出す。を呼

出し結果の値とし,手順 j)から処理を続ける。

g)  実行環境を,次のように変更する。

1)  のクラスモジュールリストを⟦クラスモジュールリスト⟧に積む。 
2)  を⟦self⟧に積む。 
3)  を⟦呼出し時メソッド名⟧に積む。

4)  可視性 public を⟦省略時可視性⟧に積む。 
5)  の定義名を⟦定義時メソッド名⟧に積む。 
6)  を⟦ブロック⟧に積む。

7)  空の束縛の集合を⟦局所変数束縛集合⟧に積む。

h)  の《メソッド仮引数部》を,次の手順で評価する。


98

X 3017

:2013 (ISO/IEC 30170:2012)

1)  《メソッド仮引数部》の《仮引数リスト》を とする。 
2)  の,《必須仮引数リスト》の全ての《必須仮引数》,《省略可能仮引数リスト》の全ての《省略可能仮引

数》,及び《配列仮引数》をそれぞれ,P

m

P

o

及び P

a

とする。の要素の個数,P

m

の個数,及び P

o

の個数をそれぞれ,N

A

N

Pm

及び N

Po

とする。《必須仮引数》又は《省略可能仮引数》が存在しない場

合,N

Pm

及び N

Po

は 0 とする。S

b

を現在の局所変数束縛の集合とする。

3)  N

A

が N

Pm

より小さい場合,

ArgumentError

クラスの直接のインスタンスを例外として発生させる。

4)  P

a

が存在せず,かつ,N

A

が N

Pm

と N

Po

との合計より大きい場合,ArgumentError クラスの直接の

インスタンスを例外として発生させる。

5)  そうではない場合,のそれぞれの 番目の実引数 A

i

について,内の順序と同順に,次の手順を

行う。

i)

内に現れる順番で 番目の《必須仮引数》又は《省略可能仮引数》を,P

i

とする。

ii)  該当する P

i

が存在しない場合,手順 h) 6)から処理を続ける。

iii)  P

i

が必須仮引数の場合,をその《必須仮引数》とする。P

i

が省略可能仮引数の場合,をその《省

略可能仮引数名》とする。名前が n,値が A

i

である変数束縛を作成し,それを S

b

に追加する。

6)  N

A

が N

Pm

と N

Po

との合計より大きく,かつ,P

a

が存在する場合は,次の手順を行う。

i)

超過した実引数の数と長さとが等しいような,

Array

クラスの直接のインスタンス を作成する。

ii)  超過した実引数を,実引数リストに現れる順序を保って,に格納する。

iii)  を P

a

の《配列仮引数名》とする。

iv)  名前が で,値が である変数束縛を作成し,それを S

b

に追加する。

7)  N

A

が N

Pm

と N

Po

との合計より小さい場合,次の手順を行う。

i)

対応する実引数のないそれぞれの省略可能仮引数 P

Oi

に対し,P

Oi

の《省略値仮引数式》を評価し,

を評価結果の値とする。

ii)  を P

Oi

の《省略可能仮引数名》とする。

iii)  名前が で,値が である変数束縛を作成し,それを S

b

に追加する。

8)  N

A

が,N

Pm

と N

Po

との合計より少ないか同数であって,かつ,P

a

が存在する場合は,次の処理を実

行する。

i)

Array

クラスの空の直接のインスタンス を作る。

ii)  を P

a

の《配列仮引数名》とする。

iii)  名前が で,値が である変数束縛を作成し,それを S

b

に追加する。

9)  の《Proc 仮引数》が存在する場合,を⟦ブロック⟧の一番上の要素とする。

i)

が block-not-given の場合,を nil とする。

ii)  そうではない場合,Proc クラスに対し,new メソッドを呼び出す。この呼出しには,空の実引

数リスト及び《ブロック》を渡す。そのメソッド呼出しの値を とする。

iii)  《Proc 仮引数》の《Proc 仮引数名》を とする。 
iv)  名前が で,値が である変数束縛を作成し,それを S

b

に追加する。

i)

の《メソッド本体》を評価する。

1)  この《メソッド本体》の評価が《return 式》によって終了された場合,次の手順を行う。

i)

return 式》が《ジャンプ実引数》をもつ場合,をその《ジャンプ実引数》の値とする。

ii)  そうではない場合,を nil とする。

2)  そうではない場合,を評価結果の値とする。


99

X 3017

:2013 (ISO/IEC 30170:2012)

j)  ⟦クラスモジュールリスト⟧,⟦self⟧,⟦呼出し時メソッド名⟧,⟦省略時可視性⟧,⟦定義時メソッド名⟧,

⟦ブロック⟧及び⟦局所変数束縛集合⟧の一番上の要素を取り除くことによって,実行環境を復元する。

k)  このメソッド呼出しの結果は とする。

手順 g)で変更された,⟦局所変数束縛集合⟧を除く実行環境の属性の,一番上の要素の集合が対応するメ

ソッド呼出し又は《super 式》[11.3.4 d)参照]を,現在のメソッド呼出しと呼ぶ。

13.3.4  メソッド探索 

メソッド探索は,インスタンスメソッド束縛を解決する処理である。

をメソッド名,をメソッド探索の起点となるクラス又はモジュールとする。この条件の下で,メソ

ッド束縛は次のように解決する。

a)  名前が であるメソッド束縛が,のインスタンスメソッド束縛の集合内に存在する場合,その束縛

を とする。

b)  そうではない場合,のインクルードモジュールリスト L

m

を末尾から順に処理する。L

m

中のそれぞ

れのモジュールに対して,そのインスタンスメソッド束縛の集合内に,名前が であるメソッド束縛

が存在するかどうか確認する。

1)  該当する束縛が存在する場合,その束縛を とする。 
2)  そうではない場合,次の手順を行う。

i)

が直接のスーパークラスをもたない場合,束縛は解決されなかったとみなす。

ii)  が直接のスーパークラスをもつ場合,の直接のスーパークラスを新たな とし,手順 a)から

探索処理を継続する。

c)  が,解決されたメソッド束縛であるとする。

13.3.5  メソッド可視性 
13.3.5.1  
概要 

メソッドは,その呼出しが許可される条件によって,public,private,protected の 3 種類に分類される。

この条件を決定するメソッドの属性を,メソッドの可視性と呼ぶ。

13.3.5.2 public メソッド 

public メソッドとは,その可視性属性の値が public であるメソッドとする。

public メソッドは,呼出しの制限はない。

13.3.5.3 private メソッド 

private メソッドとは,その可視性属性の値が private であるメソッドとする。

private メソッドは,レシーバを明示的に指定して呼び出すことができない。つまり,private メソッドの

呼出し内のレシーバに対応する位置に《一次式》又は《連鎖メソッド呼出し》が現れる場合,そのメソッドは

呼び出すことができない。

ただし,

メソッド呼出しが次のいずれかの形式であり,

かつ,

その《一次式》が《self

式》である場合は,メソッドを呼び出すことができる。

−  《単一メソッド代入》

−  《演算付きメソッド代入》

−  《単一添字代入》

−  《演算付き添字代入》

13.3.5.4 protected メソッド 

protected メソッドとは,その可視性属性の値が protected であるメソッドとする。 
protected メソッドは,次の条件を満たす場合に限り,呼び出すことができる。


100

X 3017

:2013 (ISO/IEC 30170:2012)

−  メソッドの束縛が存在する Module クラスのインスタンスを,とする。

現在の self が をインクルードしている場合,が現在の self のクラスである場合,又は が現

在の self のクラスのスーパークラスの一つである場合。

が特異クラスの場合,ある protected メソッドが呼出し可能かどうかは,処理系定義の方法で決定する。

13.3.5.5  可視性の変更 

メソッドの可視性は,Module クラスに定義されている組込みメソッド public(15.2.2.4.38 参照)

private

15.2.2.4.36 参照)及び protected(15.2.2.4.37 参照)によって変更される。

13.3.6  alias  

構文規則

alias文》 ::

  “alias”  《新しい名前》  《別名付与対象名》

《新しい名前》 ::

  《メソッド定義名》

|《シンボル》

《別名付与対象名》 ::

  《メソッド定義名》

|《シンボル》

意味規則

alias 文》は,次の手順で評価する。

a)  《新しい名前》を,次の手順で評価する。

1)  《新しい名前》が《メソッド定義名》の場合,《メソッド定義名》を とする。 
2)  《新しい名前》が《シンボル》の場合,《シンボル》を評価する。その評価結果である Symbol クラスの

インスタンスの名前を とする。

b)  《別名付与対象名》を次の手順で評価する。

1)  《別名付与対象名》が《メソッド定義名》の場合,《メソッド定義名》を とする。

2)  《別名付与対象名》が《シンボル》の場合,《シンボル》を評価する。その評価結果である Symbol クラ

スのインスタンスの名前を とする。

c)  を現在のクラス又はモジュールとする。

d)  を起点として,名前が であるメソッド束縛を 13.3.4 で規定するように探索する。 
e)  束縛が見つかり,かつ,その値が undef でない場合,を見つかった束縛の値とする。 
f)  そうではない場合,を名前が である Symbol クラスの直接のインスタンスとし,を名前属性に

もつ NameError クラスの直接のインスタンスを例外として発生させる。

g)  名前が であるメソッド束縛が,現在のクラス又はモジュールのインスタンスメソッド束縛の集合内

に存在する場合,その束縛の値を で置き換える。

h)  そうではない場合,名前が で,値が であるメソッド束縛を作成し,それを現在のクラス又はモジ

ュールのインスタンスメソッド束縛の集合に追加する。

i)

alias 文》の値は nil である。


101

X 3017

:2013 (ISO/IEC 30170:2012)

13.3.7  undef  

構文規則

undef文》 ::

  “undef”  《undefリスト》

undefリスト》 ::

  《メソッド名・記号》  (  “,”  《メソッド名・記号》  )

*

《メソッド名・記号》 ::

  《メソッド定義名》

|《シンボル》

意味規則

undef 文》は,次の手順で評価する。

a)  《undef リスト》のそれぞれの《メソッド名・記号》について,次の処理を行う。

1)  を現在のクラス又はモジュールとする。

2)  《メソッド名・記号》が《メソッド定義名》の場合,《メソッド定義名》を とする。そうではない場合,

《シンボル》を評価する。その評価結果である Symbol クラスのインスタンスの名前を,とする。

3)  名前が であるメソッド束縛を,を起点として 13.3.4 で規定するように探索する。

4)  束縛が見つかり,かつ,その値が undef でない場合は,次の手順を行う。

i)

束縛が 内に見つかった場合,その束縛の値を undef に置き換える。

ii)  そうではない場合,名前が で,値が undef であるメソッド束縛を作成し,それを のインスタ

ンスメソッド束縛の集合に追加する。

5)  そうではない場合,を名前が である Symbol クラスの直接のインスタンスとし,を名前属性

にもつ NameError クラスの直接のインスタンスを例外として発生させる。

b)  《undef 文》の値は nil とする。 
13.4  特異クラス 
13.4.1  
概要 

特異クラスは,他のオブジェクトと関連付けられた特別なクラスである。特異クラスは,関連付けられ

たオブジェクトの動作を変更する。特異クラス がオブジェクト と関連付けられているとき,は O

の特異クラスであるという。また,は の第 1 関連オブジェクトであるという。

一つのオブジェクトは,高々一つの特異クラスしかもたない。オブジェクトは,生成された時点では特

異クラスと関連付けられていてはならない。ただし,Class クラスのインスタンスは除く。特異クラスは,

《特異メソッド定義》,《特異クラス定義》などのプログラム構成要素を評価することで作られる。ただし,

Class

クラスのインスタンスが作られたときは,そのインスタンスは既に特異クラスと関連付けられてい

なければならない。

通常,特異クラスはその第 1 関連オブジェクトだけに関連付けられなければならない。しかし,Class

クラスのインスタンスの特異クラスは,幾つかの Class クラスのインスタンス(これらはある特異クラス

の第 1 関連オブジェクトであってはならない。

)と,処理系定義のやり方によって,追加で関連付けられて

もよい。特異クラスとその第 1 関連オブジェクトとがひとたび関連付けられた場合,その関連付けが削除

されることはあってはならない。しかし,前述の追加で関連付けられた Class クラスのインスタンスが別

の特異クラスの第 1 関連オブジェクトになった場合は,Class クラスのインスタンスとその特異クラスと


102

X 3017

:2013 (ISO/IEC 30170:2012)

の関連付けは削除される[13.4.2 e)及び 13.4.3 e)参照]

全ての特異クラスは Class クラスのインスタンスであり(15.2.3 参照)

,クラスがもつのと同じ属性の

集合をもつ。

特異クラスの直接のスーパークラスは,処理系定義とする。ただし,特異クラスは,それが関連付けら

れているオブジェクトのクラスのサブクラスでなければならない。

注記 1  例えば,Object クラスは Class クラスの直接のインスタンスであるので,Object クラス

の特異クラスは Class クラスのサブクラスである。それゆえ,Class クラスのインスタン

スメソッドは Object クラスに対して呼び出すことができる。

直接のスーパークラスをもつクラスの特異クラスは,次の条件を満たさなければならない。

−  E

c

をクラス の特異クラス,を の直接のスーパークラス,E

s

を の特異クラスとする。このとき,

E

c

は,E

s

をスーパークラスの一つとしてもつ。

注記 2  この条件によって,クラスは,そのスーパークラスから特異メソッドを継承することができ

る。例えば,File クラスの特異クラスは IO クラスの特異クラスをスーパークラスにもつ。

それによって,File クラスは IO クラスの特異メソッド open を継承する。

特異クラスは Class クラスのインスタンスであるが,それ自身のインスタンスを生成できない。特異ク

ラスに対して new メソッドが呼び出された場合は,TypeError クラスの直接のインスタンスが例外とし

て発生されなければならない[15.2.3.3.3 a)参照]

特異クラスがクラスのスーパークラスになれるかどうかは,未規定とする[13.2.2 b) 2) i)及び 15.2.3.3.1 c)

参照]

特異クラスがクラス変数の集合をもつかどうかは,処理系定義とする。

13.4.2  特異クラス定義 

構文規則

《特異クラス定義》 ::

  “class”  “<<”  《式》  《分離子》  《特異クラス本体》  “end”

《特異クラス本体》 ::

  《本体文》

意味規則

《特異クラス定義》は,次の手順で評価する。

a)  《式》を評価する。評価結果の値を とする。が Integer クラスのインスタンス又は Symbol クラ

スのインスタンスの場合,TypeError クラスの直接のインスタンスを例外として発生させてもよい。

b)  が niltrue,又は false のいずれかの場合,を のクラスとし,手順 f)に進む。

c)  が特異クラスに関連付けられていない場合,新たな特異クラスを作成する。その特異クラスを 

し,を第 1 関連オブジェクトとして と関連付ける。

d)  が第 1 関連オブジェクトとして特異クラスと関連付けられている場合,その特異クラスを とする。

e)  が第 1 関連オブジェクトとしてではなく特異クラスと関連付けられていた場合は,と特異クラス

との関連付けを削除し,新たな特異クラスを作成する。新しく作成した特異クラスを とし,を第

1 関連オブジェクトとして と関連付ける。

f)  実行環境を,次のとおり変更する。

1)  ⟦クラスモジュールリスト⟧の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭


103

X 3017

:2013 (ISO/IEC 30170:2012)

に を追加する。そのリストを⟦クラスモジュールリスト⟧  に積む。

2)  を⟦self⟧  に積む。

3)  可視性 public を⟦省略時可視性⟧  に積む。 
4)  空の束縛の集合を⟦局所変数束縛集合⟧  に積む。

g)  《特異クラス本体》を評価する。《特異クラス本体》の評価結果を《特異クラス定義》の値とする。

h)  ⟦クラスモジュールリスト⟧,⟦self⟧,⟦省略時可視性⟧及び⟦局所変数束縛集合⟧の一番上の要素を取り除

くことによって,実行環境を復元する。

13.4.3  特異メソッド定義 

構文規則

《特異メソッド定義》 ::

  “def”  《特異オブジェクト》  (  “.”|“::”)  《メソッド定義名》  [《行終端子》禁止]

  《メソッド仮引数部》  《メソッド本体》  “end”

《特異オブジェクト》 ::

  《変数参照》

|“(”  《式》  “)”

意味規則

《特異メソッド定義》は次の手順で評価する。

a)  《特異オブジェクト》を評価する。評価結果の値を とする。が Numeric クラスのインスタンス又は

Symbol

クラスのインスタンスの場合,TypeError クラスの直接のインスタンスを例外として発生さ

せてもよい。

b)  が niltrue,又は false のいずれかの場合,を のクラスとし,手順 f)に進む。 
c)  が特異クラスに関連付けられていない場合,新たな特異クラスを作成する。その特異クラスを 

し,を第 1 関連オブジェクトとして と関連付ける。

d)  が第 1 関連オブジェクトとして特異クラスと関連付けられている場合,その特異クラスを とする。 
e)  が第 1 関連オブジェクトとしてではなく特異クラスと関連付けられていた場合は,と特異クラスと

の関連付けを削除し,新たな特異クラスを作成する。新しく作成した特異クラスを とし,を第 1

関連オブジェクトとして と関連付ける。

f)  を《メソッド定義名》とする。

g)  《特異メソッド定義》によって定義されるメソッド を作成する。は,13.3.1 で規定されるとおり,《特

異メソッド定義》の《メソッド仮引数部》及び《メソッド本体》をもつ。の属性を次のように初期化する。

−  クラスモジュールリスト属性を,⟦クラスモジュールリスト⟧の一番上の値とする。

−  定義名属性を とする。

−  可視性属性を,public とする。

h)  名前が である束縛が,のインスタンスメソッド束縛の集合内に存在する場合,その束縛の値を V

とする。

1)  が undef の場合,この《特異メソッド定義》の評価方法は処理系定義とする。 
2)  束縛の値を で置き換える。

i)

そうではない場合,名前が で,値が であるメソッド束縛を作成し,それを のインスタンスメソ

ッド束縛の集合に追加する。


104

X 3017

:2013 (ISO/IEC 30170:2012)

j)  《特異メソッド定義》の値は,処理系定義とする。

14  例外 
14.1  
概要 

Exception

クラスのインスタンスが例外として発生した場合,その時点の評価処理は停止し,この例

外を処理できるプログラム構成要素に制御が移る。

14.2  例外の発生要因 

例外は,次のいずれかの場合に発生する。

−  raise メソッドが呼び出された場合(15.3.1.2.12 参照)

−  この規格の様々な箇所で示されるような例外条件が発生した場合。

例外として発生させられるのは Exception クラスのインスタンスだけである。

14.3  例外の処理 

例外は,《本体文》,《rescue 修飾子付き代入》又は《rescue 修飾文》によって処理される。これらのプログ

ラム構成要素を,例外ハンドラと呼ぶ。例外ハンドラが例外を処理しているとき,その処理される例外を,

現在の例外と呼ぶ。

発生した例外は,例外ハンドラによって処理される。この例外ハンドラは,次のとおり決定する。

a)  例外が発生した地点を字句的に含み,かつ,《プログラム》,《メソッド定義》,《特異メソッド定義》又

は《ブロック》のいずれかに対応する局所変数のスコープのうち最内側のものを とする。

b)  の中にあって,例外が発生した地点を字句的に含む,全ての例外ハンドラについて,最内側から最

外側まで,次の調査を行う。

−  《rescue 修飾子付き代入》は,発生した例外が StandardError クラスのインスタンスであるとき,

その例外を処理できると判断する(11.4.2.5 参照)

。ただし,例外がその《演算子式》

2

内で発生した場

合は,《rescue 修飾子付き代入》はその例外を処理できると判断しない。

−  《rescue 修飾文》は,発生した例外が StandardError クラスのインスタンスであるとき,その例外

を処理できると判断する(12.7 参照)

。ただし,その例外が,《rescue 修飾文》の《rescue 修飾文の後

退文》内で発生した場合は,《rescue 修飾文》はその例外を処理できない。

−  《本体文》は,《本体文》の《rescue 節》のいずれかがその例外を処理できるとき,例外を処理できると

判断する(11.5.2.5 参照)

。ただし,例外が《本体文》の《rescue 節》の一つ,《else 節》,又は《ensure 節》

のいずれかの中で発生した場合は,《本体文》はその例外を処理できない。《本体文》中に《ensure 節》

が存在する場合,その《ensure 節》は,《本体文》が例外を処理できない場合であっても,評価が行わ

れる(11.5.2.5 参照)

c)  例外を処理できる例外ハンドラが 内に見つかった場合,例外ハンドラの探索を終了する。そして,

その例外ハンドラに関連するプログラム構成要素から,プログラムの評価を続ける[11.4.2.5  b)

11.5.2.5 d),及び 12.7 b)参照]。

d)  例外を処理できる例外ハンドラが 内に見つからない場合,次の手順を行う。

1)  が《メソッド定義》又は《特異メソッド定義》に対応する場合,13.3.3 の手順 h)又は手順 i)を終了し,

現在のメソッド呼出しの手順 j)を実行する(13.3.3 参照)

。そして,そのメソッドが呼び出された場

所でその例外が発生したものとして,手順 a)から探索を続ける。

2)  が《ブロック》に対応する場合,現在の《ブロック》の評価を終了し,11.3.3  f)を実行する。そして,

その《ブロック》が呼び出された場所でその例外が発生したものとして,手順 a)から探索を続ける。


105

X 3017

:2013 (ISO/IEC 30170:2012)

3)  が《プログラム》に対応する場合,その《プログラム》の評価を終了し,10.1 d)を実行してから,そ

の例外の情報を処理系定義の方法で出力する。

15  組込みクラス及び組込みモジュール 
15.1  
概要 

組込みクラス及び組込みモジュールは,プログラムの実行前にあらかじめ作成されるクラス及びモジュ

ールとする(7.2 参照)

図 は,これらのクラスとモジュールとを,クラス階層とインクルードされてい

るモジュールとの関係とともに示したものである。

組込みクラス及び組込みモジュールは,それぞれ 15.2 及び 15.3 で規定する。その規定は,次のような属

性(13.1.1 及び 13.2.1 参照)について記述することによって行う。

直接のスーパークラス(組込みクラスの場合だけ)。

インクルードモジュールリスト

定数

特異メソッド  すなわち,組込みクラス又は組込みモジュールの特異クラスのインスタンスメソッド。

組込みクラス又は組込みモジュールの特異メソッドのクラスモジュールリストは,次の二つの要素か

らなる。第 1 の要素は,その組込みクラス又は組込みモジュールの特異クラスであり,第 2 の要素は

Object

クラスである。

インスタンスメソッド  組込みクラス又は組込みモジュールのインスタンスメソッドのクラスモジュ

ールリスト(13.3.1 参照)は,次の二つの要素からなる。第 1 の要素は,その組込みクラス又は組込

みモジュール自身であり,第 2 の要素は Object クラスである。

組込みクラス又は組込みモジュールのクラス変数束縛の集合は空集合とする。

組込みクラス又は組込みモジュールは,プログラムテキスト上のクラス定義又はモジュール定義によっ

て作成するのではなく,15.2 又は 15.3 に記述された属性をもつクラス又はモジュールとして,プログラム

の実行前にあらかじめ作成する。

組込みクラス又は組込みモジュール(Object クラス自身も含む。

)ごとに定数を Object クラスの中に

定義する。その定数の名前はその組込みクラス又は組込みモジュールの名前に等しく,その定数の値はそ

のクラス又はモジュール自体とする。

規格適合処理系は,次の属性及び/又は値を追加提供してもよい。

−  この規格で定義されている,規定された初期値をもたない属性に対する特定の初期値。

−  定数,特異メソッド及び/又はインスタンスメソッド。

−  この規格で規定されているメソッドに対する,追加の省略可能仮引数又は配列仮引数。

−  組込みクラス又は組込みモジュールに対する,追加のインクルードモジュール。


106

X 3017

:2013 (ISO/IEC 30170:2012)

図 1−組込みクラス及び組込みモジュール

15.2 及び 15.3 では,次のような記法を使用する。

−  15.2 及び 15.3 のそれぞれの細分箇条(例えば,15.2.1)は,組込みクラス又は組込みモジュールを規

定する。その細分箇条の題名は,その組込みクラス又は組込みモジュールの名前とする。その名前は,

Kernel

Comparable

Enumerable

Objec

Module

Class

NilClass

Exception

TrueClass

FalseClass

Numeric

Integer

Float

String

Symbol

Array

Hash

Range

Regexp

MatchData

Proc

Struct

Time

IO

File

StandardError

ArgumentError

LocalJumpError

RangeError

RuntimeError

TypeError

ZeroDivisionError

NameErro

NoMethodError

IndexError

IOError

EOFError

SystemCallError

SyntaxError 
LoadError

ScriptError

direct superclass

included module


107

X 3017

:2013 (ISO/IEC 30170:2012)

Object

クラスの定数束縛の名前として使われる(15.2.1.4 参照)

−  Object クラス(15.2.1 参照)以外の組込みクラスは,その組込みクラスを規定する細分箇条の下位

階層にある“

直接のスーパークラス”という題名の細分箇条に記載されたクラスを,直接のスーパー

クラスとしてもつ。

−  組込みクラス又は組込みモジュールを規定する細分箇条の下位階層に“

インクルードモジュール”と

いう題名の細分箇条がある場合には,その組込みクラス又は組込みモジュールは,そこに記載された

モジュール群を,記載されている順にインクルード(13.1.3 参照)する。

−  “

特異メソッド”という題名の細分箇条の下位階層に,“C.m”という形式の題名の細分箇条がある場

合,それはクラス の特異メソッド を規定する。

−  “

インスタンスメソッド”という題名の細分箇条の下位階層に,“C#m”という形式の題名の細分箇条

がある場合,それはクラス のインスタンスメソッド を規定する。

−  メソッドの仮引数仕様は,《メソッド仮引数部》の形式で規定される(13.3.2 参照)

例 1  次の例は,メソッド sample の仮引数仕様を規定している。

sample(

arg1arg2opt=expr, *ary, &blk)

−  特異メソッド名の前には,接頭語として,クラス又はモジュールの名前及びピリオド(

“.”

)を付加

する。

例 2  次の例は,クラス SampleClass の特異メソッド sample の仮引数仕様を規定している。

SampleClass.sample(

arg1arg2opt=expr, *ary, &blk)

−  仮引数仕様に続き,メソッドの可視性及び動作を規定する。

可視性は,

可視性:”というラベルに続いて規定する。可視性は,public,protected 又は private の

いずれかである。

次に,

動作:”というラベルに続けて,メソッドの動作,すなわち,メソッドの《メソッド本体》

を評価するときの手順[13.3.3 i)参照]を規定する。

これらの手順において,メソッドの仮引数仕様に現れる仮引数の名前の参照は,同名の局所変数に

束縛されたオブジェクトを示す。

−  仮引数の名前及び説明に使用する変数の名前はイタリック字体で示す。

−  “を実引数として block を呼び出す”という表現は,Proc 仮引数 block に対応する《ブロック》を,X

を実引数として,11.3.3 のように呼び出すことをいう。

−  “を返す”という表現は,メソッドの《メソッド本体》の評価をその時点で終了し,をこの《メソッ

ド本体》の値とすることを示す。

−  “によって指定される名前”という表現は,次の手順の結果を示す。

a)  が Symbol クラスのインスタンスの場合,の名前とする。 
b)  が String クラスのインスタンスの場合,の内容(15.2.10.1 参照)とする。

c)  それ以外の場合,そのメソッドの動作は未規定とする。

15.2  組込みクラス 
15.2.1 Object 

15.2.1.1  概要 

Object

クラスは,他のクラスの暗黙の直接のスーパークラスとする。すなわち,クラス定義において

その直接のスーパークラスが指定されなかった場合に,Object クラスが直接のスーパークラスとなる


108

X 3017

:2013 (ISO/IEC 30170:2012)

13.2.2 参照)

全ての組込みクラス及び組込みモジュールは,Object クラスの定数を通じて参照することができる

15.2.1.4 参照)

15.2.1.2  直接のスーパークラス 

Object

クラスは,直接のスーパークラスをもたない。ただし,処理系定義の直接のスーパークラスを

もたせてもよい。

15.2.1.3  インクルードモジュール 

Object

クラスは,次のモジュールをインクルードする。

−  Kernel

15.2.1.4  定数 

Object

クラスには,次の定数が定義される。

STDIN:  処理系定義の,読込み可能な IO クラスのインスタンス。通常の入力を読み込むために使用

される。

STDOUT:処理系定義の,書込み可能な IO クラスのインスタンス。通常の出力を書き込むために使用

される。

STDERR:処理系定義の,書込み可能な IO クラスのインスタンス。診断出力を書き込むために使用さ

れる。

注記  これらの定数の他に,組込みクラス及び組込みモジュールごとにその名前が Object クラスの

中に定数として定義される(15.1 参照)

15.2.1.5  インスタンスメソッド 
15.2.1.5.1 Object#initialize 

initialize(

*args)

可視性:private

動作:initialize メソッドは,既定のオブジェクト初期化メソッドであり,インスタンスが生成される

ときに呼び出される(13.2.4 参照)

。返却値は処理系定義とする。

Object

クラスがクラス継承木の根でない場合,initialize メソッドは,Object クラスに定義する

代わりに,クラス継承木の根であるクラスに定義しなければならない。

15.2.2 Module 

15.2.2.1  概要 

全てのモジュールは,Module クラスのインスタンスとする。したがって,Module クラスで定義され

た動作は,全てのモジュールに共通となる。

Module

クラスのインスタンス間の 2 項関係(A⊏ とする。

)を,次のうちのいずれかが成り立つこと

であると定義する。

−  がモジュールであって,が にインクルードされている(13.1.3 参照)

−  と とが共に Class クラスのインスタンスであって,が のスーパークラスである。

15.2.2.2  直接のスーパークラス 

Object

クラス

15.2.2.3  特異メソッド 
15.2.2.3.1 Module.constants 


109

X 3017

:2013 (ISO/IEC 30170:2012)

Module.constants

可視性:public

動作:

a)  Array クラスの空の直接のインスタンスを作り,それを とする。 
b)  現在のクラス又はモジュールを とする。⟦クラスモジュールリスト⟧の上から 2 番目の位置にあるリ

ストと同じ要素(最後の要素である Object クラスを除く。

)を含むリストを,とする。

の全てのスーパークラス(Object クラスを除く。)及び 自身からなる集合を,CS とする。た

だし,自身が Object クラスの場合には,Object クラスも CS に含まれる。CS に含まれる全ての

クラスのインクルードモジュールリストに含まれる全てのモジュールからなる集合を,

MS とする。L

CS 及び MS の和集合を,CM とする。

c)  CM 内のクラス又はモジュールのそれぞれ(それを とする。)に対して,更に,その の中に定義さ

れている定数の名前のそれぞれ(それを とする。

)に対して,次の手順を行う。

1)  内容が である新しく作った String クラスの直接のインスタンス,又は,名前が である Symbol

クラスの直接のインスタンスのいずれかを,とする。ただし,の値としてどちらを選ぶかは,処

理系定義とする。

2)  次の場合を除き,を に挿入する(が挿入される位置は処理系定義とする。)。すなわち,

Symbol

クラスのインスタンスであって,かつ,が と同じ名前の Symbol クラスのインスタン

スを要素にもつ場合,又は,が String クラスのインスタンスであって,かつ,が と同じ内

容の String クラスのインスタンスを要素にもつ場合は,追加しない。

d)  を返す。 
15.2.2.3.2 Module.nesting 

Module.nesting

可視性:public

動作:⟦クラスモジュールリスト⟧の上から 2 番目の要素であるリストの,最後の要素以外の要素を同じ順

序で含む新しく作った Array クラスの直接のインスタンスを返す。

15.2.2.4  インスタンスメソッド 
15.2.2.4.1 Module#<=> 

<=>(

other)

可視性:public

動作:を other とする。をレシーバとする。

a)  が Module クラスのインスタンスでない場合,nil を返す。 
b)  及び が同じオブジェクトの場合,値が 0 の Integer クラスのインスタンスを返す。

c)  R⊏ の場合,値が−1 の Integer クラスのインスタンスを返す。 
d)  A⊏ の場合,値が 1 の Integer クラスのインスタンスを返す。 
e)  それ以外の場合,nil を返す。

15.2.2.4.2 Module#< 

<(

other)

可視性:public

動作:を other とする。をレシーバとする。


110

X 3017

:2013 (ISO/IEC 30170:2012)

a)  が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外と

して発生させる。

b)  及び が同じオブジェクトの場合,false を返す。 
c)  R⊏ の場合,true を返す。 
d)  A⊏ の場合,false を返す。

e)  それ以外の場合,nil を返す。 
15.2.2.4.3 Module#<= 

<=(

other)

可視性:public

動作:

a)  other 及びレシーバが同じオブジェクトの場合,true を返す。 
b)  そうではない場合,“<”  メソッド(15.2.2.4.2 参照)と同様の動作を行う。

15.2.2.4.4 Module#> 

>(

other)

可視性:public

動作:を other とする。をレシーバとする。

a)  が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外と

して発生させる。

b)  及び が同じオブジェクトの場合,false を返す。

c)  R⊏ の場合,false を返す。 
d)  A⊏ の場合,true を返す。 
e)  それ以外の場合,nil を返す。

15.2.2.4.5 Module#>= 

>=(

other)

可視性:public

動作:

a)  other 及びレシーバが同じオブジェクトである場合,true を返す。 
b)  そうではない場合,“>”  メソッド(15.2.2.4.4 参照)と同様の動作を行う。 
15.2.2.4.6 Module#== 

==(

other)

可視性:public

動作:Kernel モジュールの  “==”  メソッドと同じとする(15.3.1.3.1 参照)。

15.2.2.4.7 Module#=== 

===(

object)

可視性:public

動作:Kernel モジュールの kind_of?メソッド(15.3.1.3.26 参照)を,object に対し,レシーバを実引数

として呼び出し,呼出し結果の値を返す。

15.2.2.4.8 Module#alias_method 

alias_method(

new_name, aliased_name)


111

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:private

動作:をレシーバとする。

a)  new_name によって指定される名前を,とする。aliased_name によって指定される名前を,とする。 
b)  13.3.6 の手順 d)から手順 h)までを行う。ここで,13.3.6 の A及び は,上記の手順の A及び N

とする。

c)  を返す。 
15.2.2.4.9 Module#ancestors 

ancestors

可視性:public

動作:

a)  Array クラスの空の直接のインスタンス を作る。 
b)  をレシーバとする。

c)  が特異クラスである場合,このメソッドの動作は処理系定義とする。 
d)  そうではない場合,を の末尾に追加する。 
e)  のインクルードモジュールリストのそれぞれの要素を,リスト内と逆順に の末尾に追加する。

f)  が直接のスーパークラスをもつ場合,の直接のスーパークラスを新たに とし,手順 c)から繰り

返す。

g)  を返す。

15.2.2.4.10 Module#append_features 

append_features(

module)

可視性:private

動作:レシーバ及び module のそれぞれのインクルードモジュールリストを,L

1

及び L

2

とする。

a)  module 及びレシーバが同じオブジェクトの場合,このメソッドの動作は未規定とする。 
b)  レシーバが L

2

の要素の場合,このメソッドの動作は処理系定義とする。

c)  そうではない場合,L

1

のそれぞれのモジュール について,リスト内と同順に,次の手順を行う。

1)  及び module が同じオブジェクトの場合,このメソッドの動作は未規定とする。 
2)  が L

2

に含まれていない場合,を L

2

の末尾に追加する。

d)  レシーバを L

2

の末尾に追加する。

e)  処理系定義の値を返す。 
15.2.2.4.11 Module#attr 

attr(

name)

可視性:private

動作:Module クラスの attr_reader メソッド(15.2.2.4.13 参照)をレシーバに対し name を実引数とし

て呼び出し,呼出し結果の値を返す。

15.2.2.4.12 Module#attr_accessor 

attr_accessor(*

name_list)

可視性:private

動作:をレシーバとする。

a)  name_list のそれぞれの要素 に対し,次の手順を行う。


112

X 3017

:2013 (ISO/IEC 30170:2012)

1)  によって指定される名前を とする。 
2)  が《局所変数識別子》又は《定数識別子》のいずれの形式でもない場合,を名前属性にもつ

NameError

クラスの直接のインスタンスを例外として発生させる。

3)  このメソッドが呼び出された位置で次のメソッド定義を評価するのと同様にして,にインスタン

スメソッドを定義する。次のメソッド定義内の  “N”  は であるとし,“@N”  は の前に  “@”  を加

えた名前であるとする。

def N

 @N

end

4)  このメソッドが呼び出された位置で次のメソッド定義を評価するのと同様にして,にインスタン

スメソッドを定義する。次のメソッド定義内の  “N=”  は の後に  “=”  を加えた名前であるとし,

“@N”  は の前に  “@”  を加えた名前であるとする。“val”  という名前は説明のためだけのものであ

り,仮引数名には任意のものを使用してよい。

def N=(val)

 @N=val

end

b)  処理系定義の値を返す。

15.2.2.4.13 Module#attr_reader 

attr_reader(*

name_list)

可視性:private

動作:Module クラスの attr_accessor メソッド(15.2.2.4.12 参照)と同じ手順[手順 a) 4)を除く。]

を行う。

15.2.2.4.14 Module#attr_writer 

attr_writer(*

name_list)

可視性:private

動作:Module クラスの attr_accessor メソッド(15.2.2.4.12 参照)と同じ手順[手順 a) 3)を除く。]

を行う。

15.2.2.4.15 Module#class_eval 

class_eval(

string=nil, &block)

可視性:public

動作:

a)  をレシーバとする。

b)  block が与えられている場合,次の手順を行う。

1)  string が与えられている場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

2)  block を,処理系定義の実引数とともに,11.3.3 で規定されているように呼び出し,を呼出し結果

の値とする。規格適合処理系は,11.3.3  d)の直前に,実行環境を次のように変更しなければならな

い。

−  ⟦クラスモジュールリスト⟧の一番上のリストと同じ内容のリストを作り,その先頭に を追加す


113

X 3017

:2013 (ISO/IEC 30170:2012)

る。作ったリストを⟦クラスモジュールリスト⟧に積む。

−  レシーバを⟦self⟧に積む。

−  可視性 public を⟦省略時可視性⟧に積む。

規格適合処理系は,11.3.3 d)及び e)においては,上記の手順で⟦クラスモジュールリスト⟧の一番上

のリストの先頭に追加した を無視しなければならない。ただし,《メソッド定義》(13.3.1 参照)

alias 文》(13.3.6 参照),又は《undef 文》(13.3.7 参照)で現在のクラス又はモジュールを参照する

場合を除く。

3)  を返す。

c)  block が与えられていない場合,次の手順を行う。

1)  string が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
2)  このメソッドが呼び出される直前の実行環境を とする。

3)  を次のとおり変更する。

−  ⟦クラスモジュールリスト⟧の一番上のリストと同じ内容のリストを作り,その先頭に を追加す

る。作ったリストを⟦クラスモジュールリスト⟧に積む。

−  レシーバを⟦self⟧に積む。

−  可視性 public を⟦省略時可視性⟧に積む。

4)  string の内容を《プログラム》(10.1 参照)として構文解析する。これが失敗した場合,SyntaxError

クラスの直接のインスタンスを例外として発生させる。

5)  《プログラム》を実行環境 の下で評価し,評価結果の値を とする。 
6)  ⟦クラスモジュールリスト⟧,⟦self⟧及び⟦省略時可視性⟧の一番上の要素を取り除くことによって,実

行環境 を復元する。この処理は,c) 4)又は c) 5)で例外が発生したが,それが処理されなかった場

合であっても行う。

7)  を返す。

手順 c)  5)では,その《プログラム》に対応する局所変数のスコープは,9.2 d)  1)において,《ブロック》に

対応する局所変数のスコープとみなされる。

15.2.2.4.16 Module#class_variable_defined? 

class_variable_defined?(

symbol)

可視性:public

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。

b)  が《クラス変数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接

のインスタンスを例外として発生させる。

c)  11.5.4.5 の手順 b)から手順 d)までを実行することによって,名前が であるクラス変数束縛を探す。

ここで,11.5.4.5 の 及び はそれぞれ上記の手順の 及び とする。

d)  束縛が見つかった場合,true を返す。 
e)  そうではない場合,false を返す。

15.2.2.4.17 Module#class_variable_get 

class_variable_get(

symbol)

可視性:処理系定義


114

X 3017

:2013 (ISO/IEC 30170:2012)

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。

b)  が《クラス変数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接

のインスタンスを例外として発生させる。

c)  11.5.4.5 の b)から d)までを実行することによって,名前が であるクラス変数束縛を探す。ここで,

11.5.4.5 の 及び はそれぞれ上記の手順の 及び とする。

d)  束縛が見つかった場合,その束縛の値を返す。 
e)  そうではない場合,symbol を名前属性にもつ NameError クラスの直接のインスタンスを例外として

発生させる。

15.2.2.4.18 Module#class_variable_set 

class_variable_set(

symbol, obj)

可視性:処理系定義

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。 
b)  が《クラス変数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接

のインスタンスを例外として発生させる。

c)  11.5.4.5 の手順 b)から手順 d)までを実行することによって,名前が であるクラス変数束縛を探す。

ここで,11.5.4.5 の 及び はそれぞれ上記の手順の 及び とする。

d)  束縛が見つかった場合,その束縛の値を obj に置き換える。 
e)  そうではない場合,名前が であり値が obj である束縛を のクラス変数束縛の集合内に作る。 
f)  obj を返す。

15.2.2.4.19 Module#class_variables 

class_variables

可視性:public

動作:

a)  クラス変数の名前の空の集合を NS とする。 
b)  をレシーバとする。に定義されている全てのクラス変数の名前を NS に追加する。 
c)  のインクルードモジュールリストを とする。のそれぞれのモジュール に対し,に定義され

ている全てのクラス変数の名前を NS に追加する。

d)  が Class クラスのインスタンスの場合,次の手順を行う。

1)  が直接のスーパークラスをもたない場合は,手順 e)へ進む。

2)  の直接のスーパークラスを とする。 
3)  に定義されている全てのクラス変数の名前を NS に追加する。 
4)  のインクルードモジュールリストを とする。のそれぞれのモジュール に対して,に定義

されている全てのクラス変数の名前を NS に追加する。

5)  の直接のスーパークラスを とする。手順 d) 1)から処理を継続する。

e)  NS の全ての名前を要素にもつ Array クラスの新しい直接のインスタンス を返す。これらの名前は,

String

クラス又は Symbol クラスの直接のインスタンスとして表す。どちらのクラスを選ぶかは処

理系定義とする。また,の要素の順序も処理系定義とする。


115

X 3017

:2013 (ISO/IEC 30170:2012)

手順 c)及び d)を行うかどうかは処理系定義とする。

15.2.2.4.20 Module#const_defined? 

const_defined?(

symbol)

可視性:public

動作:

a)  をレシーバとする。

b)  symbol によって指定される名前を とする。 
c)  が《定数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接のイン

スタンスを例外として発生させる。

d)  の定数束縛の集合内に名前が である束縛が存在する場合,true を返す。 
e)  11.5.4.2 の手順 d)から,の定数束縛を探索する。ここで,11.5.4.2 の はこのメソッド呼出しのレシ

ーバであるとする。ただし,11.5.4.2 の手順 e) 1) i)又は手順 e) 2) iii)は行わずに探索を終了する。束縛

が見つかった場合,true を返す。

f)  false を返す。

手順 e)を行うかどうかは処理系定義とする。

15.2.2.4.21 Module#const_get 

const_get(

symbol)

可視性:public

動作:

a)  symbol によって指定される名前を とする。 
b)  が《定数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接のイン

スタンスを例外として発生させる。

c)  レシーバに対し,名前が である定数束縛を探す。 
d)  束縛が見つかった場合,その束縛の値を返す。 
e)  名前が である定数束縛の探索を,11.5.4.2 の手順 d)から行う。ここで,11.5.4.2 の はこのメソッド

呼出しのレシーバであるとする。

f)  束縛が見つかった場合,その束縛の値を返す。 
g)  そうではない場合,const_missing メソッドの呼出し結果の値を返す[11.5.4.2 e) 1) i)参照]。

15.2.2.4.22 Module#const_missing 

const_missing(

symbol)

可視性:public

動作:const_missing メソッドは,定数参照において定数束縛が見つからなかった場合に呼び出される

11.5.4.2 参照)

このメソッドが呼び出された場合,次の手順を行う。

a)  15.2.2.4.20 の手順 a)から手順 c)までを実行する。

b)  symbol を名前属性にもつ NameError クラスの直接のインスタンスを例外として発生させる。 
15.2.2.4.23 Module#const_set 

const_set(

symbol, obj)

可視性:public


116

X 3017

:2013 (ISO/IEC 30170:2012)

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。

b)  が《定数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接のイン

スタンスを例外として発生させる。

c)  の定数束縛の集合内に名前が である束縛が存在する場合,その束縛の値を obj に置き換える。

d)  そうではない場合,の定数束縛の集合内に名前が であり値が obj である束縛を作る。 
e)  obj を返す。 
15.2.2.4.24 Module#constants 

constants

可視性:public

動作:

a)  定数の名前の空の集合を NS とする。

b)  をレシーバとする。に定義されている全ての定数の名前を NS に追加する。 
c)  のインクルードモジュールリストを とする。のそれぞれのモジュール に対し,に定義され

ている全ての定数の名前を NS に追加する。

d)  が Class クラスのインスタンスの場合,次の手順を行う。

1)  が直接のスーパークラスをもたない場合,又は の直接のスーパークラスが Object クラスの場

合は,手順 e)へ進む。

2)  の直接のスーパークラスを とする。 
3)  に定義されている全ての定数の名前を NS に追加する。 
4)  のインクルードモジュールリストを とする。のそれぞれのモジュール に対して,に定義

されている全ての定数の名前を NS に追加する。

5)  の直接のスーパークラスを とする。手順 d) 1)から処理を継続する。

e)  NS の全ての名前を要素にもつ Array クラスの新しい直接のインスタンス を返す。これらの名前は,

String

クラス又は Symbol  クラスの直接のインスタンスとして表す。どちらのクラスを選ぶかは処

理系定義とする。また,の要素の順序も処理系定義とする。

15.2.2.4.25 Module# 

extend_object 

extend_object(

object)

可視性:private

動作:を object の特異クラスとする。append_features メソッド(15.2.2.4.10 参照)をレシーバに対

し を実引数として呼び出し,呼出し結果の値を返す。

15.2.2.4.26 Module#extended 

extended(

object)

可視性:private

動作:nil を返す。

注記  extended メソッドは,Kernel モジュールの extend メソッド(15.3.1.3.13 参照)の中で呼

び出される。extended メソッドは,extend メソッドの呼出しをフックするために上書きす

ることができる。

15.2.2.4.27 Module#include 


117

X 3017

:2013 (ISO/IEC 30170:2012)

include(*

module_list)

可視性:private

動作:をレシーバとする。

a)  module_list のそれぞれの要素 に対し,module_list 内と逆順に,次の手順を行う。

1)  が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外

として発生させる。

2)  が Class クラスのインスタンスの場合,TypeError クラスの直接のインスタンスを例外として

発生させる。

3)  に対し,を実引数として append_features メソッド(15.2.2.4.10 参照)を呼び出す。

4)  に対し,を実引数として included メソッド(15.2.2.4.29 参照)を呼び出す。

b)  を返す。 
15.2.2.4.28 Module#include? 

include?(

module)

可視性:public

動作:をレシーバとする。

a)  module が Module クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例

外として発生させる。

b)  module が のインクルードモジュールリストの要素の場合,true を返す。 
c)  そうではない場合で,が Class クラスのインスタンスであり,module が のいずれかのスーパー

クラスのインクルードモジュールリストの要素の場合,true を返す。

d)  それ以外の場合,false を返す。 
15.2.2.4.29 Module#included 

included(

module)

可視性:private

動作:nil を返す。

注記  included メソッドは,Module クラスの include メソッド(15.2.2.4.27 参照)の中で呼び出

される。included メソッドは,include メソッドの呼出しをフックするために上書きするこ

とができる。

15.2.2.4.30 Module#included_modules 

included_modules

可視性:public

動作:をレシーバとする。

a)  Array クラスの空の直接のインスタンス を作る。

b)  のインクルードモジュールリストのそれぞれの要素を,リスト内と逆順に,それぞれ の末尾に追

加する。

c)  が Class クラスのインスタンスで,が直接のスーパークラスをもつ場合,の直接のスーパーク

ラスを新たに とし,手順 b)から繰り返す。

d)  そうではない場合,を返す。 
15.2.2.4.31 Module#initialize 


118

X 3017

:2013 (ISO/IEC 30170:2012)

initialize(&

block)

可視性:private

動作:

a)  block が与えられている場合,Module クラスの class_eval メソッドの手順 b)を実行する(15.2.2.4.15

参照)

。ここで,15.2.2.4.15 の block はこのメソッドに渡された block とする。

b)  処理系定義の値を返す。

15.2.2.4.32 Module#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  Kernel モジュールのインスタンスメソッド initialize_copy を,レシーバに対し,original を実

引数として呼び出す。

b)  レシーバが特異クラスと関連付けられている場合,E

o

をその特異クラスとして次の処理を行う。

1)  特異クラス E

n

を作る。E

n

の直接のスーパークラスは,E

o

の直接のスーパークラスとする。

2)  E

o

のそれぞれの定数束縛 B

v1

について,同じ名前及び値をもつ変数束縛を E

n

の定数束縛の集合内に

作る。

3)  E

o

のそれぞれのクラス変数束縛 B

v2

について,同じ名前及び値をもつ変数束縛を E

n

のクラス変数束

縛の集合内に作る。

4)  E

o

のインスタンスメソッドのそれぞれの束縛 B

m

について,同じ名前及び値をもつメソッド束縛を

E

n

のインスタンスメソッド束縛の集合内に作る。

5)  レシーバと E

n

とを関連付ける。

c)  レシーバが Class クラスのインスタンスの場合,次の手順を行う。

1)  original が直接のスーパークラスをもつ場合,original の直接のスーパークラスをレシーバの直接の

スーパークラスとする。

2)  そうではない場合,このメソッドの動作は未規定とする。

d)  original のインクルードモジュールリストのそれぞれの要素を,リスト内と同順に,レシーバのインク

ルードモジュールリストの末尾にそれぞれ追加する。

e)  original のそれぞれの定数束縛 B

v3

について,同じ名前及び値をもつ変数束縛をレシーバの定数束縛の

集合内に作る。

f)  original のそれぞれのクラス変数束縛 B

v4

について,同じ名前及び値をもつ変数束縛をレシーバのクラ

ス変数束縛の集合内に作る。

g)  original のインスタンスメソッドのそれぞれの束縛 B

m2

について,同じ名前及び値をもつメソッド束縛

をレシーバのインスタンスメソッド束縛の集合内に作る。

h)  処理系定義の値を返す。

15.2.2.4.33 Module#instance_methods 

instance_methods(

include_super=true)

可視性:public

動作:をレシーバとする。

a)  Array クラスの空の直接のインスタンス を作る。


119

X 3017

:2013 (ISO/IEC 30170:2012)

b)  を のインスタンスメソッド束縛の集合とする。のそれぞれの束縛 に対し,を の名前,

の値として,次の手順を行う。

1)  が undef であるか,の可視性が private の場合,次の二つの手順は行わない。 
2)  内容が である新しく作った String クラスの直接のインスタンス又は名前が である Symbol

クラスの直接のインスタンスのいずれかを,とする。の値としてどちらを選ぶかは処理系定義と

する。

3)  を の末尾に追加する。ただし,が Symbol クラスのインスタンスであり が同じ名前の Symbol

クラスのインスタンスを要素にもつ場合,又は が String クラスのインスタンスであり が同じ

内容の String クラスのインスタンスを要素にもつ場合は追加しない。

c)  include_super が真の場合,次の手順を行う。

1)  のインクルードモジュールリストのそれぞれのモジュール に対し,手順 b)を行う。ここで,手

順 b)の は とする。

2)  が直接のスーパークラスをもたない場合,を返す。 
3)  の直接のスーパークラスを新たに とする。 
4)  手順 b)から繰り返す。

d)  を返す。 
15.2.2.4.34 Module#method_defined? 

method_defined?(

symbol)

可視性:public

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。

b)  名前が であるインスタンスメソッド束縛を,を起点として,13.3.4 で規定されているようにして

探す。

c)  束縛が見つかり,その値が undef でない場合,true を返す。

d)  そうではない場合,false を返す。 
15.2.2.4.35 Module#module_eval 

module_eval(

string=nil, &block)

可視性:public

動作:class_eval メソッドと同じとする(15.2.2.4.15 参照)。

15.2.2.4.36 Module#private 

private(*

symbol_list)

可視性:private

動作:public メソッドと同じとする(15.2.2.4.38 参照)。ただし,15.2.2.4.38 a)において,NV は private

とする。

15.2.2.4.37 Module#protected 

protected(*

symbol_list)

可視性:private

動作:public メソッドと同じとする(15.2.2.4.38 参照)。ただし,15.2.2.4.38 a)において,NV は protected

とする。


120

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.2.4.38 Module#public 

public(*

symbol_list)

可視性:private

動作:をレシーバとする。

a)  NV を public とする。 
b)  symbol_list の長さが 0 の場合,現在の可視性を NV に設定し,を返す。

c)  そうではない場合,symbol_list のそれぞれの要素 に対し,次の手順を行う。

1)  によって指定される名前を とする。 
2)  名前が であるメソッド束縛を,を起点として,13.3.4 で規定されているようにして探す。

3)  束縛が見つかり,その値が undef でない場合,をその束縛の値とする。 
4)  そうではない場合,を名前属性にもつ NameError クラスの直接のインスタンスを例外として発

生させる。

5)  束縛が 内に見つかった場合は,の可視性を NV に変更する。 
6)  そうではない場合,次のメソッド定義を評価することで,にインスタンスメソッドを定義する。

次のメソッド定義内の  “N”  は であるとする。“args”  という名前は説明のためだけのものであり,

仮引数名には任意のものを使用してよい。

def N(*args)

 super

end

上記のようにして作られるメソッドの属性は次のように初期化する。

i)

クラスモジュールリストは,⟦クラスモジュールリスト⟧の一番上の要素とする。

ii)  定義名は,の定義名と同じとする。 
iii)  可視性は,NV とする。

d)  を返す。

15.2.2.4.39 Module#remove_class_variable 

remove_class_variable(

symbol)

可視性:処理系定義

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。 
b)  が《クラス変数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接

のインスタンスを例外として発生させる。

c)  名前が である束縛が のクラス変数束縛の集合内に存在する場合,をその束縛の値とする。

1)  その束縛を のクラス変数束縛の集合から取り除く。 
2)  を返す。

d)  そうではない場合,symbol を名前属性にもつ NameError クラスの直接のインスタンスを例外として

発生させる。

15.2.2.4.40 Module#remove_const 

remove_const(

symbol)

可視性:private


121

X 3017

:2013 (ISO/IEC 30170:2012)

動作:をレシーバとする。

a)  symbol によって指定される名前を とする。

b)  が《定数識別子》という形式でない場合,symbol を名前属性にもつ NameError クラスの直接のイン

スタンスを例外として発生させる。

c)  名前が である束縛が の定数束縛の集合内に存在する場合,をその束縛の値とする。

1)  その束縛を の定数束縛の集合から取り除く。 
2)  を返す。

d)  そうではない場合,symbol を名前属性にもつ NameError クラスの直接のインスタンスを例外として

発生させる。

15.2.2.4.41 Module#remove_method 

remove_method(*

symbol_list)

可視性:private

動作:をレシーバとする。

a)  symbol_list のそれぞれの要素 に対し,リスト内と同順で,次の手順を行う。

1)  によって指定される名前を とする。

2)  名前が である束縛が のインスタンスメソッド束縛の集合内に存在し,かつ,その束縛の値が

undef でない場合,その束縛を取り除く。

3)  そうではない場合,を名前属性にもつ NameError クラスの直接のインスタンスを例外として発

生させる。この場合,symbol_list の残りの要素は処理しない。

b)  を返す。 
15.2.2.4.42 Module#undef_method 

undef_method(*

symbol_list)

可視性:private

動作:をレシーバとする。

a)  symbol_list のそれぞれの要素 に対し,リスト内と同順で,次の手順を行う。

1)  によって指定される名前を とする。 
2)  13.3.7 の手順 a)  3)及び手順 a)  4)を行う。ここで,13.3.7 の 及び はそれぞれ,上記の 及び N

とする。

b)  を返す。 
15.2.3 Class 

15.2.3.1  概要 

全てのクラスは,Class クラスのインスタンスとする。したがって,Class クラスで定義された動作は

全てのクラスに共通となる。

Class

クラスのインスタンスメソッド append_features 及び extend_object の定義は削除されて

いなければならない。これは,“append_features”  及び  “extend_object”  という名前の Symbol ク

ラスのインスタンスを実引数として,Class クラスに対し undef_method メソッド(15.2.2.4.42 参照)

を呼び出すことによって行う。

注記  インスタンスメソッド append_features 及び extend_object は,モジュールのためのメ

ソッドである。したがって,インスタンスがモジュールではなくクラスを表す Class クラスで


122

X 3017

:2013 (ISO/IEC 30170:2012)

は,これらのメソッドの定義が削除されている。

15.2.3.2  直接のスーパークラス 

Module

クラス

15.2.3.3  インスタンスメソッド 
15.2.3.3.1 Class#initialize 

initialize(

superclass=Object&block)

可視性:private

動作:

a)  レシーバが直接のスーパークラスをもつか,クラス継承木の根の場合,TypeError クラスの直接の

インスタンスを例外として発生させる。

b)  superclass が Class クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを

例外として発生させる。

c)  superclass が特異クラス又は Class クラスの場合,このメソッドの動作は未規定とする。 
d)  レシーバの直接のスーパークラスを superclass とする。 
e)  特異クラスを作り,レシーバと関連付ける。この特異クラスは,superclass の特異クラスをスーパーク

ラスの一つとしてもたなければならない。

f)  block が与えられている場合,Module クラスの class_eval メソッドの手順 b)を実行する(15.2.2.4.15

参照)

。ここで,15.2.2.4.15 の block はこのメソッドに渡された block とする。

g)  処理系定義の値を返す。 
15.2.3.3.2 Class#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  レシーバの直接のスーパークラスが既に設定されているか,レシーバがクラス継承木の根の場合,

TypeError

クラスの直接のインスタンスを例外として発生させる。

b)  レシーバが特異クラスの場合,TypeError クラスの直接のインスタンスを例外として発生させる。 
c)  レシーバに対し,Module クラスに定義されているインスタンスメソッド initialize_copy を,

original を実引数として呼び出す。

d)  処理系定義の値を返す。 
15.2.3.3.3 Class#new 

new(*

args, &block)

可視性:public

動作:

a)  レシーバが特異クラスの場合,TypeError クラスの直接のインスタンスを例外として発生させる。 
b)  インスタンス変数の束縛をもたないレシーバの直接のインスタンスを作り,とする。

c)  initialize メソッドを に対し args の全ての要素を実引数とし,block を《ブロック》として呼び出

す。

d)  を返す。

15.2.3.3.4 Class#superclass 


123

X 3017

:2013 (ISO/IEC 30170:2012)

superclass

可視性:public

動作:をレシーバとする。

a)  が特異クラスの場合,処理系定義の値を返す。 
b)  が直接のスーパークラスをもたない場合,nil を返す。 
c)  が直接のスーパークラスをもつ場合,それを返す。

15.2.4 NilClass 

15.2.4.1  概要 

NilClass

クラスは,nil を唯一のインスタンスとしてもつ(6.6 参照)

NilClass

クラスのインスタンスは,NilClass クラスの new メソッドによって作られてはならない。

したがって,NilClass クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)を,名

前が  “new”  である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,

NilClass

クラスの特異メソッド new の定義は削除されていなければならない。

15.2.4.2  直接のスーパークラス 

Object

クラス

15.2.4.3  インスタンスメソッド 
15.2.4.3.1 NilClass#& 

&(

other)

可視性:public

動作:false を返す。

15.2.4.3.2 NilClass#| 

|(

other)

可視性:public

動作:

a)  other が偽の場合,false を返す。 
b)  そうではない場合,true を返す。

15.2.4.3.3 NilClass#ˆ  

^(

other)

可視性:public

動作:

a)  other が偽の場合,false を返す。 
b)  そうではない場合,true を返す。 
15.2.4.3.4 NilClass#nil? 

nil?

可視性:public

動作:true を返す。

15.2.4.3.5 NilClass#to_s 

to_s

可視性:public


124

X 3017

:2013 (ISO/IEC 30170:2012)

動作:String クラスの空の直接のインスタンスを作って返す。

15.2.5 TrueClass 

15.2.5.1  概要 

TrueClass

クラスは,true を唯一のインスタンスとしてもつ(6.6 参照)

TrueClass

クラスのインスタンスは,TrueClass クラスの new メソッドによって作られてはならな

い。したがって,TrueClass クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)

を,名前が  “new”  である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,

TrueClass

クラスの特異メソッド new の定義は削除されていなければならない。

15.2.5.2  直接のスーパークラス 

Object

クラス

15.2.5.3  インスタンスメソッド 
15.2.5.3.1 TrueClass#& 

&(

other)

可視性:public

動作:

a)  other が偽の場合,false を返す。 
b)  そうではない場合,true を返す。 
15.2.5.3.2 TrueClass#| 

|(

other)

可視性:public

動作:true を返す。

15.2.5.3.3 TrueClass#ˆ  

^(

other)

可視性:public

動作:

a)  other が偽の場合,true を返す。

b)  そうではない場合,false を返す。 
15.2.5.3.4 TrueClass#to_s 

to_s

可視性:public

動作:内容が “true” であるような String クラスの直接のインスタンスを作って返す。

15.2.6 FalseClass 

15.2.6.1  概要 

FalseClass

クラスは,false を唯一のインスタンスとしてもつ(6.6 参照)

FalseClass

クラスのインスタンスは,FalseClass クラスの new メソッドによって作られてはなら

ない。したがって,FalseClass クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)

を,名前が  “new”  である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,

FalseClass

クラスの特異メソッド new の定義は削除されていなければならない。

15.2.6.2  直接のスーパークラス 


125

X 3017

:2013 (ISO/IEC 30170:2012)

Object

クラス

15.2.6.3  インスタンスメソッド 
15.2.6.3.1 FalseClass#& 

&(

other)

可視性:public

動作:false を返す。

15.2.6.3.2 FalseClass#| 

|(

other)

可視性:public

動作:

a)  other が偽の場合,false を返す。 
b)  そうではない場合,true を返す。 
15.2.6.3.3 FalseClass#ˆ  

^(

other)

可視性:public

動作:

a)  other が偽の場合,false を返す。

b)  そうではない場合,true を返す。 
15.2.6.3.4 FalseClass#to_s 

to_s

可視性:public

動作:内容が “false” であるような String クラスの直接のインスタンスを作って返す。

15.2.7 Numeric 

15.2.7.1  概要 

Numeric

クラスのインスタンスは数値を表す。Numeric クラスは,数値を表す,他の全ての組込みク

ラスのスーパークラスである。

“Numeric クラスのインスタンス の値”という表現は,が表現する数値のことを表す。

15.2.7.2  直接のスーパークラス 

Object

クラス

15.2.7.3  インクルードモジュール 

Numeric

クラスは,次のモジュールをインクルードする。

−  Comparable

15.2.7.4  インスタンスメソッド 
15.2.7.4.1 Numeric#+@ 

+@

可視性:public

動作:レシーバを返す。

15.2.7.4.2 Numeric#−@ 

-@


126

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:

a)  レシーバに対し,値が 0 である Integer クラスのインスタンスを実引数として coerce メソッドを

呼び出す。を呼出し結果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “-”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.7.4.3 Numeric#abs 

abs

可視性:public

動作:

a)  レシーバに対し,値が 0 の Integer クラスのインスタンスを実引数として  “<”  メソッドを呼び出す。 
b)  呼出し結果の値が真の場合,レシーバに対し  “-@”  メソッドを呼び出し,その結果の値を返す。

c)  そうではない場合,レシーバを返す。 
15.2.7.4.4 Numeric#coerce 

coerce(

other)

可視性:public

動作:

a)  レシーバ及び other のクラスが同一の場合,及び をそれぞれ other 及びレシーバとする。 
b)  そうではない場合,及び をそれぞれ,other 及びレシーバを次のようにして Float クラスのイン

スタンスに変換したものとする。

1)  を other 又はレシーバとする。 
2)  が Float クラスのインスタンスの場合,を とする。

3)  そうではない場合:

i)

に対し,名前が  “to_f”  である Symbol クラスの直接のインスタンスを実引数として

respond_to?

メソッドを呼び出した結果が偽の場合,TypeError クラスの直接のインスタンス

を例外として発生させる。

ii)  に対し to_f メソッドを実引数なしで呼び出し,をその結果の値とする。 
iii)  が Float クラスのインスタンスでない場合,TypeError クラスの直接のインスタンスを例外

として発生させる。

4)  の値が NaN の場合,このメソッドの動作は未規定とする。 
5)  の変換結果は である。

c)  要素を二つ含み,最初の要素が X,最後の要素が である Array クラスの直接のインスタンスを作る。 
d)  作った Array クラスのインスタンスを返す。 
15.2.8 Integer 

15.2.8.1  概要 

Integer

クラスのインスタンスは整数を表す。その整数の範囲は無制限とする。ただし,実際にどのよ


127

X 3017

:2013 (ISO/IEC 30170:2012)

うな値が計算可能であるかは,リソースの制限次第であり,処理系定義とする。また,実際にリソースの

制限を超えた場合の動作も処理系定義とする。

Integer

クラスのインスタンスは,Integer クラスの new メソッドによって作られてはならない。し

たがって,Integer クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)を,名前

が  “new”  である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,Integer

クラスの特異メソッド new の定義は削除されていなければならない。

Integer

クラスのサブクラス群を組込みクラスとして定義してもよい。この場合,次の条件に従わなけ

ればならない。

−  Integer クラスは,その直接のインスタンスをもってはならない。Integer クラスの直接のインス

タンスの代わりに,Integer クラスのサブクラスの直接のインスタンスを作成しなければならない。

−  Integer クラスのインスタンスメソッドは,Integer クラス自身に定義しなくてもよい。ただし,

その場合,Integer クラスの全てのサブクラスにそれらのインスタンスメソッドが定義されていなけ

ればならない。

−  Integer クラスのそれぞれのサブクラスについては,そのインスタンスの値の範囲に制限があっても

よい。

15.2.8.2  直接のスーパークラス 

Numeric

クラス

15.2.8.3  インスタンスメソッド 
15.2.8.3.1 Integer#<=> 

<=>(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスの場合,次の手順を行う。

1)  レシーバの値が other の値より大きい場合,値が 1 である Integer クラスのインスタンスを返す。

2)  レシーバの値と other の値とが等しい場合,値が 0 である Integer クラスのインスタンスを返す。 
3)  レシーバの値が other の値より小さい場合,値が−1 である Integer クラスのインスタンスを返す。

b)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “<=>”  メソッドを呼び出す。

ii)  呼出し結果の値が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定と

する。

iii)  呼出し結果の値が Integer クラスのインスタンスである場合,呼出し結果の値を返す。

2)  そうではない場合,nil を返す。

15.2.8.3.2 Integer#== 

==(

other)

可視性:public

動作:


128

X 3017

:2013 (ISO/IEC 30170:2012)

a)  other が Integer クラスのインスタンスの場合,次の手順を行う。

1)  レシーバの値と other の値とが等しい場合,true を返す。

2)  そうではない場合,false を返す。

b)  そうではない場合,other に対しレシーバを実引数として  “==”  メソッドを呼び出す。呼出し結果の値

を返す。

15.2.8.3.3 Integer#+ 

+(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスの場合,レシーバの値と other の値との和を値にもつ Integer

クラスのインスタンスを返す。

b)  other が Float クラスのインスタンスの場合,を浮動小数点数としてのレシーバの値とする。

と other の値との和を値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “+”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.8.3.4 Integer#− 

−(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスの場合,レシーバの値から other の値を引いたものを値にも

つ Integer クラスのインスタンスを返す。

b)  other が Float クラスのインスタンスの場合,を浮動小数点数としてのレシーバの値とする。

ら other の値を引いたものを値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “-”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.8.3.5 Integer#* 

*(

other)

可視性:public

動作:


129

X 3017

:2013 (ISO/IEC 30170:2012)

a)  other が Integer クラスのインスタンスの場合,レシーバの値と other の値との積を値にもつ Integer

クラスのインスタンスを返す。

b)  other が Float クラスのインスタンスの場合,を浮動小数点数としてのレシーバの値とする。 

と other の値との積を値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “*”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.8.3.6 Integer#/ 

/(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスの場合,次の手順を行う。

1)  other の値が 0 の場合,ZeroDivisionError クラスの直接のインスタンスを例外として発生させ

る。

2)  そうではない場合,レシーバの値を other の値で除したものを とし,以下の最大の整数を値にも

つ Integer クラスのインスタンスを返す。

注記  レシーバが負の値をもつ場合でも,この動作は同じである。例えば,-5/2 は-3 を返す。

b)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “/”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.8.3.7 Integer#% 

%(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスの場合,次の手順を行う。

1)  other の値が 0 の場合,ZeroDivisionError クラスの直接のインスタンスを例外として発生させ

る。

2)  そうではない場合,及び をそれぞれレシーバの値及び other の値とする。

i)

を で除した値以下の最大の整数を とする。

ii)  xt×を とする。 
iii)  値が である Integer クラスのインスタンスを返す。


130

X 3017

:2013 (ISO/IEC 30170:2012)

b)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “%”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.8.3.8 Integer#˜  

~

可視性:public

動作:その 2 の補数表現が,レシーバの 2 の補数表現の 1 の補数表現であるような,Integer クラスのイ

ンスタンスを返す。

15.2.8.3.9 Integer#& 

&(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が Integer クラスのインスタンスである場合,その 2 の補数表現が,レシーバの値の 2 の補数

表現と,other の値の 2 の補数表現との,ビットごとの論理積であるような,Integer クラスのイン

スタンスを返す。

15.2.8.3.10 Integer#| 

|(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が Integer クラスのインスタンスである場合,その 2 の補数表現が,レシーバの値の 2 の補数

表現と,other の値の 2 の補数表現との,ビットごとの論理和であるような,Integer クラスのイン

スタンスを返す。

15.2.8.3.11 Integer#ˆ  

^(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  other が Integer クラスのインスタンスである場合,その 2 の補数表現が,レシーバの値の 2 の補数

表現と,other の値の 2 の補数表現との,ビットごとの排他的論理和であるような,Integer クラス

のインスタンスを返す。

15.2.8.3.12 Integer#<< 

<<(

other)

可視性:public


131

X 3017

:2013 (ISO/IEC 30170:2012)

動作:

a)  other が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  other が Integer クラスのインスタンスである場合,及び をそれぞれレシーバの値及び other の値

とする。

c)  x×2

y

以下の最大の整数を値にもつ Integer クラスのインスタンスを返す。

15.2.8.3.13 Integer#>> 

>>(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が Integer クラスのインスタンスである場合,及び をそれぞれレシーバの値及び other の値

とする。

c)  x×2

y

以下の最大の整数を値にもつ Integer クラスのインスタンスを返す。

15.2.8.3.14 Integer#ceil 

ceil

可視性:public

動作:レシーバを返す。

15.2.8.3.15 Integer#downto 

downto(

num, &block)

可視性:public

動作:

a)  num が Integer クラスのインスタンスでないか,block が与えられていない場合,このメソッドの動

作は未規定とする。

b)  をレシーバの値とする。 
c)  が num の値より小さい場合,レシーバを返す。 
d)  値が である Integer クラスのインスタンスを実引数として block を呼び出す。

e)  を 1 だけ減らして手順 c)から繰り返す。 
15.2.8.3.16 Integer#eql? 

eql?(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンスでない場合,false を返す。 
b)  other が Integer クラスのインスタンスである場合,other に対しレシーバを実引数として  “==”  メソ

ッドを呼び出す。

c)  呼出し結果が真の場合,true を返す。そうではない場合,false を返す。 
15.2.8.3.17 Integer#floor 

floor

可視性:public

動作:レシーバを返す。


132

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.8.3.18 Integer#hash 

hash

可視性:public

動作:次の条件を満たす処理系定義の Integer クラスのインスタンスを返す。

a)  I

1

及び I

2

を Integer クラスのインスタンスとする。

b)  hash メソッドを I

1

及び I

2

に対し呼び出した結果の値をそれぞれ,H

1

及び H

2

とする。

c)  I

1

の値と I

2

の値とが等しい場合,H

1

の値と H

2

の値とは等しくなければならない。

15.2.8.3.19 Integer#next 

next

可視性:public

動作:レシーバの値に 1 を加えたものを値とする Integer クラスのインスタンスを返す。

15.2.8.3.20 Integer#round 

round

可視性:public

動作:レシーバを返す。

15.2.8.3.21 Integer#succ 

succ

可視性:public

動作:next メソッドと同じとする(15.2.8.3.19 参照)。

15.2.8.3.22 Integer#times 

times(&

block)

可視性:public

動作:

a)  block が与えられていない場合,このメソッドの動作は未規定とする。 
b)  を 0 とする。

c)  がレシーバの値以上の場合,レシーバを返す。 
d)  値が である Integer クラスのインスタンスを実引数として block を呼び出す。 
e)  を 1 だけ増やして手順 c)から繰り返す。

15.2.8.3.23 Integer#to_f 

to_f

可視性:public

動作:浮動小数点数としてのレシーバの値を値にもつ Float クラスの直接のインスタンスを返す。

15.2.8.3.24 Integer#to_i 

to_i

可視性:public

動作:レシーバを返す。

15.2.8.3.25 Integer#to_s 

to_s

可視性:public


133

X 3017

:2013 (ISO/IEC 30170:2012)

動作:次の条件を満たす内容をもつ String クラスの直接のインスタンスを返す。

−  レシーバの値が負の場合,最初の文字は,文字  “-”  とする。

−  残りの文字の並び は,レシーバの値の絶対値 を 10 進数で表現する。が 0 の場合,は  “0”  一

文字とする。そうではない場合,の最初の文字は  “0”  以外の文字とする。

例 1  123.to_s は  "123"  を返す。

例 2  -123.to_s は  "-123"  を返す。

15.2.8.3.26 Integer#truncate 

truncate

可視性:public

動作:レシーバを返す。

15.2.8.3.27 Integer#upto 

upto(

num, &block)

可視性:public

動作:

a)  num が Integer クラスのインスタンスでないか,block が与えられていない場合,このメソッドの動

作は未規定とする。

b)  をレシーバの値とする。 
c)  が num の値より大きい場合,レシーバを返す。 
d)  値が である Integer クラスのインスタンスを実引数として block を呼び出す。

e)  を 1 だけ増やして手順 c)から繰り返す。 
15.2.9 Float 

15.2.9.1  概要 

Float

クラスのインスタンスは,浮動小数点数を表す。

Float

クラスのインスタンスの値の精度は処理系定義とする。ただし,規格適合処理系が動作中のシス

テムが IEC 60559 に適合している場合は,Float クラスのインスタンスの表現は IEC 60559 の 3.2.2 に規

定された 64 ビット倍精度浮動小数点形式とする。

浮動小数点数を用いた演算の結果が Float クラスのインスタンスの表現できない値になった場合,

最も

近い表現できる値に結果が丸められる。二つの最も近い表現できる値が等しく近い場合,どちらを選ぶか

は処理系定義とする。

規格適合処理系が動作中のシステムが IEC 60559 に適合した浮動小数点数を提供している場合は,

Float

クラスのメソッドの実行中に,浮動小数点数を用いた演算の結果が NaN になった場合,そのメソ

ッドの動作は未規定とする。

Float

クラスのインスタンスは,Float クラスの new メソッドによって作られてはならない。したが

って,Float クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)を,名前が  “new”

である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,Float クラスの特異

メソッド new の定義は削除されていなければならない。

15.2.9.2  直接のスーパークラス 

Numeric

クラス

15.2.9.3  インスタンスメソッド 


134

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.9.3.1 Float#<=> 

<=>(

other)

可視性:public

動作:

a)  other が Integer クラスのインスタンス又は Float クラスのインスタンスの場合,次の手順を行う。

1)  をレシーバの値とする。other が Float クラスのインスタンスの場合,を other の値とする。そ

うではない場合,を浮動小数点数としての other の値とする。

2)  規格適合処理系が IEC 60559 に適合していて,又は が NaN の場合,処理系定義の値を返す。 
3)  a>の場合,値が 1 の Integer クラスのインスタンスを返す。

4)  a=の場合,値が 0 である Integer クラスのインスタンスを返す。 
5)  a<の場合,値が−1 である Integer クラスのインスタンスを返す。

b)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “<=>”  メソッドを呼び出す。

ii)  呼出し結果の値が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定と

する。

iii)  呼出し結果の値が Integer クラスのインスタンスである場合,呼出し結果の値を返す。

2)  そうではない場合,nil を返す。

15.2.9.3.2 Float#== 

==(

other)

可視性:public

動作:

a)  other が Float クラスのインスタンスの場合,次の手順を行う。

1)  規格適合処理系が IEC 60559 に適合していて,レシーバの値が NaN の場合,false を返す。 
2)  レシーバの値と other の値とが同じ数の場合,true を返す。 
3)  そうではない場合,false を返す。

b)  other が Integer クラスのインスタンスの場合,次の手順を行う。

1)  レシーバの値と other の値とが数学的に等しい場合,true を返す。 
2)  そうではない場合,false を返す。

c)  そうではない場合,other に対しレシーバを実引数として  “==”  メソッドを呼び出す。呼出し結果の値

を返す。

15.2.9.3.3 Float#+ 

+(

other)

可視性:public

動作:

a)  other が Float クラスのインスタンスの場合,レシーバの値と other の値との和を値にもつ Float ク

ラスの直接のインスタンスを返す。


135

X 3017

:2013 (ISO/IEC 30170:2012)

b)  other が Integer クラスのインスタンスの場合,を浮動小数点数としての other の値とする。 

とレシーバの値との和を値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスの 1 インスタンスの場合,及び をそれぞれ の最初及び最後

の要素とする。

i)

に対し,を実引数として  “+”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.9.3.4 Float#- 

-(

other)

可視性:public

動作:

a)  other が Float クラスのインスタンスの場合,レシーバの値から other の値を引いたものを値にもつ

Float

クラスの直接のインスタンスを返す。

b)  other が Integer クラスのインスタンスの場合,を浮動小数点数としての other の値とする。レシ

ーバの値から を引いたものを値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “-”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.9.3.5 Float#* 

*(

other)

可視性:public

動作:

a)  other が Float クラスのインスタンスの場合,レシーバの値と other の値との積を値にもつ Float ク

ラスの直接のインスタンスを返す。

b)  other が Integer クラスのインスタンスの場合,を浮動小数点数としての other の値とする。とレ

シーバの値との積を値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “*”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。


136

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.9.3.6 Float#/ 

/(

other)

可視性:public

動作:

a)  other が Float クラスのインスタンスの場合,other の値をレシーバの値で除したものを値にもつ

Float

クラスの直接のインスタンスを返す。

b)  other が Integer クラスのインスタンスの場合,を浮動小数点数としての other の値とする。 

レシーバの値を で除したものを値にもつ Float クラスの直接のインスタンスを返す。

c)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “/”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.9.3.7 Float#% 

%(

other)

可視性:public

動作:次の手順では,2 項演算子  “+”,“−”,及び  “×”  はそれぞれ,Float クラスのインスタンスメソ

ッド  “+”,“-”,及び  “*”  で使われている浮動小数点数演算である加算,減算,及び乗算を表す。演算子  “×”

は演算子  “+”  及び  “−”  より優先度が高いとする。

a)  other が Integer クラスのインスタンス又は Float クラスのインスタンスの場合,次の手順を行う。

をレシーバの値とする。

1)  other が Float クラスのインスタンスの場合,を other の値とする。other が Integer クラスのイ

ンスタンスの場合,を浮動小数点数としての other の値とする。

i)

を で除した値以下の最大の整数を とする。

ii)  xt×を とする。 
iii)  値が である Float クラスの直接のインスタンスを返す。

b)  そうではない場合,other に対しレシーバを実引数として coerce メソッドを呼び出す。を呼出し結

果の値とする。

1)  が要素を二つ含む Array クラスのインスタンスの場合,及び をそれぞれ の最初及び最後の

要素とする。

i)

に対し,を実引数として  “%”  メソッドを呼び出す。

ii)  呼出し結果の値を返す。

2)  そうではない場合,TypeError クラスの直接のインスタンスを例外として発生させる。

15.2.9.3.8 Float#ceil 

ceil

可視性:public

動作:レシーバの値以上の最小の整数を値とする Integer クラスのインスタンスを返す。


137

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.9.3.9 Float#finite? 

finite?

可視性:public

動作:

a)  レシーバの値が有限の数の場合,true を返す。 
b)  そうではない場合,false を返す。

15.2.9.3.10 Float#floor 

floor

可視性:public

動作:レシーバの値以下の最大の整数を値とする Integer クラスのインスタンスを返す。

15.2.9.3.11 Float#infinite? 

infinite?

可視性:public

動作:

a)  レシーバの値が正の無限大の場合,値が 1 の Integer クラスのインスタンスを返す。 
b)  レシーバの値が負の無限大の場合,値が−1 の Integer クラスのインスタンスを返す。 
c)  それ以外の場合,nil を返す。

15.2.9.3.12 Float#round 

round

可視性:public

動作:レシーバの値に最も近い整数を値とする Integer クラスのインスタンスを返す。レシーバとの距

離が等しい二つの整数が存在した場合は,絶対値の大きな方を値とする。

15.2.9.3.13 Float#to_f 

to_f

可視性:public

動作:レシーバを返す。

15.2.9.3.14 Float#to_i 

to_i

可視性:public

動作:レシーバの値の整数部分を値とする Integer クラスのインスタンスを返す。

15.2.9.3.15 Float#truncate 

truncate

可視性:public

動作:to_i メソッドと同じとする(15.2.9.3.14 参照)。

15.2.10 String 

15.2.10.1  概要 

String

クラスのインスタンスは文字の列を表す。ある String クラスのインスタンスの表す文字の並

びを,そのインスタンスの内容と呼ぶ。

文字を一つも含まない String クラスのインスタンスは空であるという。String クラスのインスタン


138

X 3017

:2013 (ISO/IEC 30170:2012)

スは,Class クラスの new メソッドの手順 b)によって作られたとき,空でなければならない。

“文字 を表す Object クラスのインスタンス”という表現は,次のいずれかを意味する。

−  値が の文字符号であるような Integer クラスのインスタンス。

−  内容が一つの文字 であるような String クラスのインスタンス。

規格適合処理系は,上記のうちどちらか一つの表現を選び,上記の表現が出現する箇所は全て選んだ方

の表現を用いなければならない。

String

クラスのインスタンスの文字は 0 から始まる添字をもつ。

“String クラスのインスタンスの n

番目の文字”という表現は,そのインスタンスの含む文字のうち,添字が であるものを指す。

15.2.10.2  直接のスーパークラス 

Object

クラス

15.2.10.3  インクルードモジュール 

String

クラスは,次のモジュールをインクルードする。

−  Comparable

15.2.10.4  大文字及び小文字 

String

クラスの幾つかのメソッドは,大文字及び小文字に対して処理を行う。大文字と小文字との対

応関係を

表 に示す。

表 3−大文字と小文字との対応関係

大文字 A B C D E

F G H  I  J

K

L

M N

O

P

Q

R

S

T U V W X

Y

Z

小文字 a b c d e

f g h i  j

k

l

m

n

o

p

q

r

s

t u v w x

y

z

15.2.10.5  インスタンスメソッド 
15.2.10.5.1 String#<=> 

<=>(

other)

可視性:public

動作:

a)  other が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  レシーバ及び other のそれぞれの内容を,S

1

及び S

2

とする。

c)  S

1

及び S

2

の両方が空の場合,値が 0 である Integer クラスのインスタンスを返す。

d)  そうではなく,S

1

が空の場合,値が−1 である Integer クラスのインスタンスを返す。

e)  そうではなく,S

2

が空の場合,値が 1 である Integer クラスのインスタンスを返す。

f)  S

1

及び S

2

のそれぞれの最初の文字の文字符号を,及び とする。

1)  a > の場合,値が 1 である Integer クラスのインスタンスを返す。

2)  a < の場合,値が−1 である Integer クラスのインスタンスを返す。 
3)  そうではない場合,S

1

及び S

2

をそれぞれ,S

1

及び S

2

からその最初の文字を除いたものに置き換え,

手順 c)から繰り返す。

15.2.10.5.2 String#== 

==(

other)

可視性:public

動作:


139

X 3017

:2013 (ISO/IEC 30170:2012)

a)  other が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が String クラスのインスタンスの場合,次の手順を行う。

1)  レシーバの内容と other の内容とが等しい場合,true を返す。 
2)  そうではない場合,false を返す。

15.2.10.5.3 String#=~ 

=~(

regexp)

可視性:public

動作:

a)  regexp が Regexp クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  regexp が Regexp クラスのインスタンスである場合,regexp に対し,レシーバを実引数として  “=~”  メ

ソッドを呼び出し,呼出し結果の値を返す(15.2.15.7.7 参照)

15.2.10.5.4 String#+ 

+(

other)

可視性:public

動作:

a)  other が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  レシーバ及び other のそれぞれの内容を,及び とする。 
c)  と とを連結したものを内容とする新しく作った String クラスの直接のインスタンスを返す。 
15.2.10.5.5 String#* 

*(

num)

可視性:public

動作:

a)  num が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  を num の値とする。 
c)  が 0 未満の場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。 
d)  そうではない場合,をレシーバの内容とする。

e)  内容が の 回の繰返しである String クラスの直接のインスタンス を作る。 
f)  を返す。 
15.2.10.5.6 String#[] 

[](*

args)

可視性:public

動作:

a)  args の長さが 0 であるか,2 より大きい場合,ArgumentError クラスの直接のインスタンスを例外

として発生させる。

b)  を args の最初の要素とする。をレシーバの長さとする。 
c)  が Integer クラスのインスタンスの場合,を の値とする。

1)  args の長さが 1 の場合,次の手順を行う。

i)

が 0 未満の場合,を だけ増加させる。がまだ 0 未満の場合,nil を返す。

ii)  b  ≧  の場合,nil を返す。


140

X 3017

:2013 (ISO/IEC 30170:2012)

iii)  レシーバの 番目の文字を表す新しく作った Object クラスのインスタンスを返す。

2)  args の長さが 2 の場合,次の手順を行う。

i)

args の最後の要素が Integer クラスのインスタンスの場合,をそのインスタンスの値とする。

そうではない場合,このメソッドの動作は未規定とする。

ii)  が 0 未満であるか,が より大きい場合,nil を返す。

iii)  が 0 未満の場合,を だけ増加させる。がまだ 0 未満の場合,nil を返す。 
iv)  bが より大きい場合,を新たに nとする。 
v)  が 0 以下の場合,String クラスの空の直接のインスタンスを作って返す。

vi)  そうではない場合,レシーバの 番目から 個の文字を,同じ順序で保持する String クラスの

直接のインスタンスを作って返す。

d)  が Regexp クラスのインスタンスの場合,次の手順を行う。

1)  args の長さが 1 の場合,を 0 とする。 
2)  args の長さが 2 であり,args の最後の要素が Integer クラスのインスタンスの場合,をそのイン

スタンスの値とする。そうではない場合,このメソッドの動作は未規定とする。

3)  レシーバの内容に対して,のパターン属性とのマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。M

をマッチ処理の結果とする。

4)  が nil の場合,nil を返す。

5)  が のマッチ結果属性の長さより大きい場合,nil を返す。 
6)  が 0 未満の場合,を のマッチ結果属性の長さだけ増加させる。がまだ 0 以下の場合,nil を返

す。

7)  を のマッチ結果属性の 番目の要素とする。の部分文字列を内容にもつ String クラスの直

接のインスタンスを作って返す。

e)  が String クラスのインスタンスの場合,次の手順を行う。

1)  args の長さが 2 の場合,このメソッドの動作は未規定とする。 
2)  レシーバが の内容を部分的に含む場合,と同じ内容をもつ String クラスの直接のインスタン

スを作って返す。

3)  そうではない場合,nil を返す。

f)  そうではない場合,このメソッドの動作は未規定とする。 
15.2.10.5.7 String#capitalize 

capitalize

可視性:public

動作:次の場合を除き,レシーバと同じ内容をもつ新しく作った String クラスの直接のインスタンスを

返す。

−  レシーバの最初の文字が小文字の場合,その文字に対応する大文字をこのメソッドが返すインスタン

スの内容の最初の文字とする。

−  レシーバの 番目の文字(ただし i  >  0 とする。

)が大文字の場合,その文字に対応する小文字をこ

のメソッドが返すインスタンスの内容の 番目の文字とする。

15.2.10.5.8 String#capitalize! 

capitalize!


141

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:

a)  レシーバに対し capitalize メソッドを呼び出した際に返る String クラスのインスタンスの内容

を,とする。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.9 String#chomp 

chomp(

rs="\n")

可視性:public

動作:

a)  rs が nil の場合,レシーバと同じ内容をもつ新しく作った String クラスの直接のインスタンスを返

す。

b)  レシーバが空の場合,新しく作った String クラスの空の直接のインスタンスを返す。 
c)  rs が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
d)  rs が String クラスのインスタンスである場合,レシーバと同じ内容をもつ新しく作った String ク

ラスの直接のインスタンスを返す。ただし,次の場合は除く。

1)  rs の内容が文字 0x0a だけであり,レシーバの末尾が《行終端子》の場合,その《行終端子》は除く。 
2)  rs が空であり,レシーバの末尾が一つ以上の《行終端子》の並びの場合,それらの《行終端子》は除く。

3)  そうではない場合で,レシーバの末尾が rs の内容である文字列に等しい場合,それらの文字は除く。

15.2.10.5.10 String#chomp! 

chomp!(

rs="\n")

可視性:public

動作:

a)  レシーバに対し chomp メソッドを rs を実引数として呼び出した際に返る String クラスのインスタ

ンスの内容を,とする。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.11 String#chop 

chop

可視性:public

動作:

a)  レシーバが空の場合,新しく作った String クラスの空の直接のインスタンスを返す。

b)  そうではない場合,レシーバの内容の最後の文字以外を内容としてもつ新しく作った String クラス

の直接のインスタンスを作って返す。ただし,レシーバの最後の文字が 0x0a であり,その 0x0a の直

前の文字が 0x0d の場合,その 0x0d も除く。

15.2.10.5.12 String#chop! 

chop!

可視性:public

動作:


142

X 3017

:2013 (ISO/IEC 30170:2012)

a)  レシーバに対し chop メソッドを呼び出した際に返る String クラスのインスタンスの内容を,

する。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.13 String#downcase 

downcase

可視性:public

動作:レシーバの内容の全てを含み,その中の全ての大文字を対応する小文字に置き換えたものを内容と

する新しく作った String クラスの直接のインスタンスを返す。

15.2.10.5.14 String#downcase! 

downcase!

可視性:public

動作:

a)  レシーバに対し downcase メソッドを呼び出した際に返る String クラスのインスタンスの内容を,

とする。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.15 String#each_line 

each_line(&

block)

可視性:public

動作:をレシーバの内容とする。を の最初の文字とする。

a)  block が与えられていない場合,このメソッドの動作は未規定とする。 
b)  中の,以降の最初の 0x0a を探す。このような 0x0a が存在する場合,次の手順を行う。

1)  をその 0x0a とする。 
2)  から までの文字列を内容とする String クラスの直接のインスタンス を作る。 
3)  block を,を実引数として呼び出す。

4)  が の最後の文字の場合,レシーバを返す。そうではない場合,を新たに の直後の文字とし手

順 b)から繰り返す。

c)  このような 0x0a が存在しない場合,から の最後の文字までの文字列を内容とする String クラス

の直接のインスタンスを作り,それを実引数として block を呼び出す。

d)  レシーバを返す。 
15.2.10.5.16 String#empty? 

empty?

可視性:public

動作:

a)  レシーバが空の場合,true を返す。

b)  そうではない場合,false を返す。 
15.2.10.5.17 String#eql? 

eql?(

other)


143

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:

a)  other が String クラスのインスタンスの場合,次の手順を行う。

1)  レシーバの内容と other の内容とが等しい場合,true を返す。 
2)  そうではない場合,false を返す。

b)  other が String クラスのインスタンスでない場合,false を返す。 
15.2.10.5.18 String#gsub 

gsub(*

args, &block)

可視性:public

動作:

a)  args の長さが 0 であるか 2 より大きい場合,又は args の長さが 1 で block が与えられていない場合は,

ArgumentError

クラスの直接のインスタンスを例外として発生させる。

b)  を args の最初の要素とする。が Regexp クラスのインスタンスでない場合,又は,args の長さが

2 であって args の最後の要素が String クラスのインスタンスでない場合,このメソッドの動作は未

規定とする。

c)  をレシーバの内容とし,を の長さとする。 
d)  を空のリストとし,を 0 とする。 
e)  に対し,添字 の位置から,のパターン属性とのマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。

をマッチ処理の結果とする。

f)  が nil の場合,の末尾に,の 番目から最後までの文字の列を追加する。 
g)  そうではない場合,次の手順を行う。

1)  args の長さが 1 の場合,次の手順を行う。

i)

のマッチする部分文字列を内容とする新しく作った String クラスの直接のインスタンスを実

引数として block を呼び出す。

ii)  を呼出し結果の値とする。が String クラスのインスタンスでない場合,このメソッドの動

作は未規定とする。

2)  のマッチ前(15.2.16.1 参照)を pre とする。が pre の最後の文字の添字より大きくない場合,pre

の 番目から最後までの文字列を の末尾に追加する。

3)  args の長さが 1 の場合,の内容を の末尾に追加する。args の長さが 2 の場合,args の最後の要

素の内容を の末尾に追加する。

4)  のマッチ後(15.2.16.1 参照)を post とする。post の最初の文字の 内の添字を,とする。

i)

が と等しい,すなわち が空文字列にマッチする場合,次の手順を行う。

I)  の 番目の文字だけを内容とする新しく作った String クラスの直接のインスタンスを,

末尾に追加する。

II)  を 1 だけ増加させる。

ii)  そうではない場合,の値を で置き換える。

5)  n  <  の場合,手順 e)から繰り返す。

h)  の全ての要素を連結したものを内容とする String クラスの直接のインスタンスを作って返す。 
15.2.10.5.19 String#gsub! 


144

X 3017

:2013 (ISO/IEC 30170:2012)

gsub!(*

args, &block)

可視性:public

動作:

a)  レシーバに対し gsub メソッドを呼び出した際に返る String クラスのインスタンスの内容を,

する。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.20 String#hash 

hash

可視性:public

動作:次の条件を満たすような処理系定義の値をもつ Integer クラスのインスタンスを返す。

a)  異なる二つの String クラスのインスタンスを,S

1

及び S

2

とする。

b)  S

1

及び S

2

に対し hash メソッドを呼び出した結果の値をそれぞれ,H

1

及び H

2

とする。

c)  S

1

と S

2

とが同じ内容をもつ場合,H

1

の値と H

2

の値とが等しくなければならない。

15.2.10.5.21 String#include? 

include?(

obj)

可視性:public

動作:

a)  obj が Integer クラスのインスタンスの場合,次の手順を行う。

文字符号が obj の値に等しい文字をレシーバが含んでいる場合,true を返す。そうではない場合,

false を返す。

b)  obj が String クラスのインスタンスの場合,次の手順を行う。

レシーバが obj の内容を部分文字列として含む場合,true を返す。そうではない場合,false を返す。

c)  そうではない場合,このメソッドの動作は未規定とする。 
15.2.10.5.22 String#index 

index(

substring, offset=0)

可視性:public

動作:

a)  substring が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  及び をそれぞれレシーバ及び substring の内容とする。

c)  offset が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
d)  を offset の値とする。 
e)  が 0 以上の場合,を とする。

f)  そうではない場合,を の長さとして,を l+とする。 
g)  が 0 より小さい場合,nil を返す。 
h)  以上の添字をもつ一つ以上の位置に が の部分文字列として現れる場合,最初の位置の添字を値

とする Integer クラスのインスタンスを返す。

i)

そうではない場合,nil を返す。

15.2.10.5.23 String#initialize 


145

X 3017

:2013 (ISO/IEC 30170:2012)

initialize(

str="")

可視性:private

動作:

a)  str が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  そうではない場合,レシーバの内容を str の内容と同じ文字列で初期化する。 
c)  処理系定義の値を返す。

15.2.10.5.24 String#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  original が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  original が String クラスのインスタンスである場合,レシーバの内容を original の内容と同じ文字列

に変更する。

c)  処理系定義の値を返す。 
15.2.10.5.25 String#intern 

intern

可視性:public

動作:

a)  レシーバの長さが 0 であるか,レシーバが 0x00 を含む場合,このメソッドの動作は未規定とする。 
b)  そうではない場合,レシーバの内容を名前にもつ Symbol クラスの直接のインスタンスを返す。

15.2.10.5.26 String#length 

length

可視性:public

動作:レシーバの内容の文字数を値としてもつ Integer クラスのインスタンスを返す。

15.2.10.5.27 String#match 

match(

regexp)

可視性:public

動作:

a)  regexp が Regexp クラスのインスタンスの場合,を regexp とする。 
b)  そうではなく,regexp が String クラスのインスタンスの場合,new メソッドを Regexp クラスに対

し regexp を実引数として呼び出すことによって,Regexp クラスの直接のインスタンスを作る。

この Regexp クラスのインスタンスとする。

c)  それ以外の場合は,このメソッドの動作は未規定とする。 
d)  に対し,レシーバを実引数として match メソッドを呼び出す。

e)  呼び出した結果の値を返す。 
15.2.10.5.28 String#replace 

replace(

other)

可視性:public

動作:initialize_copy メソッドと同じとする(15.2.10.5.24 参照)。


146

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.10.5.29 String#reverse 

reverse

可視性:public

動作:レシーバの内容である文字の並びを逆順にしたものを内容とする新しく作った String クラスの直

接のインスタンスを返す。

15.2.10.5.30 String#reverse! 

reverse!

可視性:public

動作:

a)  レシーバに対し reverse メソッドを呼び出したときに返る String クラスのインスタンスの内容で,

レシーバの内容を置き換える。

b)  レシーバを返す。 
15.2.10.5.31 String#rindex 

rindex(

substring, offset=nil)

可視性:public

動作:

a)  substring が String クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  及び をそれぞれレシーバ及び substring の内容とする。 
c)  offset が与えられた場合,次の手順を行う。

1)  offset が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

2)  を offset の値とする。 
3)  が 0 以上の場合,を とする。 
4)  そうではない場合,を の長さとして,を lとする。

5)  が 0 より小さい場合,nil を返す。

d)  そうではない場合,を 0 とする。 
e)  以下の添字をもつ一つ以上の位置に が の部分文字列として現れる場合,最後の位置の添字を値

とする Integer クラスのインスタンスを返す。

f)  そうではない場合,nil を返す。 
15.2.10.5.32 String#scan 

scan(

reg, &block)

可視性:public

動作:

a)  reg が Regexp クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  block が与えられていない場合,Array クラスの空の直接のインスタンス を作る。 
c)  をレシーバの内容とし,を の長さとする。 
d)  を 0 とする。

e)  に対し,添字 の位置から,reg のパターン属性とのマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。

をマッチ処理の結果とする。

f)  が nil でない場合,次の手順を行う。


147

X 3017

:2013 (ISO/IEC 30170:2012)

1)  を のマッチ結果属性とする。 
2)  の長さが 1 の場合,のマッチする部分文字列を内容とする String クラスの直接のインスタン

ス を作る。

3)  の長さが 1 より大きい場合,次の手順を行う。

i)

Array

クラスの空の直接のインスタンス を作る。

ii)  の先頭以外のそれぞれの要素 についてリスト内と同順に,の部分文字列を内容とする新しく

作った String クラスの直接のインスタンスを の末尾に追加する。

4)  block が与えられている場合,block を を実引数として呼び出す。そうではない場合,を の末

尾に追加する。

5)  post を のマッチ後とする。を post の最初の文字の 内での添字とする。

i)

と とが等しい,すなわち reg が空文字列にマッチした場合,を 1 だけ増加させる。

ii)  そうではない場合,を新たに とする。

6)  n  <  の場合,手順 e)から繰り返す。

g)  block が与えられている場合,レシーバを返す。そうではない場合,を返す。

15.2.10.5.33 String#size 

size

可視性:public

動作:length メソッドと同じとする(15.2.10.5.26 参照)。

15.2.10.5.34 String#slice 

slice(*

args)

可視性:public

動作:“[]”  メソッドと同じとする(15.2.10.5.6 参照)。

15.2.10.5.35 String#split 

split(

sep)

可視性:public

動作:

a)  sep が Regexp クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  Array クラスの空の直接のインスタンス を作る。 
c)  をレシーバの内容とし,を の長さとする。

d)  sp 及び bp をそれぞれ 0 とし,was-empty を偽とする。 
e)  に対し,添字 sp の位置から,sep のパターン属性とのマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。

をマッチ処理の結果とする。

f)  が nil の場合,の末尾に,の sp 番目から最後までの文字の列を内容とする新しく作った String

クラスの直接のインスタンスを追加する。

g)  そうではない場合,次の手順を行う。

1)  のマッチする部分文字列が空の場合,次の手順を行う。

i)

was-empty が真の場合,の bp 番目の文字だけを内容とする新しく作った String クラスの直接

のインスタンスを の末尾に追加する。

ii)  そうではない場合,sp を 1 だけ増加させる。sp  <  の場合,was-empty を真とし手順 e)から繰り


148

X 3017

:2013 (ISO/IEC 30170:2012)

返す。

2)  そうではない場合,was-empty を偽とする。pre を のマッチ前とする。bp が pre の最後の文字の添

字より大きくない場合,pre の bp 番目から最後までの文字列を内容とする新しく作った String ク

ラスの直接のインスタンスを の末尾に追加する。

3)  を のマッチ結果属性とする。

4)  の長さが 1 より大きい場合,の先頭を除くそれぞれの要素 についてリスト内と同順で,次の

手順を行う。

i)

を の部分文字列とする。

ii)  が nil でない場合,を内容とする新しく作った String クラスの直接のインスタンスを の末

尾に追加する。

5)  post を のマッチ後とし,sp 及び bp をいずれも post の最初の文字の添字とする。

6)  sp  >  の場合,手順 e)から繰り返す。

h)  の末尾に幾つかの空の String クラスのインスタンスがある場合,それらのインスタンスを から

削除する。

i)

を返す。

15.2.10.5.36 String#sub 

sub(*

args, &block)

可視性:public

動作:

a)  args の長さが 1 であり block が与えられているか,又は args の長さが 2 の場合,次の手順を行う。

1)  args の最初の要素が Regexp クラスのインスタンスでない場合,このメソッドの動作は未規定とす

る。

2)  レシーバの内容に対し,args の最初の要素のパターン属性とのマッチを試みる(15.2.15.4 及び

15.2.15.5 参照)。をマッチ処理の結果とする。

3)  が nil の場合,レシーバと同じ内容をもつ String クラスの直接のインスタンスを作って返す。 
4)  そうではない場合,次の手順を行う。

i)

args の長さが 1 の場合,のマッチする部分文字列を内容とする新しく作った String クラスの

直接のインスタンスを実引数として block を呼び出す。を呼出し結果の値とする。が String

クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

ii)  args の長さが 2 の場合,を args の最後の要素とする。が String クラスのインスタンスでな

い場合,このメソッドの動作は未規定とする。

iii)  のマッチ前,の内容,及び のマッチ後を連結したものを内容とする String クラスの直接

のインスタンスを作って返す。

b)  そうではない場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。 
15.2.10.5.37 String#sub! 

sub!(*

args, &block)

可視性:public

動作:

a)  レシーバに対し sub メソッドを呼び出した際に返る String クラスのインスタンスの内容を,とす


149

X 3017

:2013 (ISO/IEC 30170:2012)

る。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.10.5.38 String#to_f 

to_f

可視性:public

動作:

a)  レシーバが空の場合,値が 0.0 の Float クラスの直接のインスタンスを返す。 
b)  レシーバが《浮動小数点数リテラル》である文字の並びから始まる場合,その《浮動小数点数リテラル》

と同じ値をもつ Float クラスの直接のインスタンスを返す(8.7.6.2 参照)

c)  レシーバが《前置子なし 10 進整数リテラル》である文字の並びから始まる場合,その《前置子なし 10

進整数リテラル》の浮動小数点数としての値を値にもつ Float クラスの直接のインスタンスを返す

8.7.6.2 参照)

d)  そうではない場合,処理系定義の値をもつ Float クラスの直接のインスタンスを返す。 
15.2.10.5.39 String#to_i 

to_i(

base=10)

可視性:public

動作:

a)  base の値が 2,8,10,又は 16 のいずれかである Integer クラスのインスタンスである場合,

base の値とする。そうではない場合,このメソッドの動作は未規定とする。

b)  レシーバが空の場合,値が 0 の Integer クラスのインスタンスを返す。 
c)  を 0 とする。レシーバの 番目の文字が《空白類》である間,を 1 だけ増加させ続ける。

d)  レシーバの 番目の文字が  “+”  又は  “-”  の場合,を 1 だけ増加させる。 
e)  レシーバの 番目の文字が  “0”  であり,次のいずれかの条件が成り立つ場合,を 2 だけ増加させる。

添字が i+1 であるレシーバ中の文字を とする。

−  が 2 であり,が  “b”  又は  “B”  である。

−  が 8 であり,が  “o”  又は  “O”  である。

−  が 10 であり,が  “d”  又は  “D”  である。

−  が 16 であり,が  “x”  又は  “X”  である。

f)  レシーバの 番目から始まる,次の文字の並びを,とする。

−  が 2 の場合,《2 進数字》及び  “_”。

−  が 8 の場合,《8 進数字》及び  “_”。

−  が 10 の場合,《10 進数字》及び  “_”。

−  が 16 の場合,《16 進数字》及び  “_”。

g)  の長さが 0 の場合,値が 0 の Integer クラスのインスタンスを返す。 
h)  が  “_”  から始まるか,連続した  “_”  を含む場合,このメソッドの動作は未規定とする。 
i)

を基数とし,“_”  を無視して を数値化したものを とする。

手順 d)で  “-”  が現れていた場合は,値が−n の Integer クラスのインスタンスを返す。

そうではない場合,値が の Integer クラスのインスタンスを返す。


150

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.10.5.40 String#to_s 

to_s

可視性:public

動作:

a)  レシーバが String クラスの直接のインスタンスの場合,レシーバを返す。 
b)  そうではない場合,レシーバと同じ内容をもつ新しく作った String クラスの直接のインスタンスを

作って返す。

15.2.10.5.41 String#to_sym 

to_sym

可視性:public

動作:intern メソッドと同じとする(15.2.10.5.25 参照)。

15.2.10.5.42 String#upcase 

upcase

可視性:public

動作:レシーバの内容の全てを含み,その中の全ての小文字を対応する大文字に置き換えたものを内容と

する新しく作った String クラスの直接のインスタンスを返す。

15.2.10.5.43 String#upcase! 

upcase!

可視性:public

動作:

a)  レシーバに対し upcase メソッドを呼び出した際に返る String クラスのインスタンスの内容を,s

とする。

b)  レシーバの内容と とが等しい場合,nil を返す。そうではない場合,レシーバの内容を に置き換え,

レシーバを返す。

15.2.11 Symbol 

15.2.11.1 

概要 

Symbol

クラスのインスタンスは名前を表す(8.7.6.6 参照)

。Symbol クラスのどの二つのインスタンス

も,同じ名前を表してはならない。

注記  したがって,Symbol クラスのインスタンスの等価性は Kernel モジュールの  “==”  メソッド

15.3.1.3.1 参照)によってテストされ, String クラスの  “==”  メソッド(15.2.10.5.2 参照)

によるよりも速いことが期待される。

Symbol

クラスのインスタンスは,Symbol クラスの new メソッドによって作られてはならない。した

がって,Symbol クラスの特異クラスに対し,undef_method メソッド(15.2.2.4.42 参照)を,名前が  “new”

である Symbol クラスの直接のインスタンスを実引数として呼び出すことによって,Symbol クラスの特

異メソッド new の定義は削除されていなければならない。

15.2.11.2 

直接のスーパークラス 

Object

クラス

15.2.11.3 

インスタンスメソッド 

15.2.11.3.1 Symbol#=== 


151

X 3017

:2013 (ISO/IEC 30170:2012)

===(

other)

可視性:public

動作:Kernel モジュールの  “==”  メソッドと同じとする(15.3.1.3.1 参照)。

15.2.11.3.2 Symbol#id2name 

id2name

可視性:public

動作:内容がレシーバの名前であるような String クラスの直接のインスタンスを作って返す。

15.2.11.3.3 Symbol#to_s 

to_s

可視性:public

動作:id2name メソッドと同じとする(15.2.11.3.2 参照)。

15.2.11.3.4 Symbol#to_sym 

to_sym

可視性:public

動作:レシーバを返す。

15.2.12 Array 

15.2.12.1  概要 

Array

クラスのインスタンスは,要素の個数が固定していない配列を表す。要素を一つももたない

Array

クラスのインスタンスは空であるという。Array クラスのインスタンスの要素の個数を,そのイン

スタンスの長さという。

Array

クラスのインスタンスは,Class クラスの new メソッドの手順 b)によって作られたとき,空で

なければならない。

Array

クラスのインスタンスの要素は 0 から始まる添字をもつ。

Array

クラスのインスタンス A に対し,末尾に追加,先頭に追加,及び削除の操作を次のように定義す

る。

末尾に追加:オブジェクト を の末尾に追加するとは,次のような動作とする。

−  を,の最後の要素の後に追加する。

−  あるオブジェクトを の末尾に追加すると,の長さは 1 だけ増加する。

先頭に追加:オブジェクト を の先頭に追加するとは,次のような動作とする。

−  を,の先頭の要素にする。の元の要素は,それぞれ 1 ずつ後ろに移動する。

−  あるオブジェクトを の先頭に追加すると,の長さは 1 だけ増加する。

削除:要素 を から削除するとは,次のような動作とする。

a)  を から取り除く。

b)  が の最後の要素でない場合,の より後の全ての要素を,それぞれ 1 ずつ前に移動する。

−  ある要素を から削除すると,の長さは 1 だけ減少する。

15.2.12.2  直接のスーパークラス 

Object

クラス

15.2.12.3  インクルードモジュール 

Array

クラスは,次のモジュールをインクルードする。


152

X 3017

:2013 (ISO/IEC 30170:2012)

−  Enumerable

15.2.12.4  特異メソッド 
15.2.12.4.1 Array.[] 

Array.[](*

items)

可視性:public

動作:items の要素を同じ順序で保持する Array クラスのインスタンスを作って返す。

15.2.12.5  インスタンスメソッド 
15.2.12.5.1 Array#+ 

+(

other)

可視性:public

動作:

a)  other が Array クラスのインスタンスの場合,を other とする。そうではない場合,このメソッドの

動作は未規定とする。

b)  Array クラスの空の直接のインスタンス を作る。 
c)  レシーバのそれぞれの要素を,添字順に,の末尾に追加する。次に,のそれぞれの要素を,添字

順に,の末尾に追加する。

d)  を返す。 
15.2.12.5.2 Array#* 

*(

num)

可視性:public

動作:

a)  num が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  num の値が 0 より小さい場合,ArgumentError クラスの直接のインスタンスを例外として発生させ

る。

c)  num の値が 0 の場合,Array クラスの空の直接のインスタンスを返す。 
d)  そうではない場合,Array クラスの直接のインスタンス を作り,次の手順を num 回繰り返す。

−  レシーバの全ての要素を,同じ順序で の末尾に追加する。

e)  を返す。 
15.2.12.5.3 Array#<< 

<<(

obj)

可視性:public

動作:obj をレシーバの末尾に追加し,レシーバを返す。

15.2.12.5.4 Array#[] 

[](*

args)

可視性:public

動作:

a)  をレシーバの長さとする。

b)  args の長さが 0 の場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。 
c)  args の長さが 1 の場合,次の手順を行う。


153

X 3017

:2013 (ISO/IEC 30170:2012)

1)  唯一の実引数が Integer クラスのインスタンスの場合,をその値とする。そうではない場合,こ

のメソッドの動作は未規定とする。

2)  k  <  0 の場合,を 増加させる。がまだ 0 より小さい場合,nil を返す。 
3)  k  ≧  の場合,nil を返す。 
4)  そうではない場合,レシーバの 番目の要素を返す。

d)  args の長さが 2 の場合,次の手順を行う。

1)  args の要素がいずれも Integer クラスのインスタンスの場合,と とをそれぞれ args の最初及び

最後の要素の値とする。そうではない場合,このメソッドの動作は未規定とする。

2)  b  <  0 の場合,を 増加させる。がまだ 0 より小さい場合,nil を返す。 
3)  b  >  又は l  <  0 の場合,nil を返す。 
4)  b  =  の場合,Array クラスの空の直接のインスタンスを作って返す。 
5)  l  >  nの場合,を新たに nとする。 
6)  Array クラスの空の直接のインスタンス を作る。レシーバの 番目から 個の要素を,同じ順序

で,の末尾に追加する。を返す。

e)  args の長さが 2 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

15.2.12.5.5 Array#[]= 

[]=(*

args)

可視性:public

動作:

a)  をレシーバの長さとする。

b)  args の長さが 2 より小さい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

c)  args の長さが 2 の場合,次の手順を行う。

1)  args の最初の要素が Integer クラスのインスタンスの場合,をその要素の値とし,を args の最

後の要素とする。そうではない場合,このメソッドの動作は未規定とする。

2)  k  <  0 の場合,を 増加させる。がまだ 0 より小さい場合,IndexError クラスの直接のイン

スタンスを例外として発生させる。

3)  k  <  の場合,レシーバの 番目の要素を に置き換える。 
4)  そうではない場合,レシーバの長さを k+1 に拡張する。レシーバの最後の要素は とする。k  >  n

の場合,添字が 以上 k−1 以下の要素は nil とする。

5)  を返す。

d)  args の長さが 3 の場合,このメソッドの動作は未規定とする。

e)  args の長さが 3 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

15.2.12.5.6 Array#clear 

clear

可視性:public

動作:レシーバの全ての要素を削除し,レシーバを返す。


154

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.12.5.7 Array#collect! 

collect!(&

block)

可視性:public

動作:

a)  block が与えられている場合,次の手順を行う。

1)  レシーバのそれぞれの要素について,添字順に,その要素を唯一の実引数として block を呼び出し,

レシーバのその要素を呼出し結果の値に置き換える。

2)  レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は未規定とする。

15.2.12.5.8 Array#concat 

concat(

other)

可視性:public

動作:

a)  other が Array クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が Array クラスのインスタンスである場合,other の全ての要素を,同じ順序でレシーバの末尾

に追加する。

c)  レシーバを返す。 
15.2.12.5.9 Array#delete_at 

delete_at(

index)

可視性:public

動作:

a)  index が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  index が Integer クラスのインスタンスである場合,を index の値とする。

c)  をレシーバの長さとする。 
d)  が 0 より小さい場合,を 増加させる。がまだ 0 より小さい場合,nil を返す。 
e)  が 以上の場合,nil を返す。

f)  そうではない場合,レシーバの 番目の要素を削除し,削除した要素を返す。 
15.2.12.5.10 Array#each 

each(&

block)

可視性:public

動作:

a)  block が与えられている場合,次の手順を行う。

1)  レシーバのそれぞれの要素について,添字順に,その要素を唯一の実引数として block を呼び出す。

2)  レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は未規定とする。 
15.2.12.5.11 Array#each_index 

each_index(&

block)

可視性:public

動作:


155

X 3017

:2013 (ISO/IEC 30170:2012)

a)  block が与えられている場合,次の手順を行う。

1)  レシーバのそれぞれの要素について,添字順に,その要素の添字を値とする Integer クラスのイ

ンスタンスを唯一の実引数として block を呼び出す。

2)  レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は未規定とする。

15.2.12.5.12 Array#empty? 

empty?

可視性:public

動作:

a)  レシーバが空の場合,true を返す。 
b)  そうではない場合,false を返す。 
15.2.12.5.13 Array#first 

first(*

args)

可視性:public

動作:

a)  args の長さが 0 の場合,次の手順を行う。

1)  レシーバが空の場合,nil を返す。 
2)  そうではない場合,レシーバの最初の要素を返す。

b)  args の長さが 1 の場合,次の手順を行う。

1)  唯一の実引数が Integer クラスのインスタンスである場合,をその実引数の値とする。そうでは

ない場合,このメソッドの動作は未規定とする。

2)  が 0 より小さい場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。

3)  そうではない場合,及びレシーバの長さのうちの小さい方を,とする。 
4)  レシーバの最初の 個の要素を同じ順序で保持する Array クラスのインスタンスを作って返す。

c)  args の長さが 1 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

15.2.12.5.14 Array#index 

index(

object=nil)

可視性:public

動作:

a)  object が与えられた場合,次の手順を行う。

1)  レシーバのそれぞれの要素 について,添字順に,次の手順を行う。

i)

に対して object を実引数として  “==”  メソッドを呼び出す。

ii)  呼出し結果の値が真の場合,の添字を値にもつ Integer クラスのインスタンスを返す。

2)  手順 a) 1) ii)で Integer クラスのインスタンスが返されなかった場合,nil を返す。

b)  そうではない場合,このメソッドの動作は未規定とする。 
15.2.12.5.15 Array#initialize 

initialize(

size=0, obj=nil&block)

可視性:private


156

X 3017

:2013 (ISO/IEC 30170:2012)

動作:

a)  size が Integer クラスのインスタンスである場合,を size の値とする。そうではない場合,このメ

ソッドの動作は未規定とする。

b)  が 0 未満の場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。 
c)  レシーバの全ての要素を削除する。

d)  が 0 の場合,処理系定義の値を返す。 
e)  が 0 より大きい場合,次の手順を行う。

1)  block が与えられている場合,次の手順を行う。

i)

を 0 とする。

ii)  を値とする Integer クラスのインスタンスを唯一の実引数として block を呼び出す。呼出し結

果の値をレシーバの末尾に追加する。

iii)  を 1 増加させる。が に等しくなった場合,この処理を終了させる。そうではない場合,手順

e) 1) ii)から繰り返す。

2)  そうではない場合,obj をレシーバの末尾に 回追加する。

3)  処理系定義の値を返す。

15.2.12.5.16 Array#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  original が Array クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  レシーバの全ての要素を削除する。

c)  original の全ての要素を,同じ順序でレシーバの末尾に追加する。 
d)  処理系定義の値を返す。 
15.2.12.5.17 Array#join 

join(

sep=nil)

可視性:public

動作:

a)  sep が nil でも String クラスのインスタンスでもない場合,このメソッドの動作は未規定とする。

b)  String クラスの空の直接のインスタンス を作る。 
c)  レシーバのそれぞれの要素 について,添字順に,次の手順を行う。

1)  sep が nil でなく,かつ,がレシーバの最初の要素でない場合,sep の内容を の末尾に追加する。

2)  が String クラスのインスタンスの場合,の内容を の末尾に追加する。 
3)  が Array クラスのインスタンスの場合,次の手順を行う。

i)

がレシーバである,すなわち,レシーバが自分自身を含んでいる場合,処理系定義の文字列を

の末尾に追加する。

ii)  そうではない場合,join メソッドを に対し sep を実引数として呼び出し,その結果である

String

クラスのインスタンスの内容を の末尾に追加する。

4)  そうではない場合,このメソッドの動作は未規定とする。

d)  を返す。


157

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.12.5.18 Array#last 

last(*

args)

可視性:public

動作:

a)  args の長さが 0 の場合,次の手順を行う。

1)  レシーバが空の場合,nil を返す。

2)  そうではない場合,レシーバの最後の要素を返す。

b)  args の長さが 1 の場合,次の手順を行う。

1)  唯一の実引数が Integer クラスのインスタンスである場合,をその実引数の値とする。そうでは

ない場合,このメソッドの動作は未規定とする。

2)  が 0 未満の場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。 
3)  そうではない場合,を 及びレシーバの長さのうち小さい方とする。

レシーバの末尾から 個の要素を同じ順序で保持する Array クラスのインスタンスを作って返す。

c)  args の長さが 1 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

15.2.12.5.19 Array#length 

length

可視性:public

動作:レシーバの保持する要素の個数を値とする Integer クラスのインスタンスを返す。

15.2.12.5.20 Array#map! 

map!(&

block)

可視性:public

動作:collect!メソッドと同じとする(15.2.12.5.7 参照)。

15.2.12.5.21 Array#pop 

pop

可視性:public

動作:

a)  レシーバが空の場合,nil を返す。 
b)  そうではない場合,レシーバの最後の要素を削除し,その要素を返す。 
15.2.12.5.22 Array#push 

push(*

items)

可視性:public

動作:

a)  items のそれぞれの要素を,添字順に,レシーバの末尾に追加する。

b)  レシーバを返す。 
15.2.12.5.23 Array#replace 

replace(

other)

可視性:public

動作:initialize_copy メソッドと同じとする(15.2.12.5.16 参照)。


158

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.12.5.24 Array#reverse 

reverse

可視性:public

動作:レシーバの全ての要素を逆順に保持するような Array クラスのインスタンスを作って返す。

15.2.12.5.25 Array#reverse! 

reverse!

可視性:public

動作:レシーバの全ての要素を逆順に並べ替え,レシーバを返す。

15.2.12.5.26 Array#rindex 

rindex(

object=nil)

可視性:public

動作:

a)  object が与えられた場合,次の手順を行う。

1)  レシーバのそれぞれの要素 について,添字の逆順に,次の手順を行う。

i)

に対して object を実引数として  “==”  メソッドを呼び出す。

ii)  呼出し結果の値が真の場合,の添字を値にもつ Integer クラスのインスタンスを返す。

2)  手順 a) 1) ii)で Integer クラスのインスタンスが返されなかった場合,nil を返す。

b)  そうではない場合,このメソッドの動作は未規定とする。 
15.2.12.5.27 Array#shift 

shift

可視性:public

動作:

a)  レシーバが空の場合,nil を返す。 
b)  そうではない場合,レシーバの最初の要素を削除してその要素を返す。

15.2.12.5.28 Array#size 

size

可視性:public

動作:length メソッドと同じとする(15.2.12.5.19 参照)。

15.2.12.5.29 Array#slice 

slice(*

args)

可視性:public

動作:“[]”  メソッドと同じとする(15.2.12.5.4 参照)。

15.2.12.5.30 Array#unshift 

unshift(*

items)

可視性:public

動作:

a)  items のそれぞれの要素を,添字の逆順に,レシーバの先頭に追加する。 
b)  レシーバを返す。 
15.2.13 Hash 


159

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.13.1  概要 

Hash

クラスのインスタンスは,ハッシュ,すなわち,キーと値との組の集合を表す。

キーと値との組を一つももたない Hash クラスのインスタンスは空であるという。Hash クラスのイン

スタンスは,Class クラスの new メソッドの手順 b)によって作られたとき,空でなければならない。

Hash

クラスのインスタンスは,あるキーに対して二つ以上のキーと値との組をもってはならない。言

い換えれば,Hash クラスの一つのインスタンスの中の個々のキーはそれぞれ異なる。

Hash

クラスのインスタンスは次の属性をもつ。

省略時の値又は proc:この属性の値は,次のいずれかである。

−  省略時の値。これは,指定されたキーが Hash クラスのインスタンス内に存在しなかった場合

に  “[]”  メソッドによって返される。

−  省略時の proc。これは,Proc クラスのインスタンスであり,指定されたキーが Hash クラス

のインスタンス内に存在しなかった場合に  “[]”  メソッドが返す値を生成するために使われ

る。

Hash

クラスのインスタンスは,省略時の値と省略時の proc とを同時にもってはならない。

二つのキーK

1

及び K

2

について,“K

1

≡ K

2

”  という表現は,二つのキーが同値である,すなわち次の全て

の条件が成り立つことを示す。

−  eql?メソッドを,K

1

に対し,K

2

を唯一の実引数として呼び出すと,真が返される。

−  K

1

及び K

2

に対し hash メソッドを呼び出した結果の値をそれぞれ,H

1

及び H

2

とする。

H

1

と H

2

とが,同じ整数を表す Integer クラスのインスタンスである。

規格適合処理系は,ある整数の範囲を定め,H

1

又は H

2

の値がこの範囲外であるときに,H

1

又は H

2

を,この範囲内の値を表す Integer クラスのインスタンスに変換してよい。変換後のインスタンス

をそれぞれ,I

1

及び I

2

とする。

I

1

と I

2

とが同じ整数を表す。

H

1

又は H

2

が Integer クラスのインスタンスでない場合は,K

1

≡  K

2

であるかどうかは処理系定義

とする。

注記  K

1

≡ K

2

と K

2

≡ K

1

とは,等価ではない。

15.2.13.2  直接のスーパークラス 

Object

クラス

15.2.13.3  インクルードモジュール 

Hash

クラスは,次のモジュールをインクルードする。

−  Enumerable

15.2.13.4  インスタンスメソッド 
15.2.13.4.1 Hash#== 

==(

other)

可視性:public

動作:

a)  other が Hash クラスのインスタンスでない場合,このメソッドの動作は処理系定義とする。 
b)  次の全ての条件が成り立つ場合,true を返す。

−  レシーバと other とが,同じ個数のキーと値との組をもつ。


160

X 3017

:2013 (ISO/IEC 30170:2012)

−  レシーバのそれぞれのキーと値との組 について,次の条件を満たすような対応するキーと値との

組 を other がもつ。

−  (のキー)≡(のキー)である。

−  “==”  メソッドを,の値に対し,の値を実引数として呼び出したとき,結果が真になる。

c)  そうではない場合,false を返す。

15.2.13.4.2 Hash#[] 

[](

key)

可視性:public

動作:

a)  key

≡(のキー)が成り立つようなキーと値との組 をレシーバがもつ場合,の値を返す。

b)  そうではない場合,レシーバに対し default メソッドを,key を実引数として呼び出し,呼出し結果

の値を返す。

15.2.13.4.3 Hash#[]= 

[]=(

key, value)

可視性:public

動作:

a)  key

≡(のキー)が成り立つようなキーと値との組 をレシーバがもつ場合,の値を value に置き

換える。

b)  そうではない場合,次の手順を行う。

1)  key が String クラスの直接のインスタンスの場合,key の複製を作る。すなわち,内容が key の内

容と同じ String クラスの直接のインスタンス を作る。

2)  key が String クラスのインスタンスでない場合,を key とする。

3)  key が String クラスのサブクラスのインスタンスの場合,複製を作るかどうかは処理系定義とす

る。

4)  と value との組をレシーバに保存する。

c)  value を返す。 
15.2.13.4.4 Hash#clear 

clear

可視性:public

動作:

a)  レシーバから全てのキーと値との組を取り除く。 
b)  レシーバを返す。

15.2.13.4.5 Hash#default 

default(*

args)

可視性:public

動作:

a)  args の長さが 1 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生さ

せる。

b)  レシーバが省略時の値をもつ場合,それを返す。


161

X 3017

:2013 (ISO/IEC 30170:2012)

c)  レシーバが省略時の proc をもつ場合,次の手順を行う。

1)  args の長さが 0 の場合,nil を返す。

2)  args の長さが 1 の場合,レシーバの省略時の proc に対し,レシーバ及び args の唯一の要素を実引数

として call メソッドを呼び出す。呼出し結果の値を返す。

d)  そうではない場合,nil を返す。

15.2.13.4.6 Hash#default= 

default=(

value)

可視性:public

動作:

a)  レシーバが省略時の proc をもつ場合,それをレシーバから削除する。 
b)  レシーバの省略時の値を value とする。 
c)  value を返す。

15.2.13.4.7 Hash#default_proc 

default_proc

可視性:public

動作:

a)  レシーバが省略時の proc をもつ場合,それを返す。 
b)  そうではない場合,nil を返す。 
15.2.13.4.8 Hash#delete 

delete(

key, &block)

可視性:public

動作:

a)  key

≡(のキー)が成り立つようなキーと値との組 をレシーバがもつ場合,をレシーバから取り

除き,の値を返す。

b)  そうではない場合,次の手順を行う。

1)  block が与えられている場合,block を,key を実引数として呼び出す。呼出し結果の値を返す。

2)  そうではない場合,nil を返す。

15.2.13.4.9 Hash#each 

each(&

block)

可視性:public

動作:

a)  block が与えられている場合,レシーバのそれぞれのキーと値との組について,処理系定義の順序で,

次の手順を行う。

1)  その組のキーと値とを要素にもつ Array クラスの直接のインスタンスを作る。 
2)  作ったインスタンスを実引数として block を呼び出す。

レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は処理系定義とする。 
15.2.13.4.10 Hash#each_key 

each_key(&

block)


162

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:

a)  block が与えられている場合,レシーバのそれぞれのキーと値との組について,処理系定義の順序で,

その組のキーを実引数として block を呼び出す。レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は処理系定義とする。

15.2.13.4.11 Hash#each_value 

each_value(&

block)

可視性:public

動作:

a)  block が与えられている場合,レシーバのそれぞれのキーと値との組について,処理系定義の順序で,

その組の値を実引数として block を呼び出す。レシーバを返す。

b)  block が与えられていない場合,このメソッドの動作は処理系定義とする。

15.2.13.4.12 Hash#empty? 

empty?

可視性:public

動作:

a)  レシーバが空の場合,true を返す。 
b)  そうではない場合,false を返す。 
15.2.13.4.13 Hash#has_key? 

has_key?(

key)

可視性:public

動作:

a)  key

≡(のキー)が成り立つようなキーと値との組 をレシーバがもつ場合,true を返す。

b)  そうではない場合,false を返す。 
15.2.13.4.14 Hash#has_value? 

has_value?(

value)

可視性:public

動作:

a)  値が次の条件を満たすようなキーと値との組をレシーバがもつ場合,true を返す。

−  その値に対し,“==”  メソッドを,value を実引数として呼び出したとき,結果が真になる。

b)  そうではない場合,false を返す。 
15.2.13.4.15 Hash#include? 

include?(

key)

可視性:public

動作:has_key?メソッドと同じとする(15.2.13.4.13 参照)。

15.2.13.4.16 Hash#initialize 

initialize(*

args, &block)

可視性:private

動作:


163

X 3017

:2013 (ISO/IEC 30170:2012)

a)  block が与えられており,args の長さが 0 でない場合,ArgumentError クラスの直接のインスタンス

を例外として発生させる。

b)  block が与えられており,args の長さが 0 の場合,block を表す Proc クラスの直接のインスタンスを

作り,それをレシーバの省略時の proc とする。

c)  block が与えられていない場合,次の手順を行う。

1)  args の長さが 0 の場合,を nil とする。 
2)  args の長さが 1 の場合,をその唯一の要素とする。 
3)  args の長さが 1 より大きい場合,ArgumentError クラスの直接のインスタンスを例外として発生

させる。

4)  レシーバの省略時の値を とする。

d)  処理系定義の値を返す。

15.2.13.4.17 Hash#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  original が Hash クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  レシーバから全てのキーと値との組を取り除く。 
c)  original のそれぞれのキーと値との組 について,処理系定義の順序で,レシーバに対して のキー

及び の値を実引数として  “[]=”  メソッド(15.2.13.4.3 参照)を呼び出すことによって,レシーバ

がもつキーと値との組を追加又は更新する。

d)  レシーバの省略時の値又は省略時の proc を削除する。

e)  orignal が省略時の値をもつ場合,それをレシーバの省略時の値とする。 
f)  orignal が省略時の proc をもつ場合,それをレシーバの省略時の proc とする。 
g)  処理系定義の値を返す。

15.2.13.4.18 Hash#key? 

key?(

key)

可視性:public

動作:has_key?メソッドと同じとする(15.2.13.4.13 参照)。

15.2.13.4.19 Hash#keys 

keys

可視性:public

動作:レシーバの全ての組のキーを,処理系定義の順序で含む Array クラスのインスタンスを作って返

す。

15.2.13.4.20 Hash#length 

length

可視性:public

動作:レシーバのもつキーと値との組の個数を値としてもつ Integer クラスのインスタンスを返す。

15.2.13.4.21 Hash#member? 

member?(

key)


164

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:has_key?メソッドと同じとする(15.2.13.4.13 参照)。

15.2.13.4.22 Hash#merge 

merge(

other, &block)

可視性:public

動作:

a)  other が Hash クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
b)  other が Hash クラスのインスタンスである場合,レシーバと同じキーと値との組をもつ Hash クラス

の直接のインスタンス を作る。

c)  other のそれぞれのキーと値との組 について,処理系定義の順序で,次の手順を行う。

1)  block が与えられている場合,次の手順を行う。

i)

が,(のキー)≡(のキー)であるようなキーと値との組 をもつ場合,のキー,の値,

及び の値を実引数として block を呼び出す。呼出し結果の値を とする。に対して のキー

及び を実引数として  “[]=”  メソッド(15.2.13.4.3 参照)を呼び出すことによって,がもつキ

ーと値との組を追加又は更新する。

ii)  そうではない場合,に対して のキー及び の値を実引数として  “[]=”  メソッド(15.2.13.4.3

参照)を呼び出すことによって,がもつキーと値との組を追加又は更新する。

2)  block が与えられていない場合,に対して のキー及び の値を実引数として  “[]=”  メソッド

15.2.13.4.3 参照)を呼び出すことによって,がもつキーと値との組を追加又は更新する。

d)  を返す。 
15.2.13.4.23 Hash#replace 

replace(

other)

可視性:public

動作:initialize_copy メソッドと同じとする(15.2.13.4.17 参照)。

15.2.13.4.24 Hash#shift 

shift

可視性:public

動作:

a)  レシーバが空の場合,次の手順を行う。

1)  レシーバが省略時の proc をもつ場合,その省略時の proc に対し,レシーバ及び nil を実引数として

call

メソッドを呼び出す。呼出し結果の値を返す。

2)  レシーバが省略時の値をもつ場合,それを返す。

3)  そうではない場合,nil を返す。

b)  そうではない場合,処理系定義の方法でキーと値との組 を選び,それをレシーバから取り除く。P

のキーと値とを要素としてもつ Array クラスのインスタンスを作って返す。

15.2.13.4.25 Hash#size 

size

可視性:public

動作:length メソッドと同じとする(15.2.13.4.20 参照)。


165

X 3017

:2013 (ISO/IEC 30170:2012)

15.2.13.4.26 Hash#store 

store(

key, value)

可視性:public

動作:“[]=”  メソッドと同じとする(15.2.13.4.3 参照)。

15.2.13.4.27 Hash#value? 

value?(

value)

可視性:public

動作:has_value?メソッドと同じとする(15.2.13.4.14 参照)。

15.2.13.4.28 Hash#values 

values

可視性:public

動作:レシーバの全ての組の値を,処理系定義の順序で含む Array クラスのインスタンスを作って返す。

15.2.14 Range 

15.2.14.1  概要 

Range

クラスのインスタンスは,二つの値(すなわち,始点及び終点)の間の範囲を表す。

Range

クラスのインスタンスは次の属性をもつ。

始点:範囲の始点となる値。

終点:範囲の終点となる値。

排他的フラグ:この値が真の場合,範囲は終点を含まない。そうではない場合,範囲は終点を含む。

Kernel

クラスの clone メソッド(15.3.1.3.8 参照)又は dup メソッド(15.3.1.3.9 参照)が Range ク

ラスのインスタンスに対して呼び出された場合,レシーバのこれらの属性を呼出し結果のインスタンスに

コピーしなければならない。

15.2.14.2  直接のスーパークラス 

Object

クラス

15.2.14.3  インクルードモジュール 

Range

クラスは,次のモジュールをインクルードする。

−  Enumerable

15.2.14.4  インスタンスメソッド 
15.2.14.4.1 Range#== 

==(

other)

可視性:public

動作:

a)  次の全ての条件が成り立つ場合,true を返す。

−  other が Range クラスのインスタンスである。

−  を other の始点とする。“==”  メソッドをレシーバの始点に対し,を実引数として呼び出した場

合に真が返る。

−  を other の終点とする。“==”  メソッドをレシーバの終点に対し,を実引数として呼び出した場

合に真が返る。

−  レシーバの排他的フラグ属性と other の排他的フラグ属性とが同じ真理値である。


166

X 3017

:2013 (ISO/IEC 30170:2012)

b)  そうではない場合,false を返す。 
15.2.14.4.2 Range#=== 

===(

obj)

可視性:public

動作:

a)  レシーバの始点又は終点が Numeric クラスのインスタンスでない場合,このメソッドの動作は未規

定とする。

b)  “<=>”  メソッドを,レシーバの始点に対し,obj を実引数として呼び出す。を呼出し結果の値とする。

1)  が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

2)  の値が 0 より大きい場合,false を返す。

c)  “<=>”  メソッドを obj に対しレシーバの終点を実引数として呼び出す。を呼出し結果の値とする。

−  が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

−  レシーバの排他的フラグ属性が真で,が 0 未満の場合,true を返す。

−  レシーバの排他的フラグ属性が偽で,の値が 0 以下の場合,true を返す。

−  そうではない場合,false を返す。

15.2.14.4.3 Range#begin 

begin

可視性:public

動作:レシーバの始点を返す。

15.2.14.4.4 Range#each 

each(&

block)

可視性:public

動作:

a)  block が与えられていない場合,このメソッドの動作は未規定とする。 
b)  レシーバの始点に対し,respond_to?メソッドを,名前が  “succ”  である Symbol クラスの直接の

インスタンスを実引数として呼び出したとき,結果が偽になった場合,TypeError クラスの直接の

インスタンスを例外として発生させる。

c)  をレシーバの始点とする。 
d)  “<=>”  メソッドを,に対し,レシーバの終点を実引数として呼び出す。を呼出し結果の値とする。

1)  が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。 
2)  の値が 0 より大きい場合,レシーバを返す。 
3)  の値が 0 の場合,次の手順を行う。

i)

レシーバの排他的フラグ属性が真の場合,レシーバを返す。

ii)  レシーバの排他的フラグ属性が偽の場合,block を を実引数として呼び出し,レシーバを返す。

e)  block を,を実引数として呼び出す。

f)  succ メソッドを,に対して実引数なしで呼び出し,を新たに呼出し結果の値とする。 
g)  手順 d)から処理を続ける。 
15.2.14.4.5 Range#end 

end


167

X 3017

:2013 (ISO/IEC 30170:2012)

可視性:public

動作:レシーバの終点を返す。

15.2.14.4.6 Range#exclude_end? 

exclude_end?

可視性:public

動作:レシーバの排他的フラグ属性が真の場合,true を返す。そうではない場合,false を返す。

15.2.14.4.7 Range#first 

first

可視性:public

動作:begin メソッドと同じとする(15.2.14.4.3 参照)。

15.2.14.4.8 Range#include? 

include?(

obj)

可視性:public

動作:“===”  メソッドと同じとする(15.2.14.4.2 参照)。

15.2.14.4.9 Range#initialize 

initialize(

left, right, exclusive=false)

可視性:private

動作:

a)  “<=>”  メソッドを,left に対し,right を実引数として呼び出す。この呼出し中に例外が発生し処理さ

れない場合,ArgumentError クラスの直接のインスタンスを例外として発生させる。呼出し結果の

値が Integer クラスのインスタンスでない場合,このメソッドの動作は未規定とする。

b)  exclusive が真の場合,を真とする。そうではない場合,を偽とする。 
c)  レシーバの始点,終点,及び排他的フラグ属性をそれぞれ leftright,及び とする。 
d)  処理系定義の値を返す。

15.2.14.4.10 Range#last 

last

可視性:public

動作:end メソッドと同じとする(15.2.14.4.5 参照)。

15.2.14.4.11 Range#member? 

member?(

obj)

可視性:public

動作:“===”  メソッドと同じとする(15.2.14.4.2 参照)。

15.2.15 Regexp 

15.2.15.1  概要 

Regexp

クラスのインスタンスは正規表現を表す。Regexp クラスのインスタンスは次の属性をもつ。

パターン:インスタンスの表す正規表現の《パターン》(15.2.15.4 参照)。この属性の省略時の値は空とす

る。

Regexp

クラスのインスタンスに対するメソッド呼出し時にこの属性の値が空であった場合は,

そのメソッドの動作は未規定とする。ただし,initialize メソッドは除く。


168

X 3017

:2013 (ISO/IEC 30170:2012)

大小文字同一視フラグ:マッチを行う際に大文字と小文字とを区別するか否かを表す真理値である。こ

の属性のデフォルトの値は偽とする。

複数行フラグ:“.”  形式のパターンが《行終端子》にマッチするか否かを表す真理値である(15.2.15.4 

照)

。この属性のデフォルトの値は偽とする。

15.2.15.2  直接のスーパークラス 

Object

クラス

15.2.15.3  定数 

Regexp

クラスには,次の定数が定義されている。

IGNORECASE:値が 2

n

の Integer クラスのインスタンスとする。ここで,は整数で,その値は処理

系定義とする。この定数の値は次の  “MULTILINE”  の値と同じであってはならない。

MULTILINE:値が 2

m

の Integer クラスのインスタンスとする。は整数で,その値は処理系定義と

する。

これらの定数は,Regexp クラスのインスタンスの大小文字同一視フラグ属性及び複数行フラグ属性の

値を設定するために使われる(15.2.15.7.5 参照)

15.2.15.4  パターン 

構文規則

《パターン》 ::

  《候補》

1

|《パターン》

1

 “|”  《候補》

2

《候補》 ::

  [空]

|《候補》

3

  《項》

《項》 ::

  《アンカー》

|《アトム》

1

|《アトム》

2

  《量化子》

《アンカー》 ::

  《左アンカー》|《右アンカー》

《左アンカー》 ::

  “\A”|“^”

《右アンカー》 ::

  “\z”|“$”

《量化子》 ::

    “*”|“+”|“?”

《アトム》 ::

  《パターン文字》

|《グループ化》

|“.”

|《アトムエスケープ列》


169

X 3017

:2013 (ISO/IEC 30170:2012)

《パターン文字》 ::

  《ソース文字》  −  《正規表現メタ文字》

《正規表現メタ文字》 ::

    “|”|“.”|“*”|“+”|“^”|“?”|“(”|“)”|“#”|“\”|“$”

|《将来的予約メタ文字》

《将来的予約メタ文字》 ::

      “[”|“]”|“{”|“}”

《グループ化》 ::

  “(”  《パターン》  “)”

《アトムエスケープ列》 ::

  《10進エスケープ列》

|《正規表現文字エスケープ列》

10進エスケープ列》 ::

  “\”  《0以外の10進数字》

《正規表現文字エスケープ列》 ::

  《正規表現エスケープ列》

|《正規表現非エスケープ列》

|《16進エスケープ列》

|《正規表現8進エスケープ列》

|《正規表現制御エスケープ列》

《正規表現エスケープ列》 ::

  “\”  《正規表現エスケープ文字》

《正規表現エスケープ文字》 ::

  “n”|“t”|“r”|“f”|“v”|“a”|“e”

《正規表現非エスケープ列》 ::

  “\”  《正規表現メタ文字》

《正規表現8進エスケープ列》 ::

  《8進エスケープ列》  −  《10進エスケープ列》

《正規表現制御エスケープ列》 ::

  “\”  (  “C-”|“c”  )  《正規表現制御エスケープ文字》

《正規表現制御エスケープ文字》 ::

  《正規表現文字エスケープ列》

|“?”

|《ソース文字》  −  (  “\”|“?”  )

《将来的予約メタ文字》は,正規表現のパターンを将来拡張するときのために予約されている。

意味規則

正規表現は,その正規表現の《パターン》に従い,対象文字列と呼ばれる文字列から特定の部分文字列を

選択する。《パターン》が二つ以上の部分文字列にマッチする場合,対象文字列中の先頭に最も近い位置か

ら始まる部分文字列が選択される。同じ位置から複数のそのような部分文字列が始まる場合,後述する優


170

X 3017

:2013 (ISO/IEC 30170:2012)

先順位が最も高い部分文字列が選択される。《パターン》のそれぞれの要素は,対象文字列の部分文字列に

次のようにマッチする。

a)  《パターン》は次の部分文字列にマッチする。

1)  《パターン》が《候補》

1

の場合は,《候補》

1

がマッチする文字列にマッチする。

2)  《パターン》が《パターン》

1

 “|”  《候補》

2

の場合は,《パターン》

1

又は《候補》

2

がマッチする文字列にマ

ッチする。《パターン》

1

がマッチする文字列の方が,優先順位が高い。

例 1  "ab".slice(/(a|ab)/)は,"ab"  ではなく  "a"  を返す。

b)  《候補》は次の部分文字列にマッチする。

1)  《候補》が[空]の場合は,空文字列にマッチする。 
2)  《候補》が《候補》

3

  《項》の場合,《候補》は,前半部分が《候補》

3

にマッチし,後半部分が《項》にマッチ

するような部分文字列にマッチする。

そのような部分文字列が二つ以上ある場合,優先順位は次のように決定する。

i)

《候補》

3

がマッチする候補が二つ以上ある場合,優先順位が高い候補を前半部分とする部分文字列

の方が,優先順位が高い。

例 2  "abc".slice(/(a|ab)(c|b)/)は,"abc"  ではなく  "ab"  を返す。この場合,

(a|ab)

は(c|b)より優先される。

ii)  部分文字列の前半部分が同じで,かつ,《項》がマッチする候補が二つ以上ある場合,優先順位が

高い候補を後半部分とする部分文字列の方が,優先順位が高い。

例 3  "abc".slice(/a(b|bc)/)は,"abc"  ではなく  "ab"  を返す。

c)  《項》は次の部分文字列にマッチする。

1)  《項》が《アトム》

1

の場合は,《アトム》

1

がマッチする文字列にマッチする。

2)  《項》が《アトム》

2

  《量化子》の場合は,次の文字列にマッチする。

i)

《量化子》が  “*”  の場合は,《アトム》

2

がマッチする文字列の 0 個以上の並びにマッチする。

ii)  《量化子》が  “+”  の場合は,《アトム》

2

がマッチする文字列の 1 個以上の並びにマッチする。

iii)  《量化子》が  “?”  の場合は,《アトム》

2

がマッチする文字列の 0 個又は 1 個の並びにマッチする。

より長い文字列の方が優先順位が高い。

例 4  "aaa".slice(/a*/)は,"","a"  又は  "aa"  のいずれでもなく,"aaa"  を返す。

3)  《項》が《アンカー》の場合は,対象文字列 中の特定の位置にある空文字列に,次のようにマッチす

る。

i)

《アンカー》が  “\A”  の場合は,の先頭の空文字列にマッチする。

ii)  《アンカー》が  “^”  の場合は,の先頭又は《行終端子》の直後の空文字列にマッチする。ただし,

《行終端子》の直後の空文字列にマッチする場合,その《行終端子》の後に最低一文字が存在しなけ

ればならない。

iii)  《アンカー》が  “\z”  の場合は,の終端の空文字列にマッチする。 
iv)  《アンカー》が  “$”  の場合は,の終端又は《行終端子》の直前の空文字列にマッチする。

d)  《アトム》は次の文字列にマッチする。

1)  《アトム》が《パターン文字》の場合は,《パターン文字》が表す文字 にマッチする。大小文字同一視

フラグ属性が真の Regexp クラスのインスタンスのパターン属性中に《アトム》が存在する場合は,

が小文字の場合は に対応する大文字にも,が大文字の場合は に対応する小文字にも《アト

ム》はマッチする。


171

X 3017

:2013 (ISO/IEC 30170:2012)

2)  《アトム》が《グループ化》の場合は,《グループ化》がマッチする文字列にマッチする。 
3)  《アトム》が  “.”  の場合は,《行終端子》以外の文字にマッチする。《アトム》が複数行フラグ属性が真

の Regexp クラスのインスタンスのパターン属性中に存在する場合は,《アトム》は《行終端子》にも

マッチする。

4)  《アトム》が《アトムエスケープ列》の場合は,《アトムエスケープ列》がマッチする文字列にマッチす

る。

e)  《グループ化》は,その《パターン》がマッチする文字列にマッチする。 
f)  《アトムエスケープ列》は次の文字列にマッチする。

1)  《アトムエスケープ列》が《10 進エスケープ列》の場合は,《10 進エスケープ列》がマッチする文字列に

マッチする。

2)  《アトムエスケープ列》が《正規表現文字エスケープ列》の場合は,《正規表現文字エスケープ列》が表

す文字を内容とする長さ 1 の文字列にマッチする。

g)  《10 進エスケープ列》は次の文字列にマッチする。

1)  《0 以外の 10 進数字》が表す整数を とする。

2)  を《パターン》中に存在する 1 から数えて 番目の《グループ化》とする。《グループ化》は,その  “(”

が出現する順に《パターン》の左側から数える。

3)  《パターン》の中で《10 進エスケープ列》が よりも前に存在する場合は,《10 進エスケープ列》はど

の文字列にもマッチしない。

4)  がマッチする文字列がある場合は,《10 進エスケープ列》は がマッチする文字列にマッチする。 
5)  上記のいずれでもない場合は,《10 進エスケープ列》はどの文字列にもマッチしない。

h)  《正規表現文字エスケープ列》は次の文字を表す。

−  《正規表現エスケープ列》は 8.7.6.3.3 

表 で示す文字を表す。

−  《正規表現非エスケープ列》は《正規表現メタ文字》が表す文字を表す。

−  《16 進エスケープ列》は 8.7.6.3.3 で規定されるとおりの文字を表す。

−  《正規表現 8 進エスケープ列》は《8 進エスケープ列》と同様に解釈する(8.7.6.3.3 参照)

−  《正規表現制御エスケープ列》は,文字符号が《正規表現制御エスケープ文字》が表す文字の文字符号

と 0x9f とのビット単位の論理積とする文字を表す。ただし,《正規表現制御エスケープ文字》が  “?”

の場合は,《正規表現制御エスケープ列》は文字符号が 0x7f の文字を表す。

15.2.15.5  マッチ処理 

文字列 に対し,

《パターン》のマッチが成功するとは,がマッチする の部分文字列(自身も含む。)

が存在することである。

a)  添字が指定された場合は,その添字の位置から開始し,の終端で終了するような の部分文字列に

対して,のマッチが試みられる。ただし,が部分文字列にマッチする場合は,マッチ処理の結果

の MatchData クラスのインスタンスの文字列属性の値はマッチが試みられる の部分文字列ではな

く,とする。

b)  マッチ処理は,マッチが成功する場合は MatchData クラスのインスタンス(15.2.16 参照)を,失敗

する場合は nil を返す。

c)  MatchData クラスのインスタンスは次のようにして生成される。

1)  がマッチする の部分文字列を とする。 
2)  MatchData クラスの直接のインスタンスを生成する。それを とする。


172

X 3017

:2013 (ISO/IEC 30170:2012)

3)  を,の文字列属性(15.2.16.1 参照)に設定する。 
4)  新たな空リスト を生成する。

5)  部分文字列 と,の先頭の文字の 中での添字との組を,とする。を の末尾に追加する。 
6)  内のそれぞれの《グループ化》について,その  “(”  が に出現する順に,次の手順を行う。

i)

のマッチ処理において,が の部分文字列にマッチする場合は,その部分文字列を B

G

とする。

部分文字列 B

G

と,B

G

の先頭の文字の 中での添字との組を,とする。を の末尾に追加す

る。

ii)  そうではない場合は,その部分文字列及び部分文字列の添字が nil である組を に追加する。

7)  L  を のマッチ結果属性に設定する。 
8)  この を,マッチ処理が返す MatchData クラスのインスタンスとする。

d)  マッチ処理は “~” という名前の局所変数束縛を,そのような名前の束縛がない場合は作成し,ある場

合はその束縛の値を更新する。この束縛は Regexp.last_match メソッドによって利用される

15.2.15.6.3 参照)

。束縛の作成又は更新は,次のようにして行われる。

1)  マッチ処理の結果を とする。

2) “~”

を《局所変数識別子》と仮定し,9.2 の記述に従い局所変数の名前解決を行う。“~”  という名前の

束縛が解決される場合は,その束縛の値を に置き換える。

3)  名前が解決されない場合は,⟦局所変数束縛集合⟧に積まれた《ブロック》に対応しない局所変数束縛

の集合で,⟦局所変数束縛集合⟧中で最も上にあるものに,名前が “~” で値が の局所変数束縛を

追加する。

e)  規格適合処理系は変数束縛の名前として “~” 以外の名前を用いてもよい。ただし,その名前は《局所

変数識別子》の形式であってはならない。

15.2.15.6  特異メソッド 
15.2.15.6.1 Regexp.compile 

Regexp.compile(*

args)

可視性:public

動作:new メソッドと同じとする(15.2.3.3.3 参照)。

15.2.15.6.2 Regexp.escape 

Regexp.escape(

string)

可視性:public

動作:

a)  string が String クラスのインスタンスでない場合は,このメソッドの動作は未規定とする。

b)  string の内容を とする。 
c)  その内容が と同じである新しく作った String クラスの直接のインスタンスを返す。ただし,戻り

値の String クラスのインスタンスでは,

表 の左側の列の文字は全て右側の列の文字列に置き換え

られる。


173

X 3017

:2013 (ISO/IEC 30170:2012)

表 4Regexp のエスケープされた文字

置き換えられる文字

エスケープシーケンス

0x0a “\n” 
0x09 “\t” 
0x0d “\r” 
0x0c “\f” 
0x20 “\”

0x20

“#” “\#” 
“$” “\$”

“(” “\(” 
“)” “\)”

“*” “\*”

“+” “\+”

“-” “\-”

“.” “\.”

“?” “\?”

“[” “\[” 
“\” “\\” 
“]” “\]”

“^” “\^” 
“{” “\{”

“|” “\|”

“}” “\}”

15.2.15.6.3 Regexp.last_match 

Regexp.last_match(*

index)

可視性:public

動作:

a) “~”

を《局所変数識別子》と仮定し,9.2 の規定に従い局所変数の名前解決を行う。

b)  名前解決が成功し,その値が MatchData クラスのインスタンスである場合は,をそのインスタン

スとする。名前解決が失敗した場合は,nil を返す。

c)  index の長さが 0 の場合は を返す。 
d)  index の長さが 2 以上の場合は,ArgumentError クラスの直接のインスタンスを例外として発生させ

る。

e)  index の長さが 1 の場合は,その唯一の実引数を とする。 
f)  が Integer クラスのインスタンスでない場合は,このメソッドの動作は未規定とする。 
g)  を実引数とし  “[]”  メソッド(15.2.16.3.1 参照)を に対して呼び出し,呼出し結果の値を とす

る。

h)  を返す。 
15.2.15.6.4 Regexp.quote 

Regexp.quote

可視性:public

動作:escape メソッドと同じとする(15.2.15.6.2 参照)。

15.2.15.7  インスタンスメソッド 
15.2.15.7.1 Regexp#== 


174

X 3017

:2013 (ISO/IEC 30170:2012)

==(

other)

可視性:public

動作:

a)  other が Regexp クラスのインスタンスでない場合は,false を返す。 
b)  レシーバと other との対応する属性の値が同じである場合は,true を返す。 
c)  それ以外の場合は,false を返す。

15.2.15.7.2 Regexp#=== 

===(

string)

可視性:public

動作:

a)  string が String クラスのインスタンスでない場合は,このメソッドの動作は未規定とする。 
b)  string の内容を とする。 
c)  に対してレシーバのパターン属性のマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。マッチ処理の結

果を とする。

d)  が MatchData クラスのインスタンスの場合は,true を返す。 
e)  そうではない場合は,false を返す。

15.2.15.7.3 Regexp#=~ 

=~(

string)

可視性:public

動作:

a)  string が String クラスのインスタンスでない場合は,このメソッドの動作は未規定とする。 
b)  string の内容を とする。 
c)  に対してレシーバのパターン属性のマッチを試みる(15.2.15.4 及び 15.2.15.5 参照)。マッチ処理の結

果を とする。

d)  が nil の場合は,nil を返す。 
e)  が MatchData クラスのインスタンスの場合は,のマッチ結果属性の最初の要素を とする。P

の部分文字列の添字を とする。

f)  その値が の Integer クラスのインスタンスを返す。 
15.2.15.7.4 Regexp#casefold? 

casefold?

可視性:public

動作:レシーバの大小文字同一視フラグ属性を返す。

15.2.15.7.5 Regexp#initialize 

initialize(

source, flag=nil)

可視性:private

動作:

a)  source が Regexp クラスのインスタンスの場合は,source のパターン属性を とする。source が String

クラスのインスタンスの場合は,source の内容を とする。それら以外の場合は,このメソッドの動

作は未規定とする。


175

X 3017

:2013 (ISO/IEC 30170:2012)

b)  が《パターン》(15.2.15.4 参照)という形式でない場合は,RegexpError クラスの直接のインスタ

ンスを例外として発生させる。

c)  レシーバのパターン属性を に設定する。 
d)  flag が Integer クラスのインスタンスの場合は,そのインスタンスの値を とする。

1)  Regexp クラスの定数 IGNORECASE の値と とのビット単位の論理積が 0 でない場合は,レシーバ

の大小文字同一視フラグ属性を真に設定する。

2)  Regexp クラスの定数 MULTILINE の値と とのビット単位の論理積が 0 でない場合は,レシーバ

の複数行フラグ属性を真に設定する。

e)  flag が Integer クラスのインスタンス以外の真である場合は,レシーバの大小文字同一視フラグ属性

を真に設定する。

f)  処理系定義の値を返す。

15.2.15.7.6 Regexp#initialize_copy 

initialize_copy(

original)

可視性:private

動作:

a)  original がレシーバのクラスのインスタンスでない場合は,TypeError クラスの直接のインスタンス

を例外として発生させる。

b)  original のパターン属性をレシーバのパターン属性に設定する。

c)  original の大小文字同一視フラグ属性をレシーバの大小文字同一視フラグ属性に設定する。 
d)  orig