X 3017:2013 (ISO/IEC 30170:2012)
(1)
2019年7月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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ページ
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 2項演算子式············································································································· 68
11.5 一次式 ······················································································································· 72
11.5.1 概要 ························································································································ 72
11.5.2 制御構造 ·················································································································· 73
X 3017:2013 (ISO/IEC 30170:2012) 目次
(3)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ページ
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ページ
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ページ
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
まえがき
この規格は,工業標準化法第14条によって準用する第12条第1項の規定に基づき,独立行政法人情報
処理推進機構(IPA)から,工業標準原案を具して日本工業規格を改正すべきとの申出があり,日本工業
標準調査会の審議を経て,経済産業大臣が改正した日本工業規格である。
これによって,JIS X 3017:2011は改正され,この規格に置き換えられた。
この規格は,著作権法で保護対象となっている著作物である。
この規格の一部が,特許権,出願公開後の特許出願又は実用新案権に抵触する可能性があることに注意
を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許権,出願公開後の特許出願及び実
用新案権に関わる確認について,責任はもたない。
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
日本工業規格 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にその修正を反映した。
なお,この規格で点線の下線を施してある参考事項は,対応国際規格にはない事項である。
1
適用範囲
この規格は,プログラム言語Rubyの構文規則及び意味規則を規定し,その規格適合処理系,規格に厳
密に適合するプログラム及び規格適合プログラムの要件を規定する。
この規格は,次の事項を規定しない。
− 規格適合処理系が評価するプログラムテキストの大きさ又は複雑さの限界。
− 規格適合処理系をサポートするために,データ処理システムが満たさなければならない最小要件。
− データ処理システム上でプログラムの実行を起動する方法。
− 構文の誤り,又は実行時に発生したエラーを報告する方法。
注記1 Rubyプログラムの実行とは,その《プログラム》(10.1参照)をRuby処理系で評価すること
である。
注記2 この規格の対応国際規格及びその対応の程度を表す記号を,次に示す。
ISO/IEC 30170:2012,Information technology−Programming languages−Ruby(IDT)
なお,対応の程度を表す記号“IDT”は,ISO/IEC Guide 21-1に基づき,“一致している”
ことを示す。
2
引用規格
次に掲げる規格は,この規格に引用されることによって,この規格の規定の一部を構成する。これらの
引用規格は,記載の年の版を適用し,その後の改正版(追補を含む。)は適用しない。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記 対応日本工業規格:JIS X 0001:1994 情報処理用語−基本用語(MOD)
3
規格適合性
Rubyの規格に厳密に適合するプログラムは,次の項目を満たさなければならない。
− この規格が規定する機能だけを使用しなければならない。
− いかなる未規定の動作又は処理系定義の動作に依存する出力も生成してはならない。
Rubyの規格適合処理系は,次の項目を満たさなければならない。
− 規格に厳密に適合するプログラムを,この規格の規定に従って評価しなければならない。
Rubyの規格適合処理系は,次のとおり実装してもよい。
− 規格に厳密に適合するプログラムの動作を変えない限りにおいて,この規格で規定した方法と異なる
方法でプログラムを評価してもよい。ただし,そのプログラムが組込みクラス又は組込みモジュール
(箇条15参照)の任意のメソッド又は定数を再定義した場合,そのプログラムの動作はこの規格で規
定されたものと異なっていてもよい(注記2参照)。
− この規格で規定されていない構文規則をサポートしたり,この規格で規定していない機能を利用する
プログラムを評価してもよい。
− 規格適合処理系は,処理系定義の動作並びにこの規格で規定されている以外の機能及び動作を適合性
文書に記載しなければならない。
Rubyの規格適合プログラムは,Rubyのある規格適合処理系が評価することができるプログラムとする。
− 規格適合プログラムは,プログラムが期待する処理系定義の動作,並びにプログラム内で使用される,
この規格で規定されている以外の機能及び期待する動作を適合性文書に記載しなければならない。
注記1 期待する動作を記載する代わりに,その期待する動作をサポートする規格適合処理系の名前
を記載してもよい。
注記2 例えば,規格適合処理系は,組込みクラス又は組込みモジュールのメソッドの呼出しを最適
化のために省略し,代わりにそのメソッドと同じ計算を行ってもよい。この場合,たとえ,
プログラムがそのメソッドを再定義しても,再定義されたメソッドが呼び出せないため,そ
のプログラムの動作は変更できないこともある。
4
用語及び定義
この規格で用いる主な用語及び定義はISO/IEC 2382-1:1993によるほか,次による。その他の用語は,
その用語を実線下線で示した場所,又は構文規則の左辺に出現した場所で定義したとみなす。
4.1
ブロック(block)
メソッド呼出しに渡される手続き。
4.2
クラス(class)
オブジェクトであって,そのクラスのインスタンスと呼ばれる他のオブジェクトの集合の動作を定義す
るもの。
3
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記 その動作は,インスタンスに対して呼び出すことのできるメソッドの集合である。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
供されるオブジェクト。
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
記法
5.1
総則
この箇条では,“並べる”及び“区切って並べる”を,次のとおり意味を限定して用いる。
a) Aの並び (長さnの)“Aの並び”とは,Aが示す種類のものをn個A1, A2, . . . , An (n ≧ 0)任意に用
意してそれらを順にA1 A2 . . .Anと並べたものをいう。長さ0の並びを(Aの)“空列”という。
b) AをBで区切って並べたもの “AをBで区切って並べたもの”とは,Aが示す種類のものをn+1個
A0, A1, A2, . . . , An (n ≧ 0)任意に用意し,更に,Bが示す種類のものをn個B1, B2, . . . ,Bn任意に用意し
て,それらを順にA0 B1 A1 B2 . . .Bn Anと並べたものをいう。
5.2
構文規則
5.2.1
総則
この規格では,一連の生成規則(5.2.2参照),及び構文に対する自然言語で書かれた制約によって,Ruby
言語の構文規則を規定する。構文規則は,必要とする細分箇条の中に“構文規則”という見出しを設けそ
の下に置く。
5
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
5.2.2
生成規則
生成規則は,次の形式とし,見やすさを考慮して,適宜,改行したり空白を入れたりして表記する。
X :: Y
ここで,Xは非終端記号[5.2.4 b)参照]とし,Yは項列(5.2.3参照)を縦線(|)で区切って並べたも
のとする。生成規則は,Yに並んでいる項列それぞれが表す文字の並びの集合の和集合を,非終端記号X
が表す文字の並びの集合であると定義する。このことから,生成規則X :: Yを,“Xの生成規則”という。
また,Xをこの生成規則の“左辺”といい,Yを“右辺”という。非終端記号XはYに現れている非終端
記号をそれぞれ直接に参照するという。非終端記号Aが非終端記号Bを参照するという関係を,次のとお
り再帰的に定義する。
− AがBを直接参照する場合,AはBを参照する。
− Aが非終端記号Cを参照し,CがBを参照する場合,AはBを参照する。
注記1 項列は,5.2.3に規定されるとおり,文字の並びの集合を表している。
構文規則中の自然言語で書かれた制約,又は,意味規則(5.3参照)で,項列Xに言及する“X”は,項
列Xが表す文字の並びの集合の一つの要素を表す。特に,Xが一つの非終端記号《Y》[5.2.4 b)参照]であ
る場合,“《Y》”は非終端記号が表す文字の並びの集合の一つの要素を表し,非終端記号《Y》自体を表す場
合は“非終端記号《Y》”と記述する。また,“《Y》”が表す文字の並びは,“《Y》という形式である”という。
非終端記号《Y》が非終端記号《Z》を直接参照するとき,“《Y》の《Z》”は,《Y》が表す文字の並びのうちその
ような《Z》が表す部分を指す。
注記2 例えば,生成規則“《X》 :: 《Y》 《Z》”の《X》が表す文字の並びxは,《Y》が表す文字の並びy
と《Z》が表す文字の並びz とから構成され,x=yz である。このとき,“《X》の《Z》”はzを指
す。
“《Y》内の《Z》”は,《Y》が表す文字の並びのうち,非終端記号《Y》が参照する《Z》が表す部分を指す。
“《Y》のそれぞれの《Z》”が表すものは,次のa)〜c)による。
a) この記法は,一次項P(5.2.4参照)に含まれて《Z》が現れており,かつ,《Y》の生成規則の右辺に,P
の0 回以上反復[5.2.4 f)参照]であるP*が現れている場合に対して用いる。
b) 《Y》の生成規則の右辺のP*を長さn(n ≧ 0)のPの並びで置き換えてできるものをYnとする。《Y》
が表す任意の文字の並びyについて,Yiが表す文字の並びがyであるようなiが存在する。
c) “《Y》のそれぞれの《Z》”は,Yiに繰り返して現れる《Z》が表すyの部分それぞれを指す。
ある細分箇条の生成規則において《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
類》,《コメント》,《プログラム終端指示子》又は《字句》のいずれかであることを表す。
《入力要素》 ::
《行終端子》
|《空白類》
|《コメント》
|《プログラム終端指示子》
|《字句》
例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参照)の並びとする。項列Sは,T1 T2 . . .Tn(n ≧ 1)という並び[ここで,Ti(1 ≦
i ≦ n)は項とする。]であり,t1 t2 . . . tnという形式(ここで,tiは,Tiが表す文字の並びの集合の任意の
要素とする。)の全ての文字の並びの集合を表す。ただし,Tiが特記項の場合のtiの意味は,5.2.4 d)で定義
する。
《行終端子》(8.3参照),《空白類》(8.4参照)及び《コメント》(8.5参照)は,《字句》(8.7参照)の区切
りとして使われ,通常は無視されるため,箇条8及び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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) 終端記号
タイプライタ体の文字の並びを二重引用符(“”)で囲んで表記する。終端記号は,そのタイプライタ
体の文字の並びだけからなる集合を表す。
例1 “+” は,+という1文字の並びを表す。“def” は,defという3文字の並びを表す。
b) 非終端記号
その名称を二重山括弧(《》)で囲んで表記する。非終端記号が表す文字の並びの集合は,生成規則に
よって定義する。
注記2 対応する国際規格では,非終端記号の表記に斜体字を用いている。
例2 次の生成規則によって定義される《2進数字》は,“0” 又は “1” を表す。
《2進数字》 ::
“0”|“1”
c) 一括
項列を縦線(|)で区切って並べたものを丸括弧[()]で囲んで表記する。一括は,そこに並んでい
る項列それぞれが表す文字の並びの集合の和集合を表す。
例3 次の例は,《英数字》又は《行終端子》を表す。
( 《英数字》|《行終端子》 )
d) 特記項
語句を角括弧([])で囲んで表記する。特記項は,その語句に応じて,次のことを特記する。
1) 否定先読み
否定先読みは,[先読み∉ S]と表記する。Sは,終端記号をカンマ(,)で区切って並べたものを波
括弧({})で囲んで表記する。否定先読みは,Sに並んでいる非終端記号が表す文字の並びが,そ
の否定先読みの直後に現れてはならないという制約を表す。
例4 次の例では,《括弧なし実引数》が “{” で始まってはならないことを示している。
《括弧なし実引数》 ::
[先読み∉{“{”}] 《実引数リスト》
2) 禁止
禁止は,[T禁止]と表記する。Tは,一次項とする。禁止は,そこにTの表す文字の並びが現れて
はならないという制約を表す。
例5 次の例は,そこに《行終端子》が現れてはならないことを表す。
[《行終端子》禁止]
3) 必須
必須は,[T必須]と表記する。Tは,一次項とする。必須は,そこにTの表す文字の並びが一つ以
上現れなければならないという制約を表す。
例6 次の例は,一つ以上の《行終端子》が現れなければならないことを表す。
[《行終端子》必須]
4) その他の特記項
その他の特記項は,[U]と表記する。Uは,d) 1)〜d) 3)のいずれにも該当しない語句とする。この
特記項は,Uが示す文字の並びの集合を表すか,又は,その特記項が含まれる項列が表す文字の並
8
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
びの集合に対する,Uが示す制約を表す。
例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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
概念的名前を使用する。また,概念的名前は,意味規則の中だけで参照する非終端記号[例え
ば,《2項演算子》(11.4.4参照)]を定義する場合にも使用する。
例 次の例は,《代入》という概念的名前を定義する。《代入》は,《代入式》又は《代入文》のいずれかに
言及するために使うことができる。
《代入》 ::=
《代入式》
|《代入文》
5.3
意味規則
構文規則に対応する意味規則は,必要とする細分箇条の中に“意味規則”という見出しを設けその下に
記す。この規格では,プログラムの動作を,そのプログラムを評価するという過程によって規定する。プ
ログラム構成要素(非終端記号の表す文字の並び)を評価すると,通常,値がもたらされる。これをその
プログラム構成要素の(評価結果の)値という。意味規則は,対応する構文規則で規定されるプログラム
構成要素に対する評価の方法と評価結果の値とを規定する。
意味規則に記述されたあるプログラム構成要素に対する評価の手順の開始を,そのプログラム構成要素
の評価の開始,そのプログラム構成要素に対して行うべき手順がなくなった時点を,そのプログラム構成
要素の評価の終了という。あるプログラム構成要素の評価が開始され,かつ,そのプログラム構成要素の
評価が終了していない場合,そのプログラム構成要素は評価中であるという。
ある非終端記号Xに対する意味規則の記述がなく,かつ,Xの生成規則の右辺が他の非終端記号を縦線
(|)で区切って並べたものである場合,Xの意味規則は,Xが参照する他の非終端記号の意味規則に従
う。
例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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ドAND式》又は《演算子AND式》が表す文字の並びが《論理AND式》であるとみなされること
はない。しかし,《キーワードAND式》及び《演算子AND式》は,同じような意味規則をもつ
ため,それらをまとめて《論理AND式》の意味規則として記述する。意味規則において,“《論
理AND式》”は,《キーワードAND式》又は《演算子AND式》が表すプログラム構成要素を示
す。
5.4
実行環境の属性
実行環境(7.1参照)の属性の名前は,二重亀甲括弧(
)で囲んで表示する。
例
self
は実行環境の属性の一つである。
6
基本概念
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
概要
変数は名前によって表され,オブジェクトを参照する。そのオブジェクトは,その変数の値と呼ばれる。
変数自身はオブジェクトではない。一つの変数は一つのオブジェクトしか同時に参照できないが,一つの
オブジェクトは二つ以上の変数によって同時に参照できる。
変数があるオブジェクトを参照している場合,その変数はそのオブジェクトに束縛されているという。
この変数とオブジェクトとの結び付きを,変数束縛と呼ぶ。名前Nの変数が,オブジェクトOに束縛され
ているとき,Nをその束縛の名前と呼び,Oをその束縛の値と呼ぶ。
変数には,次の五つの種類がある。
− インスタンス変数(6.2.2参照),その名前は一つの “@” で始まる(例:“@var”)。
− 定数(6.5.2参照),その名前は大文字で始まる(例:“Const”)。
− クラス変数(6.5.2参照),その名前は“@@” で始まる(例:“@@var”)。
− 局所変数(9.2参照),その名前は小文字又は “̲” で始まる(例:“var”又は“̲var”)。
11
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− 大域変数(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
メソッド
メソッドは,オブジェクトに対して呼び出されたときに,そのオブジェクトに対する一連の計算を実行
する手続きである。メソッド自身はオブジェクトではない。オブジェクトに対し呼出し可能なメソッドの
集合によって,そのオブジェクトの動作が定義される。メソッドは一つの名前(又は,別名がある場合は
複数の名前)をもつ。この名前とメソッドとの関係をメソッド束縛と呼ぶ。名前NがメソッドMに束縛さ
れている場合,Nをその束縛の名前と呼び,Mをその束縛の値と呼ぶ。ある名前にメソッドが束縛されて
いるとき,その名前をそのメソッドのメソッド名と呼ぶ。オブジェクトに対してメソッド名の一つを指定
することによって,メソッドを呼び出すことができる。メソッド呼出しの対象となるオブジェクトを,メ
ソッド呼出しのレシーバと呼ぶ。
例 メソッド呼出し “obj.method(arg1, arg2)” において,“obj” をレシーバと呼び,“method”
をメソッド名と呼ぶ。メソッド呼出し式については,11.3を参照。
12
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
メソッドについては,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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
例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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
end
x.show
# abc を出力する。
y.show
# 例外が発生する。
例2 次のプログラムでは,特異メソッド定義によって,例1と同じ特異メソッド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
継承
クラスは,高々一つのクラスをその直接のスーパークラスとしてもつ。クラスAがクラスBをその直接
のスーパークラスとしてもつ場合,AはBの直接のサブクラスという。
あるプログラムで定義される全てのクラス(組込みクラスを含む。)は,クラス継承木と呼ばれる根付き
木構造を形成する。クラス継承木において,あるクラスの親はそのクラスの直接のスーパークラスとし,
あるクラスの子はそのクラスの直接のサブクラスとする。スーパークラスをもたないクラスは,一つだけ
あり,そのクラスはクラス継承木の根である。クラス継承木において,あるクラスの全ての祖先をそのク
ラスのスーパークラスと呼び,あるクラスの全ての子孫をそのクラスのサブクラスと呼ぶ。
クラスは,スーパークラスをもつ場合,定数,クラス変数,特異メソッド及びインスタンスメソッドを
そのスーパークラスから継承する(13.2.3参照)。オブジェクトCがクラスDの直接のインスタンスであ
る場合,Cは,D及びDの全てのスーパークラスに対して,そのインスタンスであるという。
例 次のプログラムは,三つのクラス,Xクラス,Yクラス及びZクラスを定義する。
class X
end
class Y < X
15
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
その代わりに,クラスは複数のモジュールをインクルードすることができる。次の例は,多重
継承の代わりにモジュールのインクルードを利用している。
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
実行環境
7.1
概要
実行環境とは,プログラムの評価に影響を与える属性の集合である。
実行環境はRuby言語の一部ではなく,プログラムの意味を記述するために,この規格において便宜的
に定義されている。処理系によるプログラムの評価結果は,この規格が規定するとおり,実行環境上で評
価した結果と同じでなければならない。
17
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
実行環境は,次に示す属性の集合からなる。実行環境のそれぞれの属性は,
大域変数束縛集合
を除き,
スタックを構成する。実行環境のそれぞれの属性の値は,プログラムの構成要素が評価されるときに変更
される。
実行環境は次のような属性をもつ。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
8
字句構造
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に規定しているとおり,箇条8及び15.2.15.4以外では,《行終端子》は生成規則から省かれている。
ただし,《行終端子》が現れてはならない場所,又は,現れなければならない場所をそれぞれ,特記項の禁
止[5.2.4 d) 2)参照]又は必須[5.2.4 d) 3)参照]で示す。
19
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
例 《文》は,《分離子》によって区切られる(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に規定しているとおり,箇条8及び15.2.15.4以外では,《空白類》は生成規則から省かれている。た
だし,《空白類》が現れてはならない場所,又は,現れなければならない場所をそれぞれ,特記項の禁止[5.2.4
d) 2)参照]又は必須[5.2.4 d) 3)参照]で示す。
20
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
8.5
コメント
構文規則
《コメント》 ::
《単一行コメント》
|《複数行コメント》
《単一行コメント》 ::
“#” 《コメント内容》?
《コメント内容》 ::
《行内容》
《行内容》 ::
《ソース文字》+ − ( 《ソース文字》* 《行終端子》 《ソース文字》* )
《複数行コメント》 ::
《複数行コメント開始行》 《複数行コメント行》?
《複数行コメント終了行》
《複数行コメント開始行》 ::
[行頭] “=begin” 《開始・終了行残り》? 《行終端子》
《複数行コメント終了行》 ::
[行頭] “=end” 《開始・終了行残り》? ( 《行終端子》|[プログラムの末尾] )
《開始・終了行残り》 ::
《空白類》+ 《コメント内容》
《複数行コメント行》 ::
《コメント行》 − 《複数行コメント終了行》
《コメント行》 ::
《コメント内容》 《行終端子》
[行頭]という記法は,プログラムの先頭,又は《行終端子》の直後の位置を表す。
《コメント》は,《単一行コメント》又は《複数行コメント》のいずれかである。5.2.3に規定しているとおり,
箇条8及び15.2.15.4以外では,《コメント》は生成規則から省かれている。
《単一行コメント》は,“#” で開始され,行末まで続く。行末の《行終端子》は,コメントには含まれない。
《単一行コメント》は,《行終端子》以外の任意の文字を含むことができる。
《複数行コメント》は,“=begin” が行頭に出現する行から開始され,“=end” が行頭に出現する行まで
続く。《単一行コメント》と異なり,《複数行コメント終了行》の《行終端子》は,コメントの一部とみなされ
る。
注記1 《行内容》は《ソース文字》の並びである。ただし,《行内容》の生成規則で規定しているとおり,
《行内容》の中に《行終端子》が出現してはならない。
注記2 コメントにISO/IEC 646:1991の国際基準版にない文字を含むプログラムは規格に厳密に適
合するプログラムではないが,規格適合プログラムにはなり得る。この規格のコード例では
利用者の利便性を考慮し,便宜上コメントに日本語を使用している。
21
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
|《代入風メソッド識別子》
《局所変数識別子》 ::
( ( 《小文字》|“̲” ) 《識別子文字》* ) − 《キーワード》
《大域変数識別子》 ::
“$” 《識別子開始文字》 《識別子文字》*
《クラス変数識別子》 ::
“@@” 《識別子開始文字》 《識別子文字》*
《インスタンス変数識別子》 ::
“@” 《識別子開始文字》 《識別子文字》*
《定数識別子》 ::
( 《大文字》 《識別子文字》* ) − 《キーワード》
《メソッド専用識別子》 ::
( 《定数識別子》|《局所変数識別子》 ) ( “!”|“?” )
《代入風メソッド識別子》 ::
( 《定数識別子》|《局所変数識別子》 ) “=”
《識別子文字》 ::
《小文字》
|《大文字》
|《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《前置子なし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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ある。
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進数字》の個数をnとして,《前置子なし
10進整数リテラル》の値と,《10進整数部》の値×10−nとを加算した値とする。
《指数付き浮動小数点数リテラル》の値は,nを《指数部》の値とするとき,《有効数字部》×10nの値とする。
《指数部》の値は,“-” が出現する場合,《10進整数部》の負数とし,そうではない場合,《10進整数部》
の値とする。
Integerクラスのインスタンスの値の範囲については,15.2.8.1を参照。
Floatクラスのインスタンスの値の精度については,15.2.9.1を参照。
26
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
例 '\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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
|“#” “{” 《複合文》 “}”
《英数字》 ::
《大文字》
|《小文字》
|《10進数字》
意味規則
《二重引用符文字列》は,二重引用符によってくくられた0個以上の文字からなる。二重引用符の対の中
の《二重引用符文字列文字》の並びは,文字列の内容を表す。
《二重エスケープ列》と《挿入文字並び》とを除き,《二重引用符文字列文字》は,プログラムテキスト中に
出現する文字を,文字どおりに表す。
《単純エスケープ列》は,表1に示す文字を表す。
表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参照)として評価する。評価結
果の値をVとする。
29
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) “#” 《クラス変数識別子》という形式の場合,《クラス変数識別子》(11.5.4.5参照)として評価する。評
価結果の値をVとする。
c) “#” 《インスタンス変数識別子》という形式の場合,《インスタンス変数識別子》(11.5.4.6参照)として
評価する。評価結果の値をVとする。
d) “#” “{” 《複合文》 “}” という形式の場合,《複合文》(10.2参照)として評価する。評価結果の値をV
とする。
e) VがStringクラスのインスタンスの場合,Vを《挿入文字並び》の値とする。
f)
そうではない場合,Vに対してto̲sメソッドを実引数なしで呼び出す。評価結果の値をSとする。
g) SがStringクラスのインスタンスの場合,Sを《挿入文字並び》の値とする。
h) そうではない場合,動作は未規定とする。
例 "1 + 1 = #{1 + 1}" は,“1 + 1 = 2” を内容としてもつ文字列を表す。
30
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
8.7.6.3.4
引用符非展開リテラル文字列
構文規則
《引用符非展開リテラル文字列》 ::
“%q” 《非展開区切り文字列》
《非展開区切り文字列》 ::
《リテラル開始区切り子》 《非展開リテラル文字列》* 《リテラル終了区切り子》
《非展開リテラル文字列》 ::
《非展開リテラル文字》
|《非展開区切り文字列》
《非展開リテラル文字》 ::
《非エスケープリテラル文字》
|《非展開リテラルエスケープ列》
《非エスケープリテラル文字》 ::
《ソース文字》 − 《引用符リテラルエスケープ文字》
《非展開リテラルエスケープ列》 ::
《非展開リテラルエスケープ文字並び》
|《非エスケープ非展開リテラル文字並び》
《非展開リテラルエスケープ文字並び》 ::
“\” 《非展開リテラルエスケープ文字》
《非展開リテラルエスケープ文字》 ::
《リテラル開始区切り子》
|《リテラル終了区切り子》
|“\”
《引用符リテラルエスケープ文字》 ::
《非展開リテラルエスケープ文字》
《非エスケープ非展開リテラル文字並び》 ::
“\” 《非エスケープ非展開リテラル文字》
《非エスケープ非展開リテラル文字》 ::
《ソース文字》 − 《非展開リテラルエスケープ文字》
《リテラル開始区切り子》 ::
《ソース文字》 − 《英数字》
《リテラル終了区切り子》 ::
《ソース文字》 − 《英数字》
《非展開区切り文字列》内の全ての《リテラル開始区切り子》は,同じ文字でなければならない。《非展開区
切り文字列》内の全ての《リテラル終了区切り子》は,同じ文字でなければならない。
《リテラル開始区切り子》が表2の左側の列の文字である場合,対応する《リテラル終了区切り子》は,表
2の右側の列の対応する文字でなければならない。そうではない場合,《リテラル終了区切り子》は,対応
する《リテラル開始区切り子》と同じ文字でなければならない。
31
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
表2−《リテラル開始区切り子》と《リテラル終了区切り子》との対応
《リテラル開始区切り子》 《リテラル終了区切り子》
“{”
“}”
“(”
“)”
“[”
“]”
“<”
“>”
《引用符非展開リテラル文字列》内の《非展開リテラル文字列》の《非展開区切り文字列》は,その《非展開区
切り文字列》の《リテラル開始区切り子》が表2の左側の列の文字である場合にだけ適用する。
注記1 《引用符非展開リテラル文字列》は,《リテラル開始区切り子》及び対応する《リテラル終了区切
り子》について,入れ子の括弧をもつことができる(例えば “%q[[abc][def]]”)。これら
の二つの括弧と異なる括弧及びエスケープされた括弧は,この入れ子関係では無視される。
例えば,“%q[\[abc\)def(]” は,“[abc\)def(” を内容としてもつStringクラスの直
接のインスタンスを表す。この場合,《リテラル開始区切り子》及び対応する《リテラル開始区
切り子》はそれぞれ “[” 及び “]” であるため,“[”,“]” 及び “\” だけが《非展開リテラル
エスケープ文字》となることができる。
意味規則
《引用符非展開リテラル文字列》の値は,その《引用符非展開リテラル文字列》の《非展開区切り文字列》の
《非展開リテラル文字列》群が表す内容を連結した内容をもつ文字列を表す。
《非展開リテラル文字列》の値は,《非展開リテラルエスケープ文字並び》を除き,プログラムテキスト中
に出現する文字列を,文字どおりに表す。
注記2 《非展開リテラル文字列》によって表される文字列の内容は,その《非展開リテラル文字列》内
の《非展開区切り文字列》の《リテラル開始区切り子》及び《リテラル終了区切り子》を含む。例
えば,“%q((abc))” は “(abc)” という内容をもつStringクラスの直接のインスタンス
を表す。
《非展開リテラルエスケープ文字並び》の値は次のような文字を表す。“\\” は単一の “\” を表す。“\”
《リテラル開始区切り子》は《リテラル開始区切り子》を表す。“\” 《リテラル終了区切り子》は《リテラル終了
区切り子》を表す。
32
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
8.7.6.3.5
引用符展開リテラル文字列
構文規則
《引用符展開リテラル文字列》 ::
“%” “Q”? 《展開区切り文字列》
《展開区切り文字列》 ::
《リテラル開始区切り子》 《展開リテラル文字列》* 《リテラル終了区切り子》
《展開リテラル文字列》 ::
《展開リテラル文字》
|《展開区切り文字列》
《展開リテラル文字》 ::
《非エスケープリテラル文字》 − “#”
|“#” [先読み∉{“$”, “@”, “{”}]
|《二重エスケープ列》
|《挿入文字並び》
《展開区切り文字列》内の全ての《リテラル開始区切り子》は,同じ文字でなければならない。《展開区切り
文字列》内の全ての《リテラル終了区切り子》は,同じ文字でなければならない。
《リテラル終了区切り子》は,8.7.6.3.4で規定されるとおり,《リテラル開始区切り子》と対応した文字で
なければならない。
《引用符展開リテラル文字列》内の《展開リテラル文字列》の《展開区切り文字列》は,その《展開区切り文字
列》の《リテラル開始区切り子》が8.7.6.3.4の表2の左側の列の文字である場合にだけ適用する。
意味規則
《引用符展開リテラル文字列》の値は,その《引用符展開リテラル文字列》の《展開区切り文字列》の《展開リ
テラル文字列》群が表す内容を連結した内容をもつ文字列を表す。
《展開リテラル文字列》中の文字は,《二重エスケープ列》及び《挿入文字並び》を除き,プログラムテキス
ト中に出現する文字を文字どおりに表現する。《二重エスケープ列》及び《挿入文字並び》は8.7.6.3.3で規定
する文字を表現する。
注記 《展開リテラル文字列》によって表される文字列の内容は,その《展開リテラル文字列》内の《展開
区切り文字列》の《リテラル開始区切り子》及び《リテラル終了区切り子》を含む。例えば,
“%Q((#{1 + 2}))” は “(3)” という内容をもつ文字列を表す。
8.7.6.3.6
ヒアドキュメント
構文規則
《ヒアドキュメント》 ::
《ヒアドキュメント開始行》 《ヒアドキュメント本体》 《ヒアドキュメント終端行》
《ヒアドキュメント開始行》 ::
《ヒアドキュメント指示子》 《行残り》
《ヒアドキュメント指示子》 ::
“<<” 《ヒアドキュメント区切り子特定子》
《行残り》 ::
《行内容》? 《行終端子》
33
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《ヒアドキュメント本体》 ::
《ヒアドキュメント本体行》*
《ヒアドキュメント本体行》 ::
( 《行内容》 《行終端子》 ) − 《ヒアドキュメント終端行》
《ヒアドキュメント区切り子特定子》 ::
“-”? 《ヒアドキュメント区切り子》
《ヒアドキュメント区切り子》 ::
《非引用区切り子》
|《一重引用符区切り子》
|《二重引用符区切り子》
|《コマンド引用区切り子》
《非引用区切り子》 ::
《非引用区切り子識別子》
《非引用区切り子識別子》 ::
《識別子文字》*
《一重引用符区切り子》 ::
“'” 《一重引用符区切り子識別子》 “'”
《一重引用符区切り子識別子》 ::
( 《ソース文字》* ) − ( 《ソース文字》* ( “'”|《行終端子》 ) 《ソース文字》* )
《二重引用符区切り子》 ::
“"” 《二重引用符区切り子識別子》 “"”
《二重引用符区切り子識別子》 ::
( 《ソース文字》* ) − ( 《ソース文字》* ( “"”|《行終端子》 ) 《ソース文字》* )
《コマンド引用区切り子》 ::
“ʻ” 《コマンド引用区切り子識別子》 “ʻ”
《コマンド引用区切り子識別子》 ::
( 《ソース文字》* ) − ( 《ソース文字》* ( “ʻ”|《行終端子》 ) 《ソース文字》* )
《ヒアドキュメント終端行》 ::
《インデント付きヒアドキュメント終端行》
|《インデントなしヒアドキュメント終端行》
《インデント付きヒアドキュメント終端行》 ::
[行頭] 《空白類》* 《ヒアドキュメント区切り子識別子》 《行終端子》
《インデントなしヒアドキュメント終端行》 ::
[行頭] 《ヒアドキュメント区切り子識別子》 《行終端子》
《ヒアドキュメント区切り子識別子》 ::
《非引用区切り子識別子》
|《一重引用符区切り子識別子》
|《二重引用符区切り子識別子》
|《コマンド引用区切り子識別子》
34
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《ヒアドキュメント》内の《ヒアドキュメント指示子》,《ヒアドキュメント本体》及び《ヒアドキュメント終
端行》は一つの単位として扱われ,《ヒアドキュメント指示子》が現れた位置に現れる単一の字句であるとみ
なされる。《行残り》の最初の文字が,《ヒアドキュメント》が処理された直後の入力の先頭となる。
《ヒアドキュメント終端行》の形式は,《ヒアドキュメント区切り子特定子》の “-” が出現するかどうかに
よって決まる。
《ヒアドキュメント区切り子特定子》が文字 “-” から始まる場合,《インデント付きヒアドキュメント終
端行》という形式の行が,《ヒアドキュメント終端行》とみなされる。そうではない場合,《インデントなし
ヒアドキュメント終端行》という形式の行が,《ヒアドキュメント終端行》とみなされる。どちらの形式にお
いても,《ヒアドキュメント区切り子識別子》は,《ヒアドキュメント区切り子》の該当する部分と同じ文字
の並びでなければならない。
《ヒアドキュメント区切り子》が《非引用区切り子》という形式の場合,《ヒアドキュメント区切り子識別
子》は,《非引用区切り子識別子》と同じ文字の並びでなければならない。《ヒアドキュメント区切り子》が《一
重引用符区切り子》という形式の場合,《ヒアドキュメント区切り子識別子》は,《一重引用符区切り子識別
子》と同じ文字の並びでなければならない。《ヒアドキュメント区切り子》が《二重引用符区切り子》という形
式の場合,《ヒアドキュメント区切り子識別子》は,《二重引用符区切り子》と同じ文字の並びでなければな
らない。《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式の場合,《ヒアドキュメント区
切り子識別子》は,《コマンド引用区切り子識別子》と同じ文字の並びでなければならない。
意味規則
《ヒアドキュメント》の評価結果の値は,Stringクラスの直接のインスタンス,又は “ʻ” メソッドの呼
出し結果である。
《ヒアドキュメント》の評価結果であるオブジェクトは,次のように作成する。
a) 《ヒアドキュメント本体》からStringクラスの直接のインスタンスSを作る。その内容は,次に示す
とおり《ヒアドキュメント区切り子》の形式に依存する。
− 《ヒアドキュメント区切り子》が《一重引用符区切り子》という形式の場合,Sの内容は,この《ヒアド
キュメント本体》の《ソース文字》の並びとする。
− 《ヒアドキュメント区切り子》が《非引用区切り子》,《二重引用符区切り子》又は《コマンド引用区切り
子》という形式である場合,Sの内容は,《ヒアドキュメント本体》を《二重引用符文字列文字》
(8.7.6.3.3参照)の並びとみなした場合に,その《ヒアドキュメント本体》が表す文字の並びとする。
b) 《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式でない場合,SをVとする。
c) 《ヒアドキュメント区切り子》が《コマンド引用区切り子》という形式である場合,現在のselfに対し,S
を要素とする一要素のリストを実引数リストとして,“ʻ” メソッドを呼び出す。呼出し結果の値をV
とする。
d) 《ヒアドキュメント》の評価結果の値は,Vとする。
35
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
8.7.6.3.7
外部コマンド実行
構文規則
《外部コマンド実行》 ::
《逆引用符外部コマンド実行》
|《引用符外部コマンド実行》
《逆引用符外部コマンド実行》 ::
“ʻ” 《逆引用符外部コマンド実行文字》* “ʻ”
《逆引用符外部コマンド実行文字》 ::
《ソース文字》 − ( “ʻ”|“#”|““” )
|“#” [先読み∉{“$”, “@”, “{”}]
|《二重エスケープ列》
|《挿入文字並び》
《引用符外部コマンド実行》 ::
“%x” 《展開区切り文字列》
意味規則
《外部コマンド実行》は,“ʻ” メソッドを呼び出すための形式である。
《外部コマンド実行》は,次の手順で評価する。
a) 《外部コマンド実行》が《逆引用符外部コマンド実行》の場合,《逆引用符外部コマンド実行文字》が表現
する文字の並びを内容とするStringクラスの直接のインスタンスSを作成する。《逆引用符外部コ
マンド実行文字》は,《二重エスケープ列》及び《挿入文字並び》を除き,プログラムテキスト中に出現す
る文字を文字どおりに表現する。《二重エスケープ列》及び《挿入文字並び》は,8.7.6.3.3で規定する文
字を表現する。
b) 《外部コマンド実行》が《引用符外部コマンド実行》の場合,“%x” を “%Q” で置き換えてできる《引用符
展開リテラル文字列》を,8.7.6.3.5で規定するとおりに評価することで,Stringクラスの直接のイン
スタンスSを作成する。
c) 現在のselfに対し,“ʻ” メソッドを,Sを要素とする一要素のリストを実引数リストとして呼び出す。
d) 呼出し結果の値を《外部コマンド実行》の値とする。
8.7.6.4
配列リテラル
構文規則
《配列リテラル》 ::
《引用符非展開配列生成子》
|《引用符展開配列生成子》
《引用符非展開配列生成子》 ::
“%w” 《リテラル開始区切り子》 《非展開配列内容》 《リテラル終了区切り子》
《非展開配列内容》 ::
《引用符配列要素分離子リスト》? 《非展開配列要素リスト》? 《引用符配列要素分離子リスト》?
《非展開配列要素リスト》 ::
《非展開配列要素》 ( 《引用符配列要素分離子リスト》 《非展開配列要素》 )*
《引用符配列要素分離子リスト》 ::
36
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《引用符配列要素分離子》+
《引用符配列要素分離子》 ::
《空白類》
|《行終端子》
《非展開配列要素》 ::
《非展開配列要素文字》+
《非展開配列要素文字》 ::
《非エスケープ配列文字》
|《非展開配列エスケープ列》
《非エスケープ配列文字》 ::
《非エスケープリテラル文字》 − 《引用符配列要素分離子》
《非展開配列エスケープ列》 ::
《非展開リテラルエスケープ列》
|“\” 《引用符配列要素分離子》
《引用符展開配列生成子》 ::
“%W” 《リテラル開始区切り子》 《展開配列内容》 《リテラル終了区切り子》
《展開配列内容》 ::
《引用符配列要素分離子リスト》? 《展開配列要素リスト》? 《引用符配列要素分離子リスト》?
《展開配列要素リスト》 ::
《展開配列要素》 ( 《引用符配列要素分離子リスト》 《展開配列要素》 )*
《展開配列要素》 ::
《展開配列要素文字》+
《展開配列要素文字》 ::
《非エスケープ配列要素文字》
|“#” [先読み∉{“$”, “@”, “{”}]
|《展開配列エスケープ列》
|《挿入文字並び》
《非エスケープ配列要素文字》 ::
《ソース文字》 − ( 《引用符配列要素分離子》|“\”|“#” )
《展開配列エスケープ列》 ::
《二重エスケープ列》
|“\” 《引用符配列要素分離子》
《リテラル終了区切り子》は,8.7.6.3.4で規定されるとおり,《リテラル開始区切り子》に対応した文字で
なければならない。
《リテラル開始区切り子》が8.7.6.3.4の表2の左側の列のいずれの文字でもない場合,《非エスケープ配列
要素文字》はその《リテラル開始区切り子》であってはならない。
《リテラル開始区切り子》が8.7.6.3.4の表2の左側の列の文字であった場合,《引用符非展開配列生成子》
又は《引用符展開配列生成子》は,次の条件を満たさなければならない。ここで,Cはその《引用符非展開配
列生成子》又は《引用符展開配列生成子》を,Bは《リテラル開始区切り子》を,Eは8.7.6.3.4の表2でBに対
37
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
応する《リテラル終了区切り子》を,“y内のxの数”はy内に現れるxの数(ただし,《非展開配列エスケ
ープ列》又は《展開配列エスケープ列》内に現れる場合を除く。)を表す。
− C内のBの数とC内のEの数とが等しい。
− 最初のBから始まり,最後のEより前の位置で終わるCの任意の部分文字列Sについて,S内のBの
数がS内のEの数より大きい。
注記 上記の条件は《配列リテラル》内の入れ子の括弧のためにある。括弧の対応は,《配列リテラル》
の値の構造とは関係がない。例えば,“%w[[ab cd][ef]]” は “["[ab", "cd][ef]"]” を
表す。
意味規則
《配列リテラル》の評価結果はArrayクラスの直接のインスタンスとし,次の手順で評価を行う。
a) 《引用符非展開配列生成子》は次の手順で評価する。
1) Arrayクラスの空の直接のインスタンスを作成する。Aをこのインスタンスとする。
2) 《非展開配列要素リスト》が存在する場合,《非展開配列要素リスト》のそれぞれの《非展開配列要素》
について,次の手順を行う。
i)
《非展開配列要素文字》の並びで表現される中身をもったStringクラスの直接のインスタンスS
を作成する。
《非展開配列エスケープ列》を除く《非展開配列要素文字》は,プログラムテキストに現れるままの
文字を表現する。《非展開配列エスケープ列》は,8.7.6.3.4で示されているとおりに《非展開リテラ
ルエスケープ列》で表現される文字を表現する。ただし,“\” 《引用符配列要素分離子》という形式
の《非展開配列エスケープ列》は,その《引用符配列要素分離子》をプログラムテキスト中に出現す
る文字どおりに表現する。
ii) SをAの末尾に追加する。
3) 《引用符非展開配列生成子》の値はAとする。
b) 《引用符展開配列生成子》は,次の手順で評価する。
1) Arrayクラスの空の直接のインスタンスを作成する。Aをこのインスタンスとする。
2) 《展開配列要素リスト》が存在する場合,《展開配列要素リスト》のそれぞれの《展開配列要素》を次の
とおり処理する。
i)
《展開配列要素文字》の並びで表現される中身をもったStringクラスの直接のインスタンスSを
作成する。
《展開配列要素文字》は,《展開配列エスケープ列》及び《挿入文字並び》を除き,プログラムテキス
トに現れるままの文字を表現する。《展開配列エスケープ列》は,8.7.6.3.3で示されているとおり
に《二重エスケープ列》の表現する文字を表す。ただし,“\” 《引用符配列要素分離子》という形式
の《展開配列エスケープ列》は,その《引用符配列要素分離子》をプログラムテキスト中に出現する
文字どおりに表現する。《挿入文字並び》は,8.7.6.3.3で示されているような文字の並びを表現す
る。
ii) SをAの末尾に追加する。
3) 《引用符展開配列生成子》の値はAとする。
38
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
スのインスタンスのパターン属性内では無視する。
《正規表現リテラル》内及び《展開リテラル文字列》内の《挿入文字並び》の評価結果の値は,その《挿入文字
並び》を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.2,8.7.6.3.3又は8.7.6.3.4
に規定されているとおりに評価した場合に,評価結果の文字列中で文字0x00となるような,いかなるプロ
グラムテキスト上の文字の並びも含んではならない。
《非展開リテラル文字列》中に出現する《リテラル開始区切り子》は,《動的シンボル》の《リテラル開始区切
り子》と同じ文字でなければならない。
《リテラル終了区切り子》は,8.7.6.3.4で規定されるとおり,《リテラル開始区切り子》と対応していなけ
ればならない。
意味規則
40
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《シンボル》の評価結果は,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
変数のスコープ
9.1
概要
局所変数又は大域変数のスコープは静的スコープであり,それはプログラムテキスト上の範囲の集合と
する。
インスタンス変数,定数及びクラス変数は実行環境によって動的に決まるスコープをもつ。それらの束
縛は,実行環境の属性の値に従って探索される(11.5.4.2,11.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参照)。
Pを上記のプログラム構成要素の一つとする。Pの範囲から,Pの内部に入れ子になっているプログラ
ム構成要素(ただし《ブロック》を除く。)が占める部分を除いた範囲を,Sとする。このSを,そのプログ
ラム構成要素に対応する局所変数のスコープと呼ぶ。
ある局所変数のスコープは,その局所変数の束縛を含んでいる局所変数束縛の集合に対応している局所
変数のスコープである。
局所変数の参照となっている《局所変数識別子》に対して,その局所変数の束縛は,次の手順で解決され
る。
a) Nを《局所変数識別子》とする。Bを現在の局所変数束縛の集合とする。
b) SをBのスコープとする。
c) 名前がNである束縛がBの中に存在する場合,その束縛が解決された束縛となる。
d) 名前がNである束縛がBの中に存在しない場合には,次の手順を行う。
1) Sがある《ブロック》に対応する局所変数のスコープの場合,次の手順を行う。
i)
その《局所変数識別子》が《ブロック仮引数リスト》の《左辺》の場合,次の手順を実行するかどうか
は,処理系定義とする。
ii) Bを新たに,
局所変数束縛集合
の中で現在のBのすぐ下にある要素とする。そして,名前Nの
41
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
束縛を探索する処理を,手順b)から継続する。
2) そうではない場合,束縛は解決されないとみなされる。
9.3
大域変数のスコープ
大域変数のスコープは,プログラムの任意の位置から,その大域変数が参照できるという意味で大域的
である。大域変数束縛は,
大域変数束縛集合
の中に作られる。
10 プログラム構造
10.1 プログラム
構文規則
《プログラム》 ::
《複合文》
規格に厳密に適合するプログラムのプログラムテキストは,非終端記号《プログラム》が表す文字の並び
の集合の要素でなければならない。評価される可能性のないプログラム構成要素を含むプログラムの動作
は,未規定とする。
意味規則
《プログラム》は,次の手順で評価する。
a) 空集合を,
局所変数束縛集合
に積む。
b) 《複合文》を評価する。
c) 《複合文》の評価結果の値を,《プログラム》の値とする。
d)
局所変数束縛集合
の一番上の要素を取り除くことによって実行環境を復元する。
10.2 複合文
構文規則
《複合文》 ::
《文リスト》? 《分離子リスト》?
《文リスト》 ::
《文》 ( 《分離子リスト》 《文》 )*
《分離子リスト》 ::
《分離子》+
《分離子》 ::
“;”
|[《行終端子》必須]
意味規則
《複合文》は,次の手順で評価する。
a) その《複合文》の《文リスト》がない場合,《複合文》の値はnilとする。
b) その《複合文》の《文リスト》がある場合,《文リスト》のそれぞれの《文》を,プログラムテキストに現れ
る順に評価する。《文リスト》の中で最後に評価した《文》の評価結果の値を,《複合文》の値とする。
42
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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式》を評価する。評価結果の値をXと
する。
2) 評価対象の式が《演算子NOT式》の場合,その《括弧なしメソッド呼出し》又は《単項式》を評価する。
評価結果の値をXとする。
3) Xが真の場合,《論理NOT式》の値はfalseとする。
4) そうではない場合,《論理NOT式》の値はtrueとする。
b) 手順a) 3)及びa) 4)の代わりに《論理NOT式》を次のとおり評価してもよい。
1) 空の実引数リストLを作成する。Xに対し,“!@” メソッドを,Lを実引数リストとして呼び出す。
呼出し結果の値を《論理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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
意味規則
《論理AND式》は,次の手順で評価する。
a) 《論理AND式》が《等価式》である場合,その《等価式》を11.4.4で規定するとおりに評価する。
b) そうではない場合,次の手順を行う。
1) 《式》又は《演算子AND式》を評価する。評価結果の値をXとする。
2) Xが真の場合,《NOT式》又は《等価式》を評価する。評価結果の値をYとする。《論理AND式》の値
はYとする。
3) そうではない場合,《論理AND式》の値はXとする。
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式》を評価する。評価結果の値をXとする。
2) Xが偽の場合,《NOT式》又は《演算子AND式》を評価する。評価結果の値をYとする。《論理OR式》
の値はYとする。
3) そうではない場合,《論理OR式》の値はXとする。
11.3 メソッド呼出し式
11.3.1 概要
構文規則
《メソッド呼出し式》 ::=
《一次式メソッド呼出し》
|《括弧なしメソッド呼出し》
|《局所変数識別子》
《一次式メソッド呼出し》 ::
《省略可能実引数付きsuper》
|《添字メソッド呼出し》
|《メソッド専用識別子》
|《メソッド識別子》 《ブロック》
45
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
|《メソッド識別子》 《括弧付き実引数》 《ブロック》?
|《一次式》 [《行終端子》禁止] “.” 《メソッド名》 《括弧付き実引数》? 《ブロック》?
|《一次式》 [《行終端子》禁止] “::” 《メソッド名》 《括弧付き実引数》 《ブロック》?
|《一次式》 [《行終端子》禁止] “::” 《定数以外のメソッド名》 《ブロック》?
《メソッド識別子》 ::
《局所変数識別子》
|《定数識別子》
|《メソッド専用識別子》
《メソッド名》 ::
《メソッド識別子》
|《演算子メソッド名》
|《キーワード》
《添字メソッド呼出し》 ::
《一次式》 [《行終端子》禁止] [《空白類》禁止] “[” 《添字実引数リスト》? “]”
《定数以外のメソッド名》 ::
《メソッド名》 − 《定数識別子》
《括弧なしメソッド呼出し》 ::
《コマンド》
|《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《一次式メソッド呼出し》の《括弧付き実引数》(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) 《一次式メソッド呼出し》が《メソッド専用識別子》の場合,Oを現在のself,Mをその《メソッド専
用識別子》とする。空の実引数リストLを作成する。
ii) 《一次式メソッド呼出し》の《メソッド識別子》が存在する場合,次の手順を行う。
I)
現在のselfをO,その《メソッド識別子》をMとする。
II) 《括弧付き実引数》が存在する場合,11.3.2で規定するとおりに,《括弧付き実引数》から実引数
リスト及び《ブロック》を作成する。結果のリストをLとする。結果の《ブロック》(もしあれば)
をBとする。
《括弧付き実引数》が存在しない場合,空の実引数リストLを作成する。
III) 《ブロック》が存在する場合,それをBとする。
iii) 《一次式メソッド呼出し》の “.” が存在する場合,次の手順を行う。
I)
《一次式》を評価し,評価結果の値をOとする。《メソッド名》をMとする。
II) 《括弧付き実引数》が存在する場合,11.3.2で規定するとおりに,《括弧付き実引数》から実引数
リスト及び《ブロック》を作成する。結果のリストをLとする。結果の《ブロック》(もしあれば)
をBとする。
《括弧付き実引数》が存在しない場合,空の実引数リストLを作成する。
III) 《ブロック》が存在する場合,それをBとする。
iv) 《一次式メソッド呼出し》の “::” 及び《メソッド名》が存在する場合,次の手順を行う。
I)
《一次式》を評価し,評価結果の値をOとする。《メソッド名》をMとする。
II) 11.3.2で規定するとおりに,《括弧付き実引数》から実引数リスト及び《ブロック》を構成する。
結果のリストをLとする。結果の《ブロック》(もしあれば)をBとする。
III) 《ブロック》が存在する場合,それをBとする。
v) 《一次式メソッド呼出し》の “::” 及び《定数以外のメソッド名》が存在する場合,次の手順を行う。
I)
《一次式》を評価し,評価結果の値をOとする。《定数以外のメソッド名》をMとする。
II) 空の実引数リストLを作成する。
47
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
III) 《ブロック》が存在する場合,それをBとする。
4) メソッドMを,Oに対し,Lを実引数リスト,Bを《ブロック》(もしあれば)として呼び出す(13.3.3
参照)。呼出し結果の値を《一次式メソッド呼出し》の値とする。
b) 《添字メソッド呼出し》は,次の手順で評価する。
1) 《一次式》を評価する。評価結果の値をOとする。
2) 《添字実引数リスト》が存在する場合,11.3.2で規定するとおりに,《添字実引数リスト》から実引数
リストを作成する。このリストをLとする。
3) 《添字実引数リスト》が存在しない場合,空の実引数リストLを作成する。
4) “[]” メソッドを,Oに対し,Lを実引数リストとして呼び出す。呼出し結果の値を《添字メソッド
呼出し》の値とする。
c) 《括弧なしメソッド呼出し》は,次の手順で評価する。
1) 《括弧なしメソッド呼出し》が《コマンド》の場合,それを手順d)で規定するとおりに評価する。評価
結果の値を《括弧なしメソッド呼出し》の値とする。
2) 《括弧なしメソッド呼出し》が《実引数付きreturn》,《実引数付きbreak》又は《実引数付きnext》(11.5.2.4
参照)の場合,それを評価する。この評価によって,11.5.2.4で規定するように他のプログラム要素
に制御が移る。
3) 《括弧なしメソッド呼出し》の《doブロック付き連鎖コマンド》が存在する場合,次の手順を行う。
i)
《doブロック付き連鎖コマンド》を手順e)で規定するとおりに評価する。評価結果の値をVとする。
ii) 《括弧なしメソッド呼出し》の《メソッド名》及び《括弧なし実引数》が存在する場合,次の手順を行
う。
I)
《メソッド名》をMとする。
II) 11.3.2で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストをLと
する。《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック
実引数》に対応する《ブロック》[11.3.2 e) 6) 参照]をBとする。
III) メソッドMを,Vに対し,Lを実引数リスト,Bを《ブロック》(もしあれば)として呼び出す。
IV) Vの値を,呼出し結果の値に置き換える。
iii) 《括弧なしメソッド呼出し》の値はVとする。
d) 《コマンド》は,次の手順で評価する。
1) 《コマンド》が《実引数付きsuper》又は《実引数付きyield》の場合,それを11.3.4又は11.3.5で規定す
るとおりに評価する。評価結果の値を《コマンド》の値とする。
2) そうではない場合,次の手順を行う。
i)
《コマンド》の《メソッド識別子》が存在する場合,次の手順を行う。
I)
現在のselfをO,その《メソッド識別子》をMとする。
II) 11.3.2で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストをLと
する。
《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック実引
数》に対応する《ブロック》をBとする。
ii) 《コマンド》の《一次式》(11.5参照),《メソッド名》及び《括弧なし実引数》が存在する場合,次の手
順を行う。
I)
《一次式》を評価する。評価結果の値をOとする。《メソッド名》をMとする。
48
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
II) 11.3.2で規定するとおりに,《括弧なし実引数》から実引数リストを作成し,そのリストをLと
する。
《括弧なし実引数》の《実引数リスト》の《ブロック実引数》が存在する場合,その《ブロック実引
数》に対応する《ブロック》をBとする。
iii) メソッドMを,Oに対し,Lを実引数リスト,Bを《ブロック》(もしあれば)として呼び出す。
呼出し結果の値を《コマンド》の値とする。
e) 《doブロック付き連鎖コマンド》は,次の手順で評価する。
1) 《doブロック付きコマンド》を手順f)で規定するとおりに評価し,評価結果の値をVとする。
2) プログラムテキストに現れる順に,それぞれの《連鎖メソッド呼出し》について次の手順を行う。
i)
《連鎖メソッド呼出し》の《メソッド名》をMとする。
ii) 《括弧付き実引数》が存在する場合,11.3.2で規定するとおりに,《括弧付き実引数》から実引数リ
スト及び《ブロック》を作成する。結果のリストをLとする。結果の《ブロック》(もしあれば)を
Bとする。
《括弧付き実引数》が存在しない場合,空の実引数リストLを作成する。
iii) メソッドMを,Vに対し,Lを実引数リスト,Bを《ブロック》(もしあれば)として呼び出す。
iv) Vの値を,呼出し結果の値で置き換える。
3) 《doブロック付き連鎖コマンド》の値は,Vとする。
f)
《doブロック付きコマンド》は,次の手順で評価する。
1) 《doブロック付きコマンド》が《実引数・doブロック付きsuper》の場合,それを11.3.4で規定すると
おりに評価する。評価結果の値を《doブロック付きコマンド》の値とする。
2) そうではない場合,次の手順を行う。
i)
《doブロック付きコマンド》の《メソッド識別子》が存在する場合,現在のselfをO,《メソッド
識別子》をMとする。
ii) 《doブロック付きコマンド》の《一次式》が存在する場合,《一次式》を評価し,評価結果の値をO,
《メソッド名》をMとする。
iii) 《doブロック付きコマンド》の《括弧なし実引数》から実引数リストを作成し,そのリストをLと
する。
iv) メソッドMを,Oに対し,Lを実引数リスト,《doブロック》を《ブロック》として呼び出す。呼
出し結果の値を《doブロック付きコマンド》の値とする。
49
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.3.2 メソッド実引数
構文規則
《メソッド実引数》 ::=
《添字実引数リスト》
|《括弧付き実引数》
|《括弧なし実引数》
《添字実引数リスト》 ::
《コマンド》
|《演算子式リスト》 ( [《行終端子》禁止] “,” )?
|《演算子式リスト》 [《行終端子》禁止] “,” 《散開実引数》
|《連想リスト》 ( [《行終端子》禁止] “,” )?
|《散開実引数》
《散開実引数》 ::
“*” 《演算子式》
《演算子式リスト》 ::
《演算子式》 ( [《行終端子》禁止] “,” 《演算子式》 )*
《括弧付き実引数》 ::
[《行終端子》禁止] [《空白類》禁止] 《括弧及び実引数》
《括弧及び実引数》 ::
“(” “)”
|“(” 《実引数リスト》 “)”
|“(” 《演算子式リスト》 [《行終端子》禁止] “,” 《doブロック付き連鎖コマンド》 “)”
|“(” 《doブロック付き連鎖コマンド》 “)”
《括弧なし実引数》 ::
[先読み∉{“{”}] [《行終端子》禁止] 《実引数リスト》
《実引数リスト》 ::
《ブロック実引数》
|《散開実引数》 ( “,” 《ブロック実引数》 )?
|《演算子式リスト》 [《行終端子》禁止] “,” 《連想リスト》
( [《行終端子》禁止] “,” 《散開実引数》 )? ( [《行終端子》禁止] “,” 《ブロック実引数》 )?
|( 《演算子式リスト》|《連想リスト》 )
( [《行終端子》禁止] “,” 《散開実引数》 )? ( [《行終端子》禁止] “,” 《ブロック実引数》 )?
|《コマンド》
《ブロック実引数》 ::
“&” 《演算子式》
《括弧なし実引数》が,“&”,“<<”,“+”,“-”,“*”,“/” 及び “%” のいずれかの文字の並びで始まる場
合,次の条件を満たさなければならない。
− その《括弧なし実引数》の直前に一つ以上の《空白類》が存在しなければならない。
− その文字の並びの直後に《空白類》が存在してはならない。
50
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記 例えば,“x␣-y” は,“x(-y)” と同じとみなされる。“x-y” 及び “x␣-␣y” は,“x()␣-␣
y” とみなされる。ここで,“␣”は空白を表す。
意味規則
《メソッド実引数》の値は,実引数リスト及び《ブロック》の二つとし,メソッド呼出し時にそれらの値を
使用する。ただし,評価手順によっては《ブロック》を値としてもたないこともある。
《メソッド実引数》は次の手順で評価する。
a) 《添字実引数リスト》は,次の手順で評価する。
1) 空の実引数リストLを作成する。
2) プログラムテキストに現れる順に,《コマンド》,《演算子式リスト》の《演算子式》又は《連想リスト》
を評価し,評価結果の値をLの末尾に追加する。
3) 《散開実引数》が存在する場合,それを評価し,評価結果の実引数リストをLの末尾に連結する。
4) Lを《添字実引数リスト》の値の実引数リストとする。
b) 《散開実引数》は,次の手順で評価する。
1) 空の実引数リストLを作成する。
2) 《演算子式》を評価する。評価結果の値をVとする。
3) VがArrayクラスのインスタンスでない場合の動作は未規定とする。
4) Vのそれぞれの要素を,添字順に,Lの末尾に追加する。
5) Lを《散開実引数》の値の実引数リストとする。
c) 《括弧付き実引数》は,次の手順で評価する。
1) 空の実引数リストLを作成する。
2) 《実引数リスト》が存在する場合,それを手順e)のとおり評価し,その評価結果の実引数リストをL
の末尾に連結する。《実引数リスト》の《ブロック実引数》が存在する場合,《実引数リスト》の値の《ブ
ロック》を,《括弧付き実引数》の値の《ブロック》とする。
3) 《演算子式リスト》が存在する場合,《演算子式リスト》のそれぞれの《演算子式》に対し,それらがプ
ログラムテキストに現れる順に,次の手順を実行する。
i)
《演算子式》を評価する。評価結果の値をVとする。
ii) Vを,Lの末尾に追加する。
4) 《doブロック付き連鎖コマンド》が存在する場合,それを評価する。評価結果の値をLの末尾に追加
する。
5) Lを《括弧付き実引数》の値の実引数リストとする。
d) 《括弧なし実引数》は,次の手順で評価する。
1) 《括弧なし実引数》の最初の文字が “(” である場合,動作は未規定とする。
2) 《実引数リスト》を,手順e)のとおり評価する。
3) Lを処理結果のリストとする。
e) 《実引数リスト》は,次の手順で評価する。
1) 空の実引数リストLを作成する。
2) 《コマンド》が存在する場合,それを評価する。評価結果の値をLの末尾に追加する。
3) 《演算子式リスト》が存在する場合,《演算子式リスト》のそれぞれの《演算子式》に対し,それらがプ
ログラムテキストに現れる順に,次のとおり処理する。
i)
《演算子式》を評価する。評価結果の値をVとする。
51
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ii) Vを,Lの末尾に追加する。
4) 《連想リスト》が存在する場合,それを評価する。評価結果の値をLの末尾に追加する。
5) 《散開実引数》が存在する場合,それを基に実引数リストを作成し,その実引数リストをLの末尾に
連結する。
6) 《ブロック実引数》が存在する場合,次の手順を行う。
i)
《ブロック実引数》の《演算子式》を評価する。評価結果の値をPとする。
ii) PがProcクラスのインスタンスでない場合,動作は未規定とする。
iii) PがProcクラスのインスタンスである場合,Pが表す《ブロック》を,《ブロック実引数》の値の《ブ
ロック》とする。
7) Lを《実引数リスト》の値の実引数リストとする。
11.3.3 ブロック
構文規則
《ブロック》 ::
《波括弧ブロック》
|《doブロック》
《波括弧ブロック》 ::
[《行終端子》禁止] “{” 《ブロック仮引数》? 《ブロック本体》 “}”
《doブロック》 ::
[《行終端子》禁止] “do” 《ブロック仮引数》? 《ブロック本体》 “end”
《ブロック仮引数》 ::
“|” “|”
|“||”
|“|” 《ブロック仮引数リスト》 “|”
《ブロック仮引数リスト》 ::
《左辺》
|《多重代入左辺》
《ブロック本体》 ::
《複合文》
《ブロック仮引数リスト》の中に存在する,《左辺》(11.4.2.4参照)が,次のいずれかの形式であることが
許可されるか否かは,処理系定義とする。
− 《定数識別子》
− 《大域変数識別子》
− 《インスタンス変数識別子》
− 《クラス変数識別子》
− 《一次式》 “[” 《添字実引数リスト》? “]”
− 《一次式》 ( “.”|“::” ) ( 《局所変数識別子》 | 《定数識別子》 )
− “::” 《定数識別子》
注記 既存の処理系の中には《ブロック仮引数》内に《定数識別子》などのプログラム構成要素を許すも
のがあるため,これらのプログラム構成要素が許されるかは処理系定義としている。今後の実
52
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
装では,これらのプログラム構成要素を許さないようにするのが望ましい。
《ブロック仮引数リスト》の《多重代入左辺》の《グループ化された左辺》(11.4.2.4参照)が,次の形式であ
ることが許可されるか否かは,処理系定義とする。
− “(” ( 《多重代入左辺項目》 “,” )+ “)”
意味規則
《ブロック》は,メソッド呼出しに渡される手続きである。
《ブロック》は,《yield式》(11.3.5参照)によって呼び出すことができる。その呼出しを《ブロック》呼出
しという。また,Procクラスに対して,その《ブロック》を渡してnewメソッドを呼び出すことによって
生成されたProcクラスのインスタンスに対して,callメソッド(15.2.17.4.3参照)を呼び出すことによ
っても,呼び出すことができる。
《ブロック》呼出しには,実引数を与えることができる。《ブロック》が《yield式》によって呼び出された場
合は,《yield式》に与えられた実引数が,《ブロック》呼出しの実引数となる。《ブロック》がcallメソッド
の呼出しによって呼び出された場合は,callメソッドの呼出しに与えられた実引数が,《ブロック》呼出
しの実引数となる。
《ブロック》は,それが渡されたメソッド呼出しの直前の実行環境の下で評価される。ただし,《ブロック》
が,メソッド呼出しに渡された後に,
局所変数束縛集合
内の変数束縛に変更を加えた場合,実行環境に
も影響が及ぶ。この(影響を受けている可能性のある)実行環境をEbとする。
《ブロック》が呼び出された際に,その《ブロック》は次の手順で評価する。
a) 現在の実行環境をEoとする。《ブロック》に与えられた実引数のリストをLとする。
b) 実行環境をEbに変更する。
c) 空の局所変数束縛の集合を
局所変数束縛集合
に積む。
d) 《doブロック》又は《波括弧ブロック》内に《ブロック仮引数リスト》が存在する場合,次の処理を行う。
1) 《ブロック仮引数リスト》が《左辺》又は《グループ化された左辺》のいずれかの形式である場合は,次
の手順を行う。
i)
Lの長さが0である場合,nilをXとする。
ii) Lの長さが1である場合,Lの唯一の要素をXとする。
iii) Lの長さが1より大きい場合,この手順の結果は未規定とする。
iv) 《ブロック仮引数リスト》が《左辺》という形式である場合,《単一変数代入式》(11.4.2.2.2参照)E
を評価する。ここで,Eの《変数》は《左辺》であり,Eの《演算子式》の値はXとする。
v) 《ブロック仮引数リスト》が《グループ化された左辺》という形式である場合,《多対多代入文》
(11.4.2.4参照)Eを評価する。ここで,Eの《多重代入左辺》は《グループ化された左辺》であり,
Eの《括弧なしメソッド呼出し》又は《演算子式》の値はXとする。
2) 《ブロック仮引数リスト》が《多重代入左辺》という形式であり,《多重代入左辺》が《グループ化された
左辺》ではない場合は,次の手順を行う。
i)
Lの長さが1の場合,次の手順を行う。
I) Lの唯一の要素がArrayクラスのインスタンスでない場合は,この手順の結果は未規定とする。
II) Lの要素を,同じ順序で含む実引数リストYを作る。
ii) Lの長さが0であるか,1より大きい場合は,LをYとする。
iii) 《多対多代入文》Eを,11.4.2.4で規定するとおりに評価する。ここで,Eの《多重代入左辺》は《ブ
ロック仮引数リスト》であり,Eの《多重代入右辺》から作られる実引数リストはYとする。
53
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
e) 《ブロック本体》を評価する。
1) 《ブロック本体》の評価が《break式》によって終了した場合は,次の手順を行う。
i)
《ブロック》が呼び出された時点で,《ブロック》が渡されたメソッド呼出しが既に終了していた場
合は,次の手順を行う。
I)
名前が “break” であるSymbolクラスのインスタンスを,Sとする。
II) 《break式》の《ジャンプ実引数》が存在した場合,その《ジャンプ実引数》の値をVとする。それ
以外の場合は,nilをVとする。
III) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value”
であって値がVであるインスタンス変数束縛とをもつLocalJumpErrorクラスの直接のイン
スタンスを例外として発生させる。
ii) それ以外の場合は,実行環境をEoに復元し,現在のメソッド呼出しの13.3.3 i)の手順を終了し,
13.3.3 j)の手順を実行する。
《break式》の《ジャンプ実引数》が存在した場合,現在のメソッド呼出しの値はその《ジャンプ実引数》
の値とする。それ以外の場合は,現在のメソッド呼出しの値はnilとする。
2) 《ブロック本体》の評価が《redo式》によって終了された場合は,手順e)を再び実行する。
3) 《ブロック本体》の評価が《next式》によって終了された場合は,次の手順を行う。
i)
《next式》の《ジャンプ実引数》が存在した場合,その《ジャンプ実引数》の値をVとする。
ii) そうではない場合,nilをVとする。
4) 《ブロック本体》の評価が《return式》によって終了された場合は,
局所変数束縛集合
の一番上の値を
取り除く。
5) それ以外によって終了された場合は,《ブロック本体》の評価結果の値をVとする。
f)
手順e) が《return式》によって終了された場合を除き,実行環境をEoに復元する。
g) 《doブロック》又は《波括弧ブロック》の呼出しの評価結果は,Vとする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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) Aを空のリストとする。Bを
ブロック
の一番上の要素とする。
1) 《super式》が《省略可能実引数付きsuper》であり,《括弧付き実引数》及び《ブロック》のいずれも存在
しない場合は,次のとおり実引数のリストを作成する。
i)
Mを現在のメソッド呼出しに対応するメソッドとする。Mの《メソッド仮引数部》の《仮引数リス
ト》を,Lとする。現在のメソッド呼出しに対応する
局所変数束縛集合
内の局所変数束縛の集合
を,Sとする。
ii) 《必須仮引数リスト》がL内に存在した場合,それぞれの《必須仮引数》pに対し,次の手順を行う。
I) S内の名前がpである束縛の値を,vとする。
II) vをAの末尾に追加する。
iii) 《省略可能仮引数リスト》がL内に存在した場合,それぞれの《省略可能仮引数》pに対し,次の手
順を行う。
I) pの《省略可能仮引数名》を,nとする。
II) S内の名前がnである束縛の値を,vとする。
III) vをAの末尾に追加する。
iv) 《配列仮引数》がL内に存在した場合,次の手順を行う。
I)
《配列仮引数》の《配列仮引数名》を,nとする。
II) S内の名前がnである束縛の値を,vとする。vのそれぞれの要素に対し,添字順に,Aの末尾
に追加する。
2) 《super式》が《省略可能実引数付きsuper》であり,《括弧付き実引数》若しくは《ブロック》のいずれか,
又は両方が存在する場合は,次の手順を実行する。
i)
《括弧付き実引数》が存在する場合,11.3.2で規定するとおりに,実引数のリスト及び《ブロック》
を作成する。作成されたリストをAとし,作成された《ブロック》(もしあれば)をBとする。
ii) 《ブロック》が存在する場合,その《ブロック》をBとする。
3) 《super式》が《実引数付きsuper》の場合,11.3.2で規定するとおりに,《括弧なし実引数》から実引数の
リストを作成する。作成したリストをAとする。《括弧なし実引数》の《実引数リスト》の《ブロック
実引数》が存在する場合,《ブロック実引数》から作成された《ブロック》をBとする。
4) 《super式》が《実引数・doブロック付きsuper》の場合,11.3.2で規定するとおりに,《括弧なし実引数》
から実引数のリストを作成する。作成されたリストをAとする。《doブロック》をBとする。
c) 呼び出すメソッドを,次の手順によって決定する。
1) Cを現在のクラス又はモジュールとする。Nを
定義時メソッド名
の一番上の要素とする。
2) CがClassクラスのインスタンスである場合,次の手順を行う。
i)
名前がNであるメソッド束縛の探索を,13.3.4の手順b)のとおりに行う。ここで,13.3.4のCは
上記のCとする。
ii) 束縛が見つかり,その値がundef でない場合(13.1.1参照),Vをその束縛の値とする。
iii) そうではない場合,次の手順を行う。
55
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
I)
名前がNであるSymbolクラスの直接のインスタンスをAの先頭に追加する。
II) Aを実引数,Bを《ブロック》として,現在のselfに対しmethod̲missingメソッド(15.3.1.3.30
参照)を呼び出す。
III) 呼出し結果の値を《super式》の値とし,《super式》の評価を終了する。
3) CがModuleクラスのインスタンスであり,Classクラスのインスタンスではない場合,次の手順
を行う。
i)
CをMとし,現在のselfのクラスを新たなCとする。
ii) CのインクルードモジュールリストLmに,Mが含まれているどうかを確認する。
iii) Mが見つかった場合,次の手順を行う。
I) Lm中のモジュールに対して逆順に,Mの直前のモジュールから,先頭のモジュールまで処理す
る。それぞれのモジュールに対して,そのインスタンスメソッド束縛の集合内に,名前がNで
あるメソッド束縛が存在するかどうか確認する。
II) 束縛が見つかり,その値がundefでない場合,その束縛の値をVとする。
III) 束縛が見つかり,その値がundef(13.1.1参照)である場合,手順c) 2) iii) I)から手順c) 2) iii) III)
までを行う。
IV) 束縛が見つからず,Cが直接のスーパークラスをもつ場合,そのスーパークラスをSとし,手
順c) 2)を行う。ここで,手順c) 2)のCはSであるとする。
V) 束縛が見つからず,Cが直接のスーパークラスをもたない場合,手順c) 2) iii) I)から手順c) 2) iii)
III)までを行う。
iv) そうではない場合,Cの直接のスーパークラスを新たなCとし,手順c) 3) ii)から繰り返す。Cが
直接のスーパークラスをもたない場合の動作は未規定とする。
d) 13.3.3のg),h),i)及びj)を実行する。ここで,13.3.3のA,B,M,R及びVは,それぞれ,この細分
箇条のA,B,N,現在のself及びVとする。《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《実引数付きyield》の《括弧なし実引数》の《実引数リスト》に,《ブロック実引数》が存在してはならない
(11.3.2参照)。
意味規則
《yield式》は,次の手順で評価する。
a)
ブロック
の一番上の要素をBとする。Bがblock-not-givenの場合,次の手順を行う。
1) 名前が “noreason” であるSymbolクラスの直接のインスタンスを,Sとする。
2) 処理系定義の値をVとする。
3) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value” で
あって値がVであるインスタンス変数束縛とをもつLocalJumpErrorクラスの直接のインスタン
スを例外として発生させる。
b) 《省略可能実引数付きyield》は,次の手順で評価する。
1) 《省略可能実引数付きyield》が《括弧・実引数付きyield》という形式の場合,11.3.2で規定するとおり
に,《実引数リスト》から実引数のリストを作成する。作成されたリストをLとする。
2) 《省略可能実引数付きyield》が《括弧付き実引数なしyield》又は “yield” のいずれかの形式の場合,
空の実引数のリストを作成する。そのリストをLとする。
3) Lを実引数としてBを呼び出す(11.3.3参照)。
4) 《ブロック》呼出しの評価結果の値を,《省略可能実引数付きyield》の値とする。
c) 《実引数付きyield》は,次の手順で評価する。
1) 11.3.2で規定するとおりに,《括弧なし実引数》から実引数のリストを作成する。作成されたリスト
をLとする。
2) 11.3.3で規定するとおりに,Lを実引数としてBを呼び出す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.4.2 代入
11.4.2.1 概要
構文規則
《代入》 ::=
《代入式》
|《代入文》
《代入式》 ::
《単一代入式》
|《演算付き代入式》
|《rescue修飾子付き代入》
《代入文》 ::
《単一代入文》
|《演算付き代入文》
|《多重代入文》
意味規則
《代入》は,変数束縛の作成若しくは更新を行うか,又は,“=” で終わる名前のメソッドの呼出しを行う。
《代入式》及び《代入文》の評価は,11.4.2.2〜11.4.2.5で規定するとおりに行う。
11.4.2.2 単一代入
11.4.2.2.1 概要
構文規則
《単一代入》 ::=
《単一代入式》
|《単一代入文》
《単一代入式》 ::
《単一変数代入式》
|《スコープ付き定数代入式》
|《単一添字代入式》
|《単一メソッド代入式》
《単一代入文》 ::
《単一変数代入文》
|《スコープ付き定数代入文》
|《単一添字代入文》
|《単一メソッド代入文》
58
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.4.2.2.2 単一変数代入
構文規則
《単一変数代入》 ::=
《単一変数代入式》
|《単一変数代入文》
《単一変数代入式》 ::
《変数》 [《行終端子》禁止] “=” 《演算子式》
《単一変数代入文》 ::
《変数》 [《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
意味規則
《単一変数代入》は,次の手順で評価する。
a) 《演算子式》又は《括弧なしメソッド呼出し》を評価する。Vを評価結果の値とする。
b) 1) 《変数》(11.5.4参照)が《定数識別子》の場合,次の手順を行う。
i)
Nをその《定数識別子》とする。
ii) 現在のクラス又はモジュールの定数束縛の集合内に,名前がNである束縛が存在する場合,その
束縛の値をVで置き換える。
iii) そうではない場合,名前がNで,値がVである束縛を作成し,それを現在のクラス又はモジュー
ルの定数束縛の集合に追加する。
2) 《変数》が《大域変数識別子》の場合,次の手順を行う。
i)
Nをその《大域変数識別子》とする。
ii) 名前がNである束縛が,
大域変数束縛集合
内に存在する場合,その束縛の値をVで置き換える。
ただし,その束縛が,実行環境の初期化時に処理系が追加した束縛(7.2参照)である場合,その
動作は未規定とする。
iii) そうではない場合,名前がNで,値がVである束縛を作成し,それを
大域変数束縛集合
に追加
する。
3) 《変数》が《クラス変数識別子》の場合,次の手順を行う。
i)
クラスモジュールリスト
の一番上のリスト内の,特異クラスでない最初のクラス又はモジュー
ルを,Cとする。
Cとその全てのスーパークラスとを含む集合を,CSとする。CSのそれぞれの要素のインクル
ードモジュールリストについて,そこに含まれるモジュールを全て合わせた集合を,MSとする。
CS及びMSの和集合を,CMとする。
Nをその《クラス変数識別子》とする。
ii) CM内のクラス又はモジュールに,そのクラス変数束縛の集合内に名前がNである束縛をもつも
のが一つだけ存在した場合,その束縛をBとする。
CM内のクラス又はモジュールのうち,二つ以上のクラス又はモジュールが,名前がNである
束縛をそのクラス変数束縛の集合内にもつ場合,これらの束縛の中から,処理系定義のやり方で,
束縛Bを選ぶ。
Bの値を,Vで置き換える。
iii) CM内のクラス又はモジュールに,名前がNである束縛をそのクラス変数束縛の集合内にもつも
59
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
のが存在しなかった場合は,名前がNで,値がVである束縛を作成し,それをCのクラス変数束
縛の集合に追加する。
4) 《変数》が《インスタンス変数識別子》の場合,次の手順を行う。
i)
Nをその《インスタンス変数識別子》とする。
ii) 現在のselfのインスタンス変数束縛の集合内に,名前がNである束縛が存在する場合,その束縛
の値をVで置き換える。
iii) そうではない場合,名前がNで,値がVである束縛を作成し,それを現在のselfのインスタンス
変数束縛の集合に追加する。
5) 《変数》が《局所変数識別子》の場合,次の手順を行う。
i)
Nをその《局所変数識別子》とする。
ii) 名前がNである局所変数束縛を,9.2で規定するとおりに探す。
iii) 束縛が見つかった場合,その値をVで置き換える。
iv) そうではない場合,名前がNで,値がVである束縛を作成し,それを現在の局所変数束縛の集合
に追加する。
c) 《単一変数代入》の値は,Vとする。
11.4.2.2.3 スコープ付き定数代入
構文規則
《スコープ付き定数代入》 ::=
《スコープ付き定数代入式》
|《スコープ付き定数代入文》
《スコープ付き定数代入式》 ::
《一次式》 [《行終端子》禁止] [《空白類》禁止] “::” 《定数識別子》
[《行終端子》禁止] “=” 《演算子式》
|“::” 《定数識別子》 [《行終端子》禁止] “=” 《演算子式》
《スコープ付き定数代入文》 ::
《一次式》 [《行終端子》禁止] [《空白類》禁止] “::” 《定数識別子》
[《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
|“::” 《定数識別子》 [《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
意味規則
《スコープ付き定数代入》は,次の手順で評価する。
a) 《一次式》が存在する場合,それを評価し,評価結果の値をMとする。そうではない場合,MをObject
クラスとする。
b) MがModuleクラスのインスタンスの場合,次の手順を行う。
1) Nを《定数識別子》とする。
2) 《演算子式》又は《括弧なしメソッド呼出し》を評価する。Vを評価結果の値とする。
3) Mの定数束縛の集合内に,名前がNである束縛が存在する場合,その束縛の値をVで置き換える。
4) そうではない場合,名前がNで,値がVである束縛を作成し,それをMの定数束縛の集合に追加
する。
5) 《スコープ付き定数代入》の値は,Vとする。
60
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
c) MがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外と
して発生させる。
11.4.2.2.4 単一添字代入
構文規則
《単一添字代入》 ::=
《単一添字代入式》
|《単一添字代入文》
《単一添字代入式》 ::
《一次式》 [《行終端子》禁止] [《空白類》禁止] “[” 《添字実引数リスト》? “]”
[《行終端子》禁止] “=” 《演算子式》
《単一添字代入文》 ::
《一次式》 [《行終端子》禁止][《行終端子》禁止] “[” 《添字実引数リスト》? “]”
[《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
意味規則
《単一添字代入》は,次の手順で評価する。
a) 《一次式》を評価する。Oを評価結果の値とする。
b) 11.3.2で規定するとおりに,《添字実引数リスト》から実引数のリストを作成する。Lをそのリストとす
る。
c) 《演算子式》又は《括弧なしメソッド呼出し》を評価する。Vを評価結果の値とする。
d) Vを,Lの末尾に追加する。
e) “[]=” メソッドを,Oに対し,Lを実引数リストとして呼び出す。
f)
《単一添字代入》の値は,Vとする。
11.4.2.2.5 単一メソッド代入
構文規則
《単一メソッド代入》 ::=
《単一メソッド代入式》
|《単一メソッド代入文》
《単一メソッド代入式》 ::
《一次式》 [《行終端子》禁止] ( “.”|“::” ) 《局所変数識別子》
[《行終端子》禁止] “=” 《演算子式》
|《一次式》 [《行終端子》禁止] “.” 《定数識別子》
[《行終端子》禁止] “=” 《演算子式》
《単一メソッド代入文》 ::
《一次式》 [《行終端子》禁止] (“.”|“::”) 《局所変数識別子》
[《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
|《一次式》 [《行終端子》禁止] “.” 《定数識別子》
[《行終端子》禁止] “=” 《括弧なしメソッド呼出し》
意味規則
《単一メソッド代入》は,次の手順で評価する。
61
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) 《一次式》を評価する。Oを評価結果の値とする。
b) 《演算子式》又は《括弧なしメソッド呼出し》を評価する。Vを評価結果の値とする。
c) Mを《局所変数識別子》又は《定数識別子》とする。Mと “=” とを連結したものをNとする。
d) 名前がNであるメソッドを,Oに対し,ただ一つの値Vを含む実引数リストとともに呼び出す。
e) 《単一メソッド代入》の値は,Vとする。
11.4.2.3 演算付き代入
11.4.2.3.1 概要
構文規則
《演算付き代入》 ::=
《演算付き代入式》
|《演算付き代入文》
《演算付き代入式》 ::
《演算付き変数代入式》
|《演算付き添字代入式》
|《演算付きメソッド代入式》
《演算付き代入文》 ::
《演算付き変数代入文》
|《演算付き添字代入文》
|《演算付きメソッド代入文》
11.4.2.3.2 演算付き変数代入
構文規則
《演算付き変数代入》 ::=
《演算付き変数代入式》
|《演算付き変数代入文》
《演算付き変数代入式》 ::
《変数》 [《行終端子》禁止] 《代入演算子》 《演算子式》
《演算付き変数代入文》 ::
《変数》 [《行終端子》禁止] 《代入演算子》 《括弧なしメソッド呼出し》
意味規則
《演算付き変数代入》は,次の手順で評価する。
a) 《変数》を,変数参照として評価する(11.5.4参照)。Vを評価結果の値とする。
b) 《代入演算子》が “&&=” であり,かつ,Vが偽の場合,Vを《演算付き変数代入》の値とする。
c) 《代入演算子》が “||=” であり,かつ,Vが真の場合,Vを《演算付き変数代入》の値とする。
d) それ例外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。Wを評価結果の値とする。
e) OPを《代入演算子》の《代入演算子名》とする。
f) Xを,V OP W という形式の《演算子式》とする。
g) 《演算付き変数代入式》又は《演算付き変数代入文》の《変数》を,Iとする。
h) その《変数》がIで,《演算子式》がXであるような《単一変数代入式》(11.4.2.2.2参照)を評価する。
i)
評価結果の値を《演算付き変数代入》の値とする。
62
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.4.2.3.3 演算付き添字代入
構文規則
《演算付き添字代入》 ::=
《演算付き添字代入式》
|《演算付き添字代入文》
《演算付き添字代入式》 ::
《一次式》 [《行終端子》禁止] [《空白類》禁止] “[” 《添字実引数リスト》? “]”
[《行終端子》禁止] 《代入演算子》 《演算子式》
《演算付き添字代入文》 ::
《一次式》 [《行終端子》禁止][《空白類》禁止] “[” 《添字実引数リスト》? “]”
[《行終端子》禁止] 《代入演算子》 《括弧なしメソッド呼出し》
意味規則
《演算付き添字代入》は,次の手順で評価する。
a) 《一次式》を評価する。Oを評価結果の値とする。
b) 11.3.2で規定するとおりに,《添字実引数リスト》から実引数リストを作成する。Lをこのリストとする。
c) “[]” メソッドを,Oに対し,Lを実引数リストとして呼び出す。呼出し結果の値をVとする。
d) 《代入演算子》が “&&=” であり,かつ,Vが偽の場合,Vを《演算付き添字代入》の値とする。
e) 《代入演算子》が “||=” であり,かつ,Vが真の場合,Vを《演算付き添字代入》の値とする。
f)
それ以外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。Wを評価結果の値とする。
g) OPを《代入演算子》の《代入演算子名》とする。
h) V OP Wという形式の《演算子式》を評価する。Xを評価結果の値とする。
i)
XをLの末尾に追加する。
j)
“[]=” メソッドを,Oに対し,Lを実引数リストとして呼び出す。
k) 《演算付き添字代入》の値は,Xとする。
11.4.2.3.4 演算付きメソッド代入
構文規則
《演算付きメソッド代入》 ::=
《演算付きメソッド代入式》
|《演算付きメソッド代入文》
《演算付きメソッド代入式》 ::
《一次式》 [《行終端子》禁止] ( “.”|“::” ) 《局所変数識別子》
[《行終端子》禁止] 《代入演算子》 《演算子式》
|《一次式》 [《行終端子》禁止] “.” 《定数識別子》
[《行終端子》禁止] 《代入演算子》 《演算子式》
《演算付きメソッド代入文》 ::
《一次式》 [《行終端子》禁止] ( “.”|“::” ) 《局所変数識別子》
[《行終端子》禁止] 《代入演算子》 《括弧なしメソッド呼出し》
|《一次式》 [《行終端子》禁止] “.” 《定数識別子》
[《行終端子》禁止] 《代入演算子》 《括弧なしメソッド呼出し》
63
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
意味規則
《演算付きメソッド代入》は,次の手順で評価する。
a) 《一次式》を評価する。Oを評価結果の値とする。
b) 空の実引数リストLを作成する。名前が《局所変数識別子》又は《定数識別子》であるメソッドを,Oに
対し,Lを実引数リストとして呼び出す。Vを呼出し結果の値とする。
c) 《代入演算子》が “&&=” であり,かつ,Vが偽の場合,Vを《演算付きメソッド代入》の値とする。
d) 《代入演算子》が “||=” であり,かつ,Vが真の場合,Vを《演算付きメソッド代入》の値とする。
e) それ以外の場合は,《演算子式》又は《括弧なしメソッド呼出し》を評価する。Wを評価結果の値とする。
f) OPを《代入演算子》の《代入演算子名》とする。
g) V OP Wという形式の《演算子式》を評価する。Xを評価結果の値とする。
h) Mを《局所変数識別子》又は《定数識別子》とする。Mと “=” とを連結したものをNとする。
i)
名前がNであるメソッドを,Oに対し,ただ一つの値Xを含む実引数リストとともに呼び出す。
j)
《演算付きメソッド代入》の値は,Xとする。
64
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.4.2.4 多重代入
構文規則
《多重代入文》 ::
《多対一代入文》
|《一対一括代入文》
|《多対多代入文》
《多対一代入文》 ::
《左辺》 [《行終端子》禁止] “=” 《多重代入右辺》
《一対一括代入文》 ::
《一括左辺》 [《行終端子》禁止] “=”
( 《括弧なしメソッド呼出し》|《演算子式》 )
《多対多代入文》 ::
《多重代入左辺》 [《行終端子》禁止] “=” 《多重代入右辺》
|( 《多重代入左辺》 − 《一括左辺》 ) [《行終端子》禁止] “=”
( 《括弧なしメソッド呼出し》|《演算子式》 )
《左辺》 ::
《変数》
|《一次式》 [ 《行終端子》禁止] [《空白類》禁止] “[” 《添字実引数リスト》? “]”
|《一次式》 [《行終端子》禁止] ( “.”|“::” ) ( 《局所変数識別子》|《定数識別子》 )
|“::” 《定数識別子》
《多重代入左辺》 ::
( 《多重代入左辺項目》 [《行終端子》禁止] “,” )+ 《多重代入左辺項目》?
|( 《多重代入左辺項目》 [《行終端子》禁止] “,” )+ 《一括左辺》?
|《一括左辺》
|《グループ化された左辺》
《一括左辺》 ::
“*” 《左辺》?
《グループ化された左辺》 ::
“(” 《多重代入左辺》 “)”
《多重代入左辺項目》 ::
《左辺》
|《グループ化された左辺》
《多重代入右辺》 ::
《演算子式リスト》 ( [《行終端子》禁止] “,” 《散開右辺》 )?
|《散開右辺》
《散開右辺》 ::
《散開実引数》
意味規則
《多重代入文》は,次の手順で評価する。
65
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) 《多対一代入文》は,次の手順で評価する。
1) 《多重代入右辺》を基に,値のリストLを次のとおり作成する。
i)
《演算子式リスト》が存在する場合,プログラムテキストに現れる順に,その《演算子式》を評価す
る。これらの評価結果の値を評価した順に含むリストを,L1とする。
ii) 《演算子式リスト》が存在しない場合,空の値のリストL1を作成する。
iii) 《散開右辺》が存在する場合,11.3.2で規定するとおりに,《散開実引数》から値のリストを作成し,
L2をそのリストとする。
iv) 《散開右辺》が存在しない場合,空の値のリストL2を作成する。
v) L1とL2とを連結したリストを処理結果とする。
2) Lの長さが0又は1の場合,Aを処理系定義の値とする。
3) Lの長さが1より大きい場合,Arrayクラスの直接のインスタンスを作成し,Lの要素を,同じ順
序でそこに保存する。AをこのArrayクラスのインスタンスとする。
4) その《変数》が《左辺》であって,かつ,その《演算子式》の値がAであるような《単一変数代入式》
(11.4.2.2.2参照)を評価する。
5) 《多対一代入文》の値は,Aとする。
b) 《一対一括代入文》は,次の手順で評価する。
1) 《括弧なしメソッド呼出し》又は《演算子式》を評価する。Vを評価結果の値とする。
2) VがArrayクラスのインスタンスの場合,新しく作ったArrayクラスの直接のインスタンスをA
とする。AはVだけを要素としてもつか,又はVの全ての要素をV内と同順にもつとする。どちら
を選ぶかは処理系定義とする。
3) VがArrayクラスのインスタンスではない場合,Vを唯一の要素とするArrayクラスの直接のイ
ンスタンスAを作る。
4) 《一括左辺》の《左辺》が存在する場合,その《変数》がこの《左辺》であって,かつ,その《演算子式》の
値がAであるような《単一変数代入式》(11.4.2.2.2参照)を評価する。そうではない場合,この手順
を飛ばす。
5) 《一対一括代入文》の値は,Aとする。
c) 《多対多代入文》は,次の手順で評価する。
1) 《多重代入右辺》が存在する場合,それを基に値のリストを作成し[a) 1)参照],Rをそのリストとす
る。
2) 《多重代入右辺》が存在しない場合,次の手順を行う。
i)
《括弧なしメソッド呼出し》又は《演算子式》を評価する。Vを評価結果の値とする。
ii) VがArrayクラスのインスタンスでない場合の動作は未規定とする。
iii) Vの全ての要素を同順に含む実引数リストRを作る。
3) i) 空の変数リストLを作成する。
ii) プログラムテキストに現れる順に,それぞれの《多重代入左辺項目》の《左辺》又は《グループ化され
た左辺》を,Lの末尾に追加する。
iii) 《多重代入左辺》の《一括左辺》が存在する場合,それをLの末尾に追加する。
iv) 《多重代入左辺》が《グループ化された左辺》の場合,その《グループ化された左辺》をLの末尾に追
加する。
4) Lのそれぞれの要素Liについて,L内と同順に,次の手順を行う。
66
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
i)
iをLiのL内における添字とする。NRをRの要素数とする。
ii) Liが《左辺》の場合,次の手順を行う。
I) iがNRよりも大きい場合,Vをnilとする。
II) そうではない場合,VをRのi番目の要素とする。
III) Li “=” Vという形式の《単一変数代入》を評価する。
iii) Liが《一括左辺》であって,かつ,その《左辺》が存在する場合,次の手順を行う。
I) iがNRよりも大きい場合,Arrayクラスの空の直接のインスタンスを作成し,それをAとする。
II) そうではない場合,Rの要素のうち,添字がi以上であるものを同じ順序で含むArrayクラス
の直接のインスタンスを作成し,それをAとする。
III) その《変数》が《左辺》であって,かつ,その《演算子式》の値がAであるような《単一変数代入式》
(11.4.2.2.2参照)を評価する。
iv) Liが《グループ化された左辺》の場合,次の手順を行う。
I) iがNRよりも大きい場合,Vをnilとする。
II) そうではない場合,VをRのi番目の要素とする。
III) その《多重代入左辺》が《グループ化された左辺》の《多重代入左辺》であって,かつ,その《多重代
入右辺》がVであるような《多対多代入文》を評価する。
11.4.2.5 rescue修飾子付き代入
構文規則
《rescue修飾子付き代入》 ::
《左辺》 [《行終端子》禁止] “=” 《演算子式》1 [《行終端子》禁止] “rescue” 《演算子式》2
意味規則
《rescue修飾子付き代入》は,次の手順で評価する。
a) 《演算子式》1を評価する。Vを評価結果の値とする。
b) この《演算子式》1の評価中に例外が発生し,処理されず,かつ,その例外がStandardErrorクラス
のインスタンスの場合,《演算子式》2を評価し,Vの値を,評価結果の値に置き換える。
c) その《変数》が《左辺》で,《演算子式》の値がVであるような《単一変数代入式》(11.4.2.2.2参照)を評価
する。評価結果の値を《rescue修飾子付き代入》の値とする。
67
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.4.3 単項演算子式
11.4.3.1 概要
構文規則
《単項演算子式》 ::=
《単項マイナス式》
|《単項式》
《単項マイナス式》 ::
《べき乗式》
|“-” 《べき乗式》
《単項式》 ::
《一次式》
|“~” 《単項式》1
|“+” 《単項式》2
|“!” 《単項式》3
意味規則
《単項演算子式》は,次の手順で評価する。
a) 《べき乗式》という形式の《単項マイナス式》は,11.4.4 e)で規定するとおりに評価する。
b) “-” 《べき乗式》という形式の《単項マイナス式》は,次の手順で評価する。
1) 《べき乗式》を評価する。Xを評価結果の値とする。
2) 空の実引数リストLを作成する。Xに対し,“-@” メソッドを,Lを実引数リストとして呼び出す。
呼出し結果の値を《単項マイナス式》の値とする。
c) “~” 《単項式》1という形式の《単項式》は,次の手順で評価する。
1) 《単項式》1を評価する。Xを評価結果の値とする。
2) 空の実引数リストLを作成する。Xに対し,“~” メソッドを,Lを実引数リストとして呼び出す。
呼出し結果の値を《単項式》の値とする。
d) “+” 《単項式》2という形式の《単項式》は,次の手順で評価する。
1) 《単項式》2を評価する。Xを評価結果の値とする。
2) 空の実引数リストLを作成する。Xに対し “+@” メソッドを,Lを実引数リストとして呼び出す。
呼出し結果の値を《単項式》の値とする。
e) “!” 《単項式》3という形式の《単項式》は,11.2で規定するとおりに評価する。
11.4.3.2 defined?式
構文規則
《defined?式》 ::=
《括弧付きdefined?式》
|《括弧なしdefined?式》
《括弧付きdefined?式》 ::
“defined?” “(” 《式》 “)”
《括弧なしdefined?式》 ::
“defined?” 《演算子式》
68
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
意味規則
《defined?式》は,次の手順で評価する。
a) Eを《括弧付きdefined?式》の《式》,又は《括弧なしdefined?式》の《演算子式》とする。
b) Eが《定数識別子》の場合,次の手順を行う。
1) 11.5.4.2で示されている《定数識別子》の評価と同じ評価を行って,名前がEである定数束縛を探す。
ただし,束縛が見つからなかった場合にNameErrorクラスの直接のインスタンスを発生させない。
2) 束縛が見つかった場合,《defined?式》の値は,処理系定義の真とする。
3) そうではない場合,《defined?式》の値はnilとする。
c) Eが《大域変数識別子》の場合,次の手順を行う。
1) 名前がEである束縛が
大域変数束縛集合
内に存在する場合,《defined?式》の値は処理系定義の真と
する。
2) そうではない場合,《defined?式》の値はnilとする。
d) Eが《クラス変数識別子》の場合,次の手順を行う。
1) Cを現在のクラス又はモジュールとする。Cとその全てのスーパークラスとを含む集合を,CSとす
る。CSのそれぞれの要素のインクルードモジュールリストについて,そこに含まれるモジュールを
全て合わせた集合を,MSとする。CS及びMSの和集合を,CMとする。
2) CM内のクラス又はモジュールに,そのクラス束縛の集合内に名前がEである束縛をもつものが存
在する場合,《defined?式》の値は処理系定義の真とする。
3) そうではない場合,《defined?式》の値はnilとする。
e) Eが《インスタンス変数識別子》の場合,次の手順を行う。
1) 名前がEである束縛が,現在のselfのインスタンス変数束縛の集合内に存在する場合,《defined?式》
の値は処理系定義の真とする。
2) そうではない場合,《defined?式》の値はnilとする。
f) Eが《局所変数識別子》の場合,次の手順を行う。
1) 《局所変数識別子》が局所変数への参照(11.5.4.7.2参照)の場合,《defined?式》の値は処理系定義の
真とする。
2) そうではない場合,現在のクラス又はモジュールを起点として,名前がEであるメソッド束縛を
13.3.4で規定するとおりにして探す。
i)
束縛が見つかり,その値がundef でない場合,《defined?式》の値は処理系定義の真とする。
ii) そうではない場合,《defined?式》の値はnilとする。
g) それ以外の場合,《defined?式》の値は処理系定義とする。
11.4.4 2項演算子式
構文規則
《2項演算子式》 ::=
《等価式》
《等価式》 ::
《関係式》
|《関係式》 [《行終端子》禁止] “<=>” 《関係式》
|《関係式》 [《行終端子》禁止] “==” 《関係式》
69
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
|《関係式》 [《行終端子》禁止] “===” 《関係式》
|《関係式》 [《行終端子》禁止] “!=” 《関係式》
|《関係式》 [《行終端子》禁止] “=~” 《関係式》
|《関係式》 [《行終端子》禁止] “!~” 《関係式》
《関係式》 ::
《ビット単位OR式》
|《関係式》 [《行終端子》禁止] “>” 《ビット単位OR式》
|《関係式》 [《行終端子》禁止] “>=” 《ビット単位OR式》
|《関係式》 [《行終端子》禁止] “<” 《ビット単位OR式》
|《関係式》 [《行終端子》禁止] “<=” 《ビット単位OR式》
《ビット単位OR式》 ::
《ビット単位AND式》
|《ビット単位OR式》 [《行終端子》禁止] “|” 《ビット単位AND式》
|《ビット単位OR式》 [《行終端子》禁止] “^” 《ビット単位AND式》
《ビット単位AND式》 ::
《ビット単位シフト式》
|《ビット単位AND式》 [《行終端子》禁止] “&” 《ビット単位シフト式》
《ビット単位シフト式》 ::
《加減式》
|《ビット単位シフト式》 [《行終端子》禁止] “<<” 《加減式》
|《ビット単位シフト式》 [《行終端子》禁止] “>>” 《加減式》
《加減式》 ::
《乗除式》
|《加減式》 [《行終端子》禁止] “+” 《乗除式》
|《加減式》 [《行終端子》禁止] “-” 《乗除式》
《乗除式》 ::
《単項マイナス式》
|《乗除式》 [《行終端子》禁止] “*” 《単項マイナス式》
|《乗除式》 [《行終端子》禁止] “/” 《単項マイナス式》
|《乗除式》 [《行終端子》禁止] “%” 《単項マイナス式》
《べき乗式》 ::
《単項式》
|《単項式》 [《行終端子》禁止] “**” 《べき乗式》
《2項演算子》 ::=
“<=>”|“==”|“!=”|“===”|“=~”|“!~”|“>”|“>=”|“<”|“<=”
|“|”|“^”|“&”|“<<”|“>>”|“+”|“-”|“*”|“/”|“%”|“**”
次のいずれかの演算子の直前に《空白類》がある場合,その演算子の直後にも一つ以上の《空白類》がなけ
ればならない。
− 《ビット単位AND式》の “&”
70
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− 《ビット単位シフト式》の “<<”
− 《加減式》の “+”
− 《加減式》の “-”
− 《乗除式》の “*”
− 《乗除式》の “/”
− 《乗除式》の “%”
注記 例えば,“x␣-y” は《加減式》ではない。ただし,“x” が局所変数への参照である場合,“x␣-y”
を “x␣-␣y” という《加減式》と同じように評価してもよい。しかし,“x” が局所変数への参
照ではない場合は,“x␣-y” を “x()␣-␣y” ではなく “x(-y)” と同じ動作を行う《コマン
ド》(11.3.1参照)として評価しなければならない。ここで,“␣”は空白を表す。
意味規則
《等価式》は,次の手順で評価する。
a) 《等価式》がx “!=” yという形式の場合,次の手順を行う。
1) xを評価し,Xを評価結果の値とする。
2) yを評価し,Yを評価結果の値とする。
3) “==” メソッドを,Xに対し,Yを実引数として呼び出す。呼出し結果の値が真の場合,《等価式》の
値はfalseとする。それ以外の場合,《等価式》の値はtrueとする。
b) 手順a)の代わりに,手順f) 1)〜f) 3)を行ってもよい。この場合,次の条件が満たされなければならな
い。
− “!=” 演算子が《演算子メソッド名》に含まれている。
− Objectクラス,Objectクラスのいずれかのスーパークラス,又はObjectクラスがインクルー
ドしているいずれかのモジュールに,インスタンスメソッド “!=” が定義されている。“!=” メソ
ッドは実引数を一つとり,手順a) 3)の《等価式》の値を返さなければならない。ここで,X及びYは
それぞれレシーバ及び唯一の実引数であるとする。
c) 《等価式》がx “!~” yという形式の場合,次の手順を行う。
1) xを評価し,Xを評価結果の値とする。
2) yを評価し,Yを評価結果の値とする。
3) “=~” メソッドを,Xに対し,Yを実引数として呼び出す。呼出し結果の値が真の場合,《等価式》の
値はfalseとする。それ以外の場合,《等価式》の値はtrueとする。
d) 手順c)の代わりに,手順f) 1)〜f) 3)を行ってもよい。この場合,次の条件が満たされなければならな
い。
− “!~” 演算子が《演算子メソッド名》に含まれている。
− Objectクラス,Objectクラスのいずれかのスーパークラス,又はObjectクラスがインクルー
ドしているいずれかのモジュールに,インスタンスメソッド “!~” が定義されている。“!~” メソ
ッドは実引数を一つとり,手順c) 3)の《等価式》の値を返さなければならない。ここで,X及びYは
それぞれレシーバ及び唯一の実引数であるとする。
e) 《等価式》が《単項マイナス式》であり,《べき乗式》でない場合,11.4.3で規定するとおりに評価する。《等
価式》が《単項マイナス式》であり,《べき乗式》である場合,次の手順で《べき乗式》を評価し,その値を
《等価式》の値とする。
1) その《べき乗式》が《単項式》である場合,それを11.4.3.1で規定するとおりに評価し,評価結果の値
71
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
を《べき乗式》の値とする。
2) その《べき乗式》が《単項式》 “**” 《べき乗式》という形式である場合,次の手順を行う。
i)
《単項式》が “-” 《符号なし数》という形式の《符号付き数》である場合,次の手順を行う。
I)
《符号なし数》を評価し,評価結果の値をXとする。
II) 《べき乗式》を評価し,評価結果の値をYとする。
III) 名前が “**” であるメソッドを,Xに対し,Yを実引数として呼び出す。Zを呼出し結果の値
とする。
IV) 名前が “-@” であるメソッドを,Zに対し,実引数なしで呼び出す。呼出し結果の値を《べき乗
式》の値とする。
ii) そうではない場合,次の手順を行う。
I)
《単項式》を評価し,評価結果の値をXとする。
II) 《べき乗式》を評価し,評価結果の値をYとする。
III) 名前が “**” であるメソッドを,Xに対し,Yを実引数として呼び出す。呼出し結果の値を《べ
き乗式》の値とする。
f)
それ以外の場合,x 《2項演算子》 yという形式の《等価式》に対し,次の手順を行う。
1) xを評価し,Xを評価結果の値とする。
2) yを評価し,Yを評価結果の値とする。
3) 名前が《2項演算子》であるメソッドを,Xに対し,Yを実引数として呼び出す。《等価式》の値は,呼
出し結果の値とする。
72
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《一次式メソッド呼出し》については,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) 《式》を評価する。Vを評価結果の値とする。
b) Vが真の場合,《then節》の《複合文》を評価する。評価結果の値を《if式》の値とする。この場合,残り
の《elsif節》及び《else節》は,(もしあっても)評価しない。
c) Vが偽で,かつ,《elsif節》も《else節》も存在しない場合,《if式》の値はnilとする。
d) Vが偽で,かつ,《elsif節》が存在せず,《else節》が存在する場合,《else節》の《複合文》を評価する。評
価結果の値を《if式》の値とする。
e) Vが偽で,かつ,一つ以上の《elsif節》が存在する場合,それらを次の手順で評価する。
1) それぞれの《elsif節》について,その《式》の値が真であるようなものが見つかるまで,それらがプロ
グラムテキストに現れる順に,その《式》を評価する。見つかった《elsif節》をTとする。
74
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
2) Tが存在する場合,その《then節》の《複合文》を評価する。評価結果の値を《if式》の値とする。残り
の《elsif節》及び《else節》は,(もしあっても)評価しない。
3) Tが存在せず,《else節》が存在する場合,《else節》の《複合文》を評価する。評価結果の値を《if式》の
値とする。
4) Tが存在せず,《else節》も存在しない場合,《if式》の値はnilとする。
11.5.2.2.3 unless式
構文規則
《unless式》 ::
“unless” 《式》 《then節》 《else節》? “end”
意味規則
《unless式》は,次の手順で評価する。
a) 《式》を評価する。Vを評価結果の値とする。
b) Vが偽の場合,《then節》の《複合文》を評価する。評価結果の値を《unless式》の値とする。この場合,
残りの《else節》は,(もしあっても)評価しない。
c) Vが真で,《else節》が存在しない場合,《unless式》の値はnilとする。
d) Vが真で,《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式》の場合,《式》を評価する。Vを評価結果の値とする。
b) 手順c)で使われる“値Oはマッチする”という表現は次のとおり定義する。
1) 《case式》が《式付きcase式》の場合,Oに対し,“===” メソッドを,Vだけを含む実引数リストとと
もに呼び出す。呼出し結果の値が真である場合に限り,Oはマッチするとする。
2) 《case式》が《式なしcase式》の場合,Oが真である場合に限り,Oはマッチするとする。
c) 次の手順を行う。
75
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《繰返し式》の本体は,《繰返し式》で繰り返し評価される部分である。《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) それ以外の場合,この《式》の評価結果の値をVとする。
b) Vが偽の場合,《while式》の評価は,評価結果をnilとして終了する。
c) Vが真の場合,《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
そうではない場合,《until式》の値はnilとする。
2) この《式》の評価が《next式》(11.5.2.4.4参照)又は《redo式》(11.5.2.4.5参照)によって終了された場
合,手順a)の最初から繰り返す。
3) それ以外の場合,この《式》の評価結果の値をVとする。
b) Vが真の場合,《until式》の評価は,評価結果をnilとして終了する。
c) Vが偽の場合,《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式》によって終了された場合の動作
は未規定とする。そうではない場合,Oを評価結果の値とする。
b) 《一次式》 [《行終端子》禁止] “.” “each” “do” “|” 《ブロック仮引数リスト》 “|” 《ブロック本体》
“end” という形式の《一次式メソッド呼出し》を,Eとする。ここで,《一次式》の値はO,《ブロック
仮引数リスト》は《for変数》,《ブロック本体》は《do節》の《複合文》とする。
Eを評価する。ただし,評価中にこの《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
意味規則
《ジャンプ式》は,《メソッド本体》,《ブロック本体》,《繰返し式》の条件式若しくは本体,又は《rescue節》
の《then節》の《複合文》の評価を終了させるために使用される。《ジャンプ式》によって終了されたそのプロ
グラム構成要素自身,及びそのプログラム構成要素に含まれ,かつ,《ジャンプ式》の評価開始時に評価中
であったプログラム構成要素は,評価手順の途中でその評価を終了し,評価結果の値をもたない。
この規格では,現在の《ブロック》又は現在の《繰返し式》という表現は次のものを指す。
a) 現在のメソッド呼出しが存在しない場合は,現在評価中の《ブロック》又は《繰返し式》のうち,最近に
評価を開始した《ブロック》又は《繰返し式》。
b) 現在のメソッド呼出しが存在する場合は,現在のメソッド呼出しの評価中に評価が開始され,現在も
評価中の《ブロック》又は《繰返し式》のうち,最近に評価を開始した《ブロック》又は《繰返し式》。
いずれの場合も,そのようなものが存在しない場合は,現在の《ブロック》又は現在の《繰返し式》は存在
しない。
11.5.2.4.2 return式
構文規則
《return式》 ::=
《実引数なしreturn》
|《実引数付きreturn》
《実引数なしreturn》 ::
“return”
《実引数付きreturn》 ::
“return” 《ジャンプ実引数》
《ジャンプ実引数》 ::
[《行終端子》禁止] 《実引数リスト》
《ジャンプ実引数》の《実引数リスト》(11.3.2参照)には,《ブロック実引数》が存在してはならない。
意味規則
《return式》及び《ジャンプ実引数》は,次の手順で評価する。
a) 《return式》は,次の手順で評価する。
1) 現在のメソッド呼出しに対応する《メソッド本体》をMとする。現在評価中の《ブロック》であって,
かつ,Kernelモジュールのlambdaメソッド(15.3.1.2.6参照)によって作られたものをLとする。
そのような《ブロック》が複数存在する場合は,それらのうち最近に評価を開始したものをLとする。
2) MもLも存在しない場合,又は,Mだけが存在するが現在のメソッド呼出しが終了している場合は,
次の手順を行う。
i)
名前が “return” であるSymbolクラスの直接のインスタンスを,Sとする。
ii) 《return式》の《ジャンプ実引数》が存在する場合,Vを《ジャンプ実引数》の値とする。そうではない
場合,Vをnilとする。
iii) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value” で
あって値がVであるインスタンス変数束縛とをもつLocalJumpErrorクラスの直接のインスタ
ンスを例外として発生させる。
3) 《ジャンプ実引数》が存在する場合,それを手順b)で規定されているとおりに評価する。
79
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
4) Mの評価がLの評価より後に開始されていた場合,次の手順を行う。
i)
この《return式》を含み,かつ,Mに含まれているような《ブロック本体》が一つ以上存在する場合,
それらの《ブロック本体》について,内側から外側へと順に,その評価を終了させる(11.3.3参照)。
ii) Mの評価を終了する(13.3.3参照)。
5) そうではない場合,次の手順を行う。
i)
Lが現在の《ブロック》である場合,Lの評価を終了させる[15.3.1.2.6 b)参照]。
ii) そうではない場合,動作は未規定とする。
b) 《ジャンプ実引数》は,次の手順で評価する。
1) 《ジャンプ実引数》が《散開実引数》の場合,次の手順を行う。
i)
11.3.2で規定するとおりに《散開実引数》から値のリストを構築し,そのリストをLとする。
ii) Lの長さが0又は1の場合,《ジャンプ実引数》の値は処理系定義とする。
iii) Lの長さが1より大きい場合,Arrayクラスの直接のインスタンスを作成し,それにLの要素を
同じ順序で保存する。《ジャンプ実引数》の値はこのArrayクラスのインスタンスとする。
2) そうではない場合,次の手順を行う。
i)
11.3.2で規定するとおりに《実引数リスト》から値のリストを構築し,そのリストをLとする。
ii) Lの長さが1の場合,《ジャンプ実引数》の値はLの唯一の要素とする。
iii) Lの長さが1より大きい場合,Arrayクラスの直接のインスタンスを作成し,それにLの要素を
同じ順序で保存する。《ジャンプ実引数》の値はこの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クラスの直接のインスタンスを,Sとする。
2) 《break式》の《ジャンプ実引数》が存在する場合,Vをその《ジャンプ実引数》の値とする。そうではな
い場合,Vをnilとする。
3) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value” で
80
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
あって値がVであるインスタンス変数束縛とをもつ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クラスの直接のインスタンスを,Sとする。
2) 《next式》の《ジャンプ実引数》が存在する場合,Vをその《ジャンプ実引数》の値とする。そうではな
い場合,Vをnilとする。
3) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value” で
あって値がVであるインスタンス変数束縛とをもつLocalJumpErrorクラスの直接のインスタン
スを例外として発生させる。
11.5.2.4.5 redo式
構文規則
《redo式》 ::
“redo”
意味規則
《redo式》は,次の手順で評価する。
a) 現在の《ブロック》が存在する場合,現在の《ブロック》の《ブロック本体》の評価を終了させる(11.3.3
参照)。
b) 現在の《繰返し式》が存在する場合,《redo式》が現在の《繰返し式》の条件式内にあるときはその条件式
の評価を,本体内にあるときはその本体の評価を終了させる(11.5.2.3参照)。
c) 現在の《ブロック》又は現在の《繰返し式》が存在しない場合,次の手順を行う。
1) 名前が “redo” であるSymbolクラスの直接のインスタンスを,Sとする。
2) 名前が “@reason” であって値がSであるインスタンス変数束縛と,名前が “@exit̲value” で
あって値がnilであるインスタンス変数束縛とをもつLocalJumpErrorクラスの直接のインスタン
81
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
スを例外として発生させる。
11.5.2.4.6 retry式
構文規則
《retry式》 ::
“retry”
意味規則
《retry式》は,次の手順で評価する。
a) 現在のメソッド呼出し(13.3.3参照)が存在した場合,Mをそのメソッド呼出しに対応する《メソッド
本体》とする。そうではない場合,Mを現在評価中の《プログラム》(10.1参照)とする。
b) M内の,この《retry式》を内包する最も内側の《rescue節》をEとする。そのような《rescue節》が存在し
ない場合,動作は未規定とする。
c) Eの《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) 発生した例外をEとする。
2) 《rescue節》の《例外クラスリスト》が存在せず,かつ,EがStandardErrorクラスの直接のインス
タンスの場合,この《rescue節》はEを処理できる。
3) 《rescue節》の《例外クラスリスト》が存在する場合,次の手順を行う。
i)
《例外クラスリスト》が《演算子式》の場合,その《演算子式》を評価する。空の値リストを作成し,
評価結果の値をそのリストに追加する。
ii) 《例外クラスリスト》が《多重代入右辺》の場合,その《多重代入右辺》から値リストを作成する
(11.4.2.4参照)。
iii) 上記のとおりに《例外クラスリスト》を評価することで作成されたリストをLとする。Lのそれぞ
れの要素Dについて,次の手順を行う。
I) DがExceptionクラスでもExceptionクラスのサブクラスでもない場合,TypeErrorクラ
スの直接のインスタンスを例外として発生させる。
II) EがDのインスタンスの場合,この《rescue節》はEを処理できる。この場合,この《本体文》の
残りの《rescue節》は判断を行わない。
d) Eを処理できる《rescue節》Rが見つかった場合,次の手順を行う。
1) Rの《例外変数代入》が存在する場合,《左辺》 “=” 《多重代入右辺》という形式であり,《多重代入右
辺》の値がEであるような《多重代入文》と同様にその《例外変数代入》を評価する。
2) Rの《then節》の《複合文》を評価する。この評価が《retry式》によって終了された場合,手順a)から処
理を続ける。そうではない場合,Vを評価結果の値とする。
3) 《ensure節》が存在する場合,それを評価する。《本体文》の値は,《ensure節》の値とする。
4) 《ensure節》が存在しない場合,《本体文》の値はVとする。
e) 《rescue節》が存在しないか,Eを処理できる《rescue節》が存在しなかった場合,次の手順を行う。
1) 《ensure節》が存在する場合,それを評価する。
2) 《本体文》の値は未規定とする。
《本体文》の《ensure節》が存在する場合,《ensure節》は,《本体文》の評価が《ジャンプ式》によって終了さ
れた場合も含め,必ず評価される。
11.5.3 グループ化式
構文規則
《グループ化式》 ::
“(” 《式》 “)”
|“(” 《複合文》 “)”
意味規則
《グループ化式》は,次の手順で評価する。
a) 《式》又は《複合文》を評価する。
b) 評価結果の値を《グループ化式》の値とする。
83
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.5.4 変数参照
11.5.4.1 概要
構文規則
《変数参照》 ::
《変数》
|《擬似変数》
《変数》 ::
《定数識別子》
|《大域変数識別子》
|《クラス変数識別子》
|《インスタンス変数識別子》
|《局所変数識別子》
《スコープ付き定数参照》 ::
《一次式》 [《行終端子》禁止][《空白類》禁止] “::” 《定数識別子》
|“::” 《定数識別子》
《変数》及び《スコープ付き定数参照》については,11.5.4.2から11.5.4.7までを参照。
《擬似変数》については,11.5.4.8を参照。
11.5.4.2 定数
《定数識別子》は,次の手順で評価する。
a) 評価する《定数識別子》を,Nとする。
b) 名前がNである定数束縛を,次のとおり探す。
次の手順において,束縛が見つかった場合,すぐに《定数識別子》の評価を終了し,見つかった束縛
の値を《定数識別子》の値とする。
c) Lを
クラスモジュールリスト
の一番上の要素とする。Lのそれぞれの要素に対し,最初(すなわち,
現在のクラス又はモジュール)から最後まで順に,名前がNである定数束縛を探す。ただし,Lの最
後の要素であるObjectクラスは除く。
d) 束縛が見つからない場合,Cを現在のクラス又はモジュールとする。
LをCのインクルードモジュールリストとする。Lのそれぞれの要素に対し,リスト内と逆順に,
名前がNである定数束縛を探す。
e) 束縛が見つからない場合,次の手順を行う。
1) CがClassクラスのインスタンスの場合,次の手順を行う。
i)
Cが直接のスーパークラスをもたない場合,名前がNであるSymbolクラスの直接のインスタン
スを作り,それをRとする。const̲missingメソッドを,現在のクラス又はモジュールに対し,
Rを実引数として呼び出す。呼出し結果の値を《定数識別子》の値とする。
ii) Cが直接のスーパークラスをもつ場合,SをCの直接のスーパークラスとする。
iii) Sに対し,名前がNである定数束縛を探す。
iv) 束縛が見つからない場合,LをSのインクルードモジュールリストとし,Lのそれぞれの要素に
対し,リスト内と逆順に,名前がNである定数束縛を探す。
v) 束縛が見つからない場合,CをSの直接のスーパークラスとする。手順e) 1) i)から処理を続ける。
84
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
2) CがClassクラスのインスタンスでない場合,次の手順を行う。
i)
Objectクラスに対し,名前がNである定数束縛を探す。
ii) 束縛が見つからない場合,LをObjectクラスのインクルードモジュールリストとし,Lのそれ
ぞれの要素に対し,リスト内と逆順に,名前がNである定数束縛を探す。
iii) 束縛が見つからなかった場合,名前がNであるSymbolクラスの直接のインスタンスを作り,そ
れをRとする。const̲missingメソッドを,現在のクラス又はモジュールに対し,Rを実引数
として呼び出す。呼出し結果の値を《定数識別子》の値とする。
11.5.4.3 スコープ付き定数
《スコープ付き定数参照》は,次の手順で評価する。
a) 《一次式》が存在する場合,それを評価し,Cを評価結果の値とする。そうではない場合,CをObject
クラスとする。
b) CがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外と
して発生させる。
c) CがModuleクラスのインスタンスである場合,次の手順を行う。
1) 評価対象の《定数識別子》を,Nとする。
2) 名前がNである束縛がCの定数束縛の集合内に存在する場合,《スコープ付き定数参照》の値はその
束縛の値とする。
3) そうではない場合,次の手順を行う。
i)
Cのインクルードモジュールリストを,Lとする。名前がNである定数束縛をL内から,リスト
内と逆順に探す。
ii) 束縛が見つかった場合,《スコープ付き定数参照》の値はその束縛の値とする。
iii) 束縛が見つからず,かつ,CがClassクラスのインスタンスの場合,名前がNである定数束縛
の探索を,11.5.4.2の手順e)から行う。
iv) 束縛が見つからず,かつ,CがClassクラスのインスタンスでない場合,名前がNであるSymbol
クラスの直接のインスタンスを作り,それをRとする。const̲missingメソッドを,Cに対し
Rを実引数として呼び出す。
11.5.4.4 大域変数
《大域変数識別子》は,次の手順で評価する。
a) 評価対象の《大域変数識別子》を,Nとする。
b) 名前がNである束縛が
大域変数束縛集合
内に存在する場合,《大域変数識別子》の値はその束縛の値
とする。ただし,その束縛が,実行環境の初期化時に処理系が追加した束縛(7.2参照)である場合,
その動作は未規定とする。
c) そうではない場合,《大域変数識別子》の値はnilとする。
11.5.4.5 クラス変数
《クラス変数識別子》は,次の手順で評価する。
a) Nを《クラス変数識別子》とする。
クラスモジュールリスト
の一番上のリスト内の,特異クラスでな
い最初のクラス又はモジュールを,Cとする。
b) Cとその全てのスーパークラスとを含む集合を,CSとする。CSのそれぞれの要素のインクルードモ
ジュールリストについて,そこに含まれるモジュールを全て合わせた集合を,MSとする。CS及び
MSの和集合を,CMとする。
85
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
c) CM内のクラス又はモジュールのうちのただ一つが,名前がNである束縛をそのクラス変数束縛の集
合内にもつ場合,Vをその束縛の値とする。
d) CM内のクラス又はモジュールのうち,二つ以上のクラス又はモジュールが,名前がNである束縛を
そのクラス変数束縛の集合内にもつ場合,Vをこれらの束縛のいずれかの値とする。どの束縛を選ぶ
かは処理系定義とする。
e) CM内のクラス又はモジュールに,名前がNである束縛をそのクラス変数束縛の集合内にもつものが
存在しなかった場合は,Sを名前がNであるSymbolクラスの直接のインスタンスとし,Sを名前属
性にもつNameErrorクラスの直接のインスタンスを例外として発生させる。
f)
《クラス変数識別子》の値をVとする。
11.5.4.6 インスタンス変数
《インスタンス変数識別子》は,次の手順で評価する。
a) 評価対象の《インスタンス変数識別子》をNとする。
b) 現在のselfのインスタンス変数束縛の集合内に,名前がNである束縛が存在した場合,《インスタン
ス変数識別子》の値はその束縛の値とする。
c) そうではない場合,《インスタンス変数識別子》の値はnilとする。
11.5.4.7 局所変数又はメソッド呼出し
11.5.4.7.1 概要
《変数参照》内に《局所変数識別子》が存在した場合,その《局所変数識別子》は局所変数への参照又は実引
数なしのメソッド呼出しのいずれかとして評価される。
11.5.4.7.2 局所変数識別子の種類の判別
《局所変数識別子》Iの出現が局所変数への参照なのか,メソッド呼出しなのかは,次のとおり判別する。
a) PをIが現れたプログラムテキスト上の位置とする。
b) Pを内包し,かつ,《ブロック》に対応しない局所変数のスコープのうち,最も内側のものをSとする
(9.2参照)。
c) Sの開始点とPとの間のプログラムテキスト上の区間を,Rとする。
d) Iと同じ識別子が局所変数への参照としてR内の《変数参照》内に存在する場合,Iは局所変数への参照
とする。
e) Iと同じ識別子が次の形式としてR内に存在する場合,Iは局所変数への参照とする。
− 《必須仮引数》
− 《省略可能仮引数名》
− 《配列仮引数名》
− 《Proc仮引数名》
− 《左辺》の《変数》
− 《単一変数代入式》の《変数》
− 《単一変数代入文》の《変数》
− 《演算付き変数代入式》の《変数》
− 《演算付き変数代入文》の《変数》
f)
そうではない場合,Iはメソッド呼出しとする。
注記 《変数参照》内の《局所変数識別子》以外についても,その《局所変数識別子》の出現が局所変数へ
の参照なのか,メソッド呼出しなのかが,構文規則だけから判別できない場合に,上記の手順
86
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
で判別を行う(11.3.1参照)。
11.5.4.7.3 局所変数
《局所変数識別子》が局所変数への参照である場合は,次の手順で評価する。
a) Nを評価対象の《局所変数識別子》とする。
b) 名前がNである局所変数束縛を,9.2で規定されているとおりに探す。
c) 束縛が見つかった場合,《局所変数識別子》の値はその束縛の値とする。
d) そうではない場合,《局所変数識別子》の値はnilとする。
11.5.4.7.4 メソッド呼出し
《局所変数識別子》がメソッド呼出しである場合は,次の手順で評価する。
a) Nを《局所変数識別子》とする。
b) 空の実引数リストLを作り,現在のselfをメソッド呼出しのレシーバ,Nをメソッド名,Lを実引数
のリストとしてメソッド呼出しを行う(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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
11.5.4.8.4 self式
構文規則
《self式》 ::
“self”
意味規則
《self式》の評価結果は,現在のselfの値とする。
11.5.5 オブジェクト生成子
11.5.5.1 配列生成子
構文規則
《配列生成子》 ::
“[” 《添字実引数リスト》? “]”
意味規則
《配列生成子》は,次の手順で評価する。
a) 《添字実引数リスト》がある場合,11.3.2で規定するとおりに,《添字実引数リスト》から実引数のリス
トを作成する。Lをそのリストとする。
b) そうではない場合,空の値のリストLを作成する。
c) Arrayクラス(15.2.12参照)の直接のインスタンスを作成し,そのインスタンスにLのそれぞれの
要素を順序を保ったまま保存したものをOとする。
d) 《配列生成子》の値はOとする。
11.5.5.2 ハッシュ生成子
構文規則
《ハッシュ生成子》 ::
“{” ( 《連想リスト》 [《行終端子》禁止] “,”? )? “}”
《連想リスト》 ::
《連想》 ( [《行終端子》禁止] “,” 《連想》 )*
《連想》 ::
《連想キー》 [《行終端子》禁止] “=>” 《連想値》
《連想キー》 ::
《演算子式》
《連想値》 ::
《演算子式》
意味規則
a) 《ハッシュ生成子》は,次の手順で評価する。
1) 《連想リスト》が存在する場合,その《連想リスト》を評価する。評価結果の値を《ハッシュ生成子》の
値とする。
2) そうではない場合,Hashクラス(15.2.13参照)の空の直接のインスタンスを作成する。このイン
スタンスを《ハッシュ生成子》の値とする。
b) 《連想リスト》は,次の手順で評価する。
1) Hashクラスの空の直接のインスタンスHを作成する。
88
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
2) それぞれの《連想》Aiについて,プログラムテキストに現れる順に,次の手順を行う。
i)
Aiの《連想キー》の《演算子式》を評価する。Kiを評価結果の値とする。
ii) 《連想値》の《演算子式》を評価する。Viを評価結果の値とする。
iii) KiとViとの組を,Hに対し “[]=” メソッドをKi及びViを実引数として呼び出すことによって,
Hに保存する。
3) 《連想リスト》の値はHとする。
11.5.5.3
範囲式
構文規則
《範囲式》 ::
《演算子OR式》
|《演算子OR式》1 [《行終端子》禁止] 《範囲演算子》 《演算子OR式》2
《範囲演算子》 ::
“..”
|“...”
意味規則
《演算子OR式》1《範囲演算子》 《演算子OR式》2という形式の《範囲式》は,次の手順で評価する。
a) 《演算子OR式》1を評価する。Aを評価結果の値とする。
b) 《演算子OR式》2を評価する。Bを評価結果の値とする。
c) 《範囲演算子》が終端記号 “..” の場合,三つの実引数A,B,及びfalseを含むリストLを作成する。
《範囲演算子》が終端記号 “...” の場合,三つの実引数A,B,及びtrueを含むリストLを作成する。
d) Rangeクラス(15.2.14参照)に対し,newメソッドを,Lを実引数リストとして呼び出す。呼出し結
果の値を《範囲式》の値とする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《代入文》については,11.4.2を参照。
12.2 式文
構文規則
《式文》 ::
《式》
意味規則
《式文》は,次の手順で評価する。
a) 《式》を評価する。
b) 評価結果の値を,《式文》の値とする。
12.3 if修飾文
構文規則
《if修飾文》 ::
《文》 [《行終端子》禁止] “if” 《式》
意味規則
S “if” Eという形式の《if修飾文》(ここで,Sは《文》,Eは《式》とする。)は,次の手順で評価する。
a) “if” E “then” S “end” という形式の《if式》を評価する。
b) 評価結果の値を,《if修飾文》の値とする。
12.4 unless修飾文
構文規則
《unless修飾文》 ::
《文》 [《行終端子》禁止] “unless” 《式》
意味規則
S “unless” Eという形式の《unless修飾文》(ここで,Sは《文》,Eは《式》とする。)は,次の手順で評価
する。
a) “unless” E “then” S “end” という形式の《unless式》を評価する。
b) 評価結果の値を,《unless修飾文》の値とする。
12.5 while修飾文
構文規則
《while修飾文》 ::
《文》 [《行終端子》禁止] “while” 《式》
意味規則
S “while” Eという形式の《while修飾文》(ここで,Sは《文》,Eは《式》とする。)は,次の手順で評価す
る。
a) Sが《begin式》の場合,動作は処理系定義とする。
b) “while” E “do” S “end” という形式の《while式》を評価する。
c) 評価結果の値を,《while修飾文》の値とする。
90
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
12.6 until修飾文
構文規則
《until修飾文》 ::
《文》 [《行終端子》禁止] “until” 《式》
意味規則
S “until” Eという形式の《until修飾文》(Sは《文》,Eは《式》とする。)は,次の手順で評価する。
a) Sが《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修飾文の主文》を評価する。評価結果の値をVとする。
b) 手順a)の評価中にStandardErrorクラスの直接のインスタンスが例外として発生したが,処理され
なかった場合,《rescue修飾文の後退文》を評価し,その評価結果の値を《rescue修飾文》の値とする。
c) 手順a)の評価中に例外が発生しなかった場合,又は発生した全ての例外が手順a)で処理された場合,
Vを《rescue修飾文》の値とする。
13 クラス及びモジュール
13.1 モジュール
13.1.1 概要
全てのモジュールは,Moduleクラスのインスタンスである(15.2.2参照)。ただし,Moduleクラスは,
Classクラスのスーパークラスの一つであるため,Moduleクラスの全てのインスタンスがモジュールで
あるわけではない。Classクラスのインスタンスは,モジュールではなくクラスである。
91
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
モジュールは,次の属性をもつ。
インクルードモジュールリスト:モジュールにインクルードされているモジュールのリストである。モ
ジュールのインクルードについては,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) 名前が《モジュール名》である定数束縛を作成又は更新するクラス又はモジュールCを,次のように決
定する。
1) 《モジュールパス》が《最上位モジュールパス》という形式の場合,CをObjectクラスとする。
2) 《モジュールパス》が《モジュール名》という形式の場合,Cを現在のクラス又はモジュールとする。
3) 《モジュールパス》が《入れ子モジュールパス》という形式の場合,その《一次式》を評価する。評価結
果がModuleクラスのインスタンスの場合,そのインスタンスをCとする。そうではない場合,
TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) Nを《モジュール名》とする。
92
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) 名前がNである束縛が,Cの定数束縛の集合内に存在する場合,Bをその束縛とする。Bの値がモ
ジュールである場合,そのモジュールをMとする。そうではない場合,TypeErrorクラスの直接
のインスタンスを例外として発生させる。
2) それ以外の場合,Moduleクラスの直接のインスタンスMを作成する。名前がNで,値がMであ
る変数束縛を作成し,それをCの定数束縛の集合に追加する。
c) 実行環境を,次の手順を行うことで変更する。
1)
クラスモジュールリスト
の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭
にMを追加する。そのリストを
クラスモジュールリスト
に積む。
2) Mを
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参照)。
モジュールMが別のモジュールNにインクルードされているのは,MがNのインクルードモジュール
リストの要素である場合に限る。モジュールMがクラスCにインクルードされているのは,MがCのイ
ンクルードモジュールリストの要素であるか,MがCのいずれかのスーパークラスによってインクルード
されている場合に限る。
13.2 クラス
13.2.1 概要
全てのクラスは,Classクラスのインスタンスである。Classクラスは,Moduleクラスの直接のサブ
クラスである(15.2.3参照)。
クラスはモジュールと同じ属性をもつ。それに加えて,それぞれのクラスは高々一つの直接のスーパー
クラスをもつ。
93
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
13.2.2 クラス定義
構文規則
《クラス定義》 ::
“class” 《クラスパス》 [《行終端子》禁止] ( “<” 《スーパークラス》 )? 《分離子》
《クラス本体》 “end”
《クラスパス》 ::
《最上位クラスパス》
|《クラス名》
|《入れ子クラスパス》
《クラス名》 ::
《定数識別子》
《最上位クラスパス》 ::
“::” 《クラス名》
《入れ子クラスパス》 ::
《一次式》 [《行終端子》禁止] “::” 《クラス名》
《スーパークラス》 ::
《式》
《クラス本体》 ::
《本体文》
意味規則
《クラス定義》は,次の手順で評価する。
a) 名前が《クラス名》である定数束縛を作成又は更新するクラス又はモジュールMを,次の手順を行うこ
とで決定する。
1) 《クラスパス》が《最上位クラスパス》という形式の場合,MをObjectクラスとする。
2) 《クラスパス》が《クラス名》という形式の場合,Mを現在のクラス又はモジュールとする。
3) 《クラスパス》が《入れ子クラスパス》という形式の場合,その《一次式》を評価する。評価結果が
Moduleクラスのインスタンスの場合,そのインスタンスをMとする。そうではない場合,
TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) Nを《クラス名》とする。
1) 名前がNである束縛がMの定数束縛の集合内に存在する場合,Bをその束縛とする。
i)
Bの値がClassクラスのインスタンスの場合,そのインスタンスをCとする。そうではない場合,
TypeErrorクラスの直接のインスタンスを例外として発生させる。
ii) 《スーパークラス》が存在する場合,それを評価する。評価結果の値がCの直接のスーパークラス
と一致しない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
2) そうではない場合,Classクラスの直接のインスタンスを作成する。そのクラスをCとする。
i)
《スーパークラス》が存在する場合,それを評価する。評価結果がClassクラスのインスタンスで
ない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。《スーパークラス》
の値が特異クラス又はClassクラスである場合の動作は未規定とする。そうではない場合,《ス
ーパークラス》の値をCの直接のスーパークラスとする。
94
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ii) 《クラス定義》が《スーパークラス》をもたない場合,ObjectクラスをCの直接のスーパークラス
とする。
iii) 特異クラスを作り,Cと関連付ける。この特異クラスは,スーパークラスの一つとして,Cの直
接のスーパークラスの特異クラスをもたなければならない。
iv) 名前がNで,値がCである変数束縛を作成し,それをMの定数束縛の集合に追加する。
c) 実行環境を,次の手順を行うことで変更する。
1)
クラスモジュールリスト
の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭
にCを追加する。そのリストを
クラスモジュールリスト
に積む。
2) Cを
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− 《スコープ付き定数代入》
− 次のいずれかの形式の《左辺》をその中にもつ《多重代入文》
− 《定数識別子》
− 《一次式》 [《行終端子》禁止] ( “.”|“::” ) ( 《局所変数識別子》|《定数識別子》 )
− “::” 《定数識別子》
ただし,《メソッド仮引数部》内又は《メソッド本体》内の《特異クラス定義》においては,これらの構成要
素が現れてもよい。
意味規則
メソッドは《メソッド定義》又は《特異メソッド定義》(13.4.3参照)によって定義される。メソッドは,
それを定義する《メソッド定義》又は《特異メソッド定義》の《メソッド仮引数部》及び《メソッド本体》をもつ。
《メソッド本体》は,そのメソッドが呼び出された際に評価される(13.3.3参照)。《メソッド本体》の評価は,
その《本体文》(11.5.2.5参照)の評価とする。また,メソッドは次の属性をもつ。
クラスモジュールリスト:メソッド定義時の
クラスモジュールリスト
の一番上の要素である。
定義名:メソッド定義時に指定された名前である。
可視性:メソッドの可視性である。
あるクラス又はモジュールは,それのスーパークラス又はそれにインクルードされているモジュールの
いずれかの中にあるメソッドの名前と同じ名前をもつ新しいメソッドを定義することができる。その場合,
その新しいメソッドは,そのスーパークラス又はインクルードされているモジュールのメソッドを上書き
するという。
《メソッド定義》は,次の手順で評価する。
a) Nを《メソッド名》とする。
b) この《メソッド定義》によって定義されるメソッドUを作成する。Uの属性を,次のように初期化する。
− クラスモジュールリスト属性を,
クラスモジュールリスト
の一番上の値とする。
− 定義名属性をNとする。
− 可視性属性を次のように初期化する。
− 現在のクラス又はモジュールが特異クラスの場合,現在の可視性とする。
− そうではなく,Nが “initialize” 又は “initialize̲copy” の場合,privateとする。
− そうではない場合,現在の可視性とする。
c) 名前がNである束縛が,現在のクラス又はモジュールのインスタンスメソッド束縛の集合内に存在す
る場合,その束縛の値をVとする。
1) Vがundefの場合,この《メソッド定義》の評価方法は処理系定義とする。
2) 束縛の値VをUで置き換える。
d) そうではない場合,名前がNで,値がUであるメソッド束縛を作成し,それを現在のクラス又はモジ
ュールのインスタンスメソッド束縛の集合に追加する。
e) 《メソッド定義》の値は,処理系定義とする。
96
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
13.3.2 メソッド仮引数
構文規則
《メソッド仮引数部》 ::
“(” 《仮引数リスト》? “)”
|《仮引数リスト》? 《分離子》
《仮引数リスト》 ::
《必須仮引数リスト》 ( “,” 《省略可能仮引数リスト》 )?
( “,” 《配列仮引数》 )? ( “,” 《Proc仮引数》 )?
|《省略可能仮引数リスト》 ( “,” 《配列仮引数》 )? ( “,” 《Proc仮引数》 )?
|《配列仮引数》 ( “,” 《Proc仮引数》 )?
|《Proc仮引数》
《必須仮引数リスト》 ::
《必須仮引数》
|《必須仮引数リスト》 “,” 《必須仮引数》
《必須仮引数》 ::
《局所変数識別子》
《省略可能仮引数リスト》 ::
《省略可能仮引数》
|《省略可能仮引数リスト》 “,” 《省略可能仮引数》
《省略可能仮引数》 ::
《省略可能仮引数名》 “=” 《省略値仮引数式》
《省略可能仮引数名》 ::
《局所変数識別子》
《省略値仮引数式》 ::
《演算子式》
《配列仮引数》 ::
“*” 《配列仮引数名》
|“*”
《配列仮引数名》 ::
《局所変数識別子》
《Proc仮引数》 ::
“&” 《Proc仮引数名》
《Proc仮引数名》 ::
《局所変数識別子》
《仮引数リスト》において,その《必須仮引数》,《省略可能仮引数名》,《配列仮引数名》及び《Proc仮引数
名》の,《局所変数識別子》は,全て異なる名前でなければならない。
意味規則
仮引数には,次に示す4種類がある。これらの仮引数が,実引数に束縛される仕組みについて,13.3.3
で規定する。
97
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
必須仮引数:必須仮引数は,《必須仮引数》によって表される。それぞれの必須仮引数には,対応する実
引数がメソッド呼出し時に与えられなければならない。
省略可能仮引数:省略可能仮引数は,《省略可能仮引数》によって表される。それぞれの省略可能仮引数
は,《省略可能仮引数名》によって表される仮引数名と,《省略値仮引数式》によって表される式とか
ら構成される。省略可能仮引数に対応する実引数がメソッド呼出し時に与えられなかった場合,そ
の省略可能仮引数に対応する実引数の値として,《省略値仮引数式》の値が使用される。
配列仮引数:配列仮引数は,《配列仮引数名》によって表される。メソッド呼出し時に与えらえた《ブロッ
ク実引数》を除く実引数の個数をNとして,Nが必須仮引数の個数及び省略可能仮引数の個数の合
計より大きい場合,《ブロック実引数》以外の全ての超過した実引数を含むArrayクラスの直接のイ
ンスタンスが配列仮引数に束縛される。超過する実引数がない場合,配列仮引数にはArrayクラス
の空の直接のインスタンスが束縛される。《配列仮引数》が “*” という形式の場合,超過した実引数
は無視される。
Proc仮引数:Proc仮引数は,《Proc仮引数名》によって表される。Proc仮引数には,メソッド呼出しに渡
されたブロックを表すProcクラスの直接のインスタンスが束縛される。
13.3.3 メソッド呼出し
実引数のリストの作成方法については,11.3で示す。
メソッド呼出しのレシーバをR,メソッド名をM,実引数のリストをAとする。この条件の下で,次の
処理を実行する。
a) メソッド呼出しに《ブロック》が渡された場合,Bをその《ブロック》とする。そうではない場合,Bを
block-not-givenとする。
b) Rが特異クラスをもつ場合,その特異クラスをCとする。そうではない場合,RのクラスをCとする。
c) Cを起点とし,名前がMであるメソッド束縛を探索する(13.3.4参照)。
d) 束縛が見つかり,その値がundefでない場合,Vをその束縛の値とする。
e) そうではない場合で,Mがmethod̲missingの場合の動作は未規定とする。Mがmethod̲missing
でない場合,名前がMであるSymbolクラスの直接のインスタンスをAの先頭に追加し,
method̲missingメソッド(15.3.1.3.30参照)をRに対しAを実引数リスト,Bを《ブロック》として
呼び出す。Oを呼出し結果の値とし,手順j)から処理を続ける。
f)
メソッドが呼出し可能かどうかを調べるため,Vの可視性をチェックする(13.3.5参照)。メソッドが
呼び出せない場合は,名前がMであるSymbolクラスの直接のインスタンスをAの先頭に追加し,
method̲missingメソッドをRに対しAを実引数リスト,Bを《ブロック》として呼び出す。Oを呼
出し結果の値とし,手順j)から処理を続ける。
g) 実行環境を,次のように変更する。
1) Vのクラスモジュールリストを
クラスモジュールリスト
に積む。
2) Rを
self
に積む。
3) Mを
呼出し時メソッド名
に積む。
4) 可視性publicを
省略時可視性
に積む。
5) Vの定義名を
定義時メソッド名
に積む。
6) Bを
ブロック
に積む。
7) 空の束縛の集合を
局所変数束縛集合
に積む。
h) Vの《メソッド仮引数部》を,次の手順で評価する。
98
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) 《メソッド仮引数部》の《仮引数リスト》をLとする。
2) Lの,《必須仮引数リスト》の全ての《必須仮引数》,《省略可能仮引数リスト》の全ての《省略可能仮引
数》,及び《配列仮引数》をそれぞれ,Pm,Po及びPaとする。Aの要素の個数,Pmの個数,及びPo
の個数をそれぞれ,NA,NPm及びNPoとする。《必須仮引数》又は《省略可能仮引数》が存在しない場
合,NPm及びNPoは0とする。Sbを現在の局所変数束縛の集合とする。
3) NAがNPmより小さい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
4) Paが存在せず,かつ,NAがNPmとNPoとの合計より大きい場合,ArgumentErrorクラスの直接の
インスタンスを例外として発生させる。
5) そうではない場合,Aのそれぞれのi番目の実引数Aiについて,A内の順序と同順に,次の手順を
行う。
i)
L内に現れる順番でi番目の《必須仮引数》又は《省略可能仮引数》を,Piとする。
ii) 該当するPiが存在しない場合,手順h) 6)から処理を続ける。
iii) Piが必須仮引数の場合,nをその《必須仮引数》とする。Piが省略可能仮引数の場合,nをその《省
略可能仮引数名》とする。名前がn,値がAiである変数束縛を作成し,それをSbに追加する。
6) NAがNPmとNPoとの合計より大きく,かつ,Paが存在する場合は,次の手順を行う。
i)
超過した実引数の数と長さとが等しいような,Arrayクラスの直接のインスタンスXを作成する。
ii) 超過した実引数を,実引数リストに現れる順序を保って,Xに格納する。
iii) nをPaの《配列仮引数名》とする。
iv) 名前がnで,値がXである変数束縛を作成し,それをSbに追加する。
7) NAがNPmとNPoとの合計より小さい場合,次の手順を行う。
i)
対応する実引数のないそれぞれの省略可能仮引数POiに対し,POiの《省略値仮引数式》を評価し,
Xを評価結果の値とする。
ii) nをPOiの《省略可能仮引数名》とする。
iii) 名前がnで,値がXである変数束縛を作成し,それをSbに追加する。
8) NAが,NPmとNPoとの合計より少ないか同数であって,かつ,Paが存在する場合は,次の処理を実
行する。
i)
Arrayクラスの空の直接のインスタンスXを作る。
ii) nをPaの《配列仮引数名》とする。
iii) 名前がnで,値がXである変数束縛を作成し,それをSbに追加する。
9) Lの《Proc仮引数》が存在する場合,Dを
ブロック
の一番上の要素とする。
i)
Dがblock-not-givenの場合,Xをnilとする。
ii) そうではない場合,Procクラスに対し,newメソッドを呼び出す。この呼出しには,空の実引
数リスト及び《ブロック》Dを渡す。そのメソッド呼出しの値をXとする。
iii) 《Proc仮引数》の《Proc仮引数名》をnとする。
iv) 名前がnで,値がXである変数束縛を作成し,それをSbに追加する。
i)
Vの《メソッド本体》を評価する。
1) この《メソッド本体》の評価が《return式》によって終了された場合,次の手順を行う。
i)
《return式》が《ジャンプ実引数》をもつ場合,Oをその《ジャンプ実引数》の値とする。
ii) そうではない場合,Oをnilとする。
2) そうではない場合,Oを評価結果の値とする。
99
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
j)
クラスモジュールリスト
,
self
,
呼出し時メソッド名
,
省略時可視性
,
定義時メソッド名
,
ブロック
及び
局所変数束縛集合
の一番上の要素を取り除くことによって,実行環境を復元する。
k) このメソッド呼出しの結果はOとする。
手順g)で変更された,
局所変数束縛集合
を除く実行環境の属性の,一番上の要素の集合が対応するメ
ソッド呼出し又は《super式》[11.3.4 d)参照]を,現在のメソッド呼出しと呼ぶ。
13.3.4 メソッド探索
メソッド探索は,インスタンスメソッド束縛を解決する処理である。
Mをメソッド名,Cをメソッド探索の起点となるクラス又はモジュールとする。この条件の下で,メソ
ッド束縛は次のように解決する。
a) 名前がMであるメソッド束縛が,Cのインスタンスメソッド束縛の集合内に存在する場合,その束縛
をBとする。
b) そうではない場合,CのインクルードモジュールリストLmを末尾から順に処理する。Lm中のそれぞ
れのモジュールに対して,そのインスタンスメソッド束縛の集合内に,名前がMであるメソッド束縛
が存在するかどうか確認する。
1) 該当する束縛が存在する場合,その束縛をBとする。
2) そうではない場合,次の手順を行う。
i)
Cが直接のスーパークラスをもたない場合,束縛は解決されなかったとみなす。
ii) Cが直接のスーパークラスをもつ場合,Cの直接のスーパークラスを新たなCとし,手順a)から
探索処理を継続する。
c) Bが,解決されたメソッド束縛であるとする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− メソッドの束縛が存在するModuleクラスのインスタンスを,Mとする。
現在のselfがMをインクルードしている場合,Mが現在のselfのクラスである場合,又はMが現
在のselfのクラスのスーパークラスの一つである場合。
Mが特異クラスの場合,ある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) 《新しい名前》が《メソッド定義名》の場合,《メソッド定義名》をNとする。
2) 《新しい名前》が《シンボル》の場合,《シンボル》を評価する。その評価結果であるSymbolクラスの
インスタンスの名前をNとする。
b) 《別名付与対象名》を次の手順で評価する。
1) 《別名付与対象名》が《メソッド定義名》の場合,《メソッド定義名》をAとする。
2) 《別名付与対象名》が《シンボル》の場合,《シンボル》を評価する。その評価結果であるSymbolクラ
スのインスタンスの名前をAとする。
c) Cを現在のクラス又はモジュールとする。
d) Cを起点として,名前がAであるメソッド束縛を13.3.4で規定するように探索する。
e) 束縛が見つかり,かつ,その値がundefでない場合,Vを見つかった束縛の値とする。
f)
そうではない場合,Sを名前がAであるSymbolクラスの直接のインスタンスとし,Sを名前属性に
もつNameErrorクラスの直接のインスタンスを例外として発生させる。
g) 名前がNであるメソッド束縛が,現在のクラス又はモジュールのインスタンスメソッド束縛の集合内
に存在する場合,その束縛の値をVで置き換える。
h) そうではない場合,名前がNで,値がVであるメソッド束縛を作成し,それを現在のクラス又はモジ
ュールのインスタンスメソッド束縛の集合に追加する。
i)
《alias文》の値はnilである。
101
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
13.3.7 undef文
構文規則
《undef文》 ::
“undef” 《undefリスト》
《undefリスト》 ::
《メソッド名・記号》 ( “,” 《メソッド名・記号》 )*
《メソッド名・記号》 ::
《メソッド定義名》
|《シンボル》
意味規則
《undef文》は,次の手順で評価する。
a) 《undefリスト》のそれぞれの《メソッド名・記号》について,次の処理を行う。
1) Cを現在のクラス又はモジュールとする。
2) 《メソッド名・記号》が《メソッド定義名》の場合,《メソッド定義名》をNとする。そうではない場合,
《シンボル》を評価する。その評価結果であるSymbolクラスのインスタンスの名前を,Nとする。
3) 名前がNであるメソッド束縛を,Cを起点として13.3.4で規定するように探索する。
4) 束縛が見つかり,かつ,その値がundefでない場合は,次の手順を行う。
i)
束縛がC内に見つかった場合,その束縛の値をundefに置き換える。
ii) そうではない場合,名前がNで,値がundefであるメソッド束縛を作成し,それをCのインスタ
ンスメソッド束縛の集合に追加する。
5) そうではない場合,Sを名前がNであるSymbolクラスの直接のインスタンスとし,Sを名前属性
にもつNameErrorクラスの直接のインスタンスを例外として発生させる。
b) 《undef文》の値はnilとする。
13.4 特異クラス
13.4.1 概要
特異クラスは,他のオブジェクトと関連付けられた特別なクラスである。特異クラスは,関連付けられ
たオブジェクトの動作を変更する。特異クラスCがオブジェクトOと関連付けられているとき,CはO
の特異クラスであるという。また,OはCの第1関連オブジェクトであるという。
一つのオブジェクトは,高々一つの特異クラスしかもたない。オブジェクトは,生成された時点では特
異クラスと関連付けられていてはならない。ただし,Classクラスのインスタンスは除く。特異クラスは,
《特異メソッド定義》,《特異クラス定義》などのプログラム構成要素を評価することで作られる。ただし,
Classクラスのインスタンスが作られたときは,そのインスタンスは既に特異クラスと関連付けられてい
なければならない。
通常,特異クラスはその第1関連オブジェクトだけに関連付けられなければならない。しかし,Class
クラスのインスタンスの特異クラスは,幾つかのClassクラスのインスタンス(これらはある特異クラス
の第1関連オブジェクトであってはならない。)と,処理系定義のやり方によって,追加で関連付けられて
もよい。特異クラスとその第1関連オブジェクトとがひとたび関連付けられた場合,その関連付けが削除
されることはあってはならない。しかし,前述の追加で関連付けられたClassクラスのインスタンスが別
の特異クラスの第1関連オブジェクトになった場合は,Classクラスのインスタンスとその特異クラスと
102
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
の関連付けは削除される[13.4.2 e)及び13.4.3 e)参照]。
全ての特異クラスはClassクラスのインスタンスであり(15.2.3参照),クラスがもつのと同じ属性の
集合をもつ。
特異クラスの直接のスーパークラスは,処理系定義とする。ただし,特異クラスは,それが関連付けら
れているオブジェクトのクラスのサブクラスでなければならない。
注記1 例えば,ObjectクラスはClassクラスの直接のインスタンスであるので,Objectクラス
の特異クラスはClassクラスのサブクラスである。それゆえ,Classクラスのインスタン
スメソッドはObjectクラスに対して呼び出すことができる。
直接のスーパークラスをもつクラスの特異クラスは,次の条件を満たさなければならない。
− EcをクラスCの特異クラス,SをCの直接のスーパークラス,EsをSの特異クラスとする。このとき,
Ecは,Esをスーパークラスの一つとしてもつ。
注記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) 《式》を評価する。評価結果の値をOとする。OがIntegerクラスのインスタンス又はSymbolクラ
スのインスタンスの場合,TypeErrorクラスの直接のインスタンスを例外として発生させてもよい。
b) Oがnil,true,又はfalseのいずれかの場合,EをOのクラスとし,手順f)に進む。
c) Oが特異クラスに関連付けられていない場合,新たな特異クラスを作成する。その特異クラスをEと
し,Oを第1関連オブジェクトとしてEと関連付ける。
d) Oが第1関連オブジェクトとして特異クラスと関連付けられている場合,その特異クラスをEとする。
e) Oが第1関連オブジェクトとしてではなく特異クラスと関連付けられていた場合は,Oと特異クラス
との関連付けを削除し,新たな特異クラスを作成する。新しく作成した特異クラスをEとし,Oを第
1関連オブジェクトとしてEと関連付ける。
f)
実行環境を,次のとおり変更する。
1)
クラスモジュールリスト
の一番上のリストと同じ内容をもつリストを作成し,そのリストの先頭
103
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
にEを追加する。そのリストを
クラスモジュールリスト
に積む。
2) Eを
self
に積む。
3) 可視性publicを
省略時可視性
に積む。
4) 空の束縛の集合を
局所変数束縛集合
に積む。
g) 《特異クラス本体》を評価する。《特異クラス本体》の評価結果を《特異クラス定義》の値とする。
h)
クラスモジュールリスト
,
self
,
省略時可視性
及び
局所変数束縛集合
の一番上の要素を取り除
くことによって,実行環境を復元する。
13.4.3 特異メソッド定義
構文規則
《特異メソッド定義》 ::
“def” 《特異オブジェクト》 ( “.”|“::”) 《メソッド定義名》 [《行終端子》禁止]
《メソッド仮引数部》 《メソッド本体》 “end”
《特異オブジェクト》 ::
《変数参照》
|“(” 《式》 “)”
意味規則
《特異メソッド定義》は次の手順で評価する。
a) 《特異オブジェクト》を評価する。評価結果の値をSとする。SがNumericクラスのインスタンス又は
Symbolクラスのインスタンスの場合,TypeErrorクラスの直接のインスタンスを例外として発生さ
せてもよい。
b) Sがnil,true,又はfalseのいずれかの場合,EをOのクラスとし,手順f)に進む。
c) Sが特異クラスに関連付けられていない場合,新たな特異クラスを作成する。その特異クラスをEと
し,Sを第1関連オブジェクトとしてEと関連付ける。
d) Sが第1関連オブジェクトとして特異クラスと関連付けられている場合,その特異クラスをEとする。
e) Sが第1関連オブジェクトとしてではなく特異クラスと関連付けられていた場合は,Sと特異クラスと
の関連付けを削除し,新たな特異クラスを作成する。新しく作成した特異クラスをEとし,Sを第1
関連オブジェクトとしてEと関連付ける。
f) Nを《メソッド定義名》とする。
g) 《特異メソッド定義》によって定義されるメソッドUを作成する。Uは,13.3.1で規定されるとおり,《特
異メソッド定義》の《メソッド仮引数部》及び《メソッド本体》をもつ。Uの属性を次のように初期化する。
− クラスモジュールリスト属性を,
クラスモジュールリスト
の一番上の値とする。
− 定義名属性をNとする。
− 可視性属性を,publicとする。
h) 名前がNである束縛が,Eのインスタンスメソッド束縛の集合内に存在する場合,その束縛の値をV
とする。
1) Vがundefの場合,この《特異メソッド定義》の評価方法は処理系定義とする。
2) 束縛の値をUで置き換える。
i)
そうではない場合,名前がNで,値がUであるメソッド束縛を作成し,それをEのインスタンスメソ
ッド束縛の集合に追加する。
104
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
j)
《特異メソッド定義》の値は,処理系定義とする。
14 例外
14.1 概要
Exceptionクラスのインスタンスが例外として発生した場合,その時点の評価処理は停止し,この例
外を処理できるプログラム構成要素に制御が移る。
14.2 例外の発生要因
例外は,次のいずれかの場合に発生する。
− raiseメソッドが呼び出された場合(15.3.1.2.12参照)。
− この規格の様々な箇所で示されるような例外条件が発生した場合。
例外として発生させられるのはExceptionクラスのインスタンスだけである。
14.3 例外の処理
例外は,《本体文》,《rescue修飾子付き代入》又は《rescue修飾文》によって処理される。これらのプログ
ラム構成要素を,例外ハンドラと呼ぶ。例外ハンドラが例外を処理しているとき,その処理される例外を,
現在の例外と呼ぶ。
発生した例外は,例外ハンドラによって処理される。この例外ハンドラは,次のとおり決定する。
a) 例外が発生した地点を字句的に含み,かつ,《プログラム》,《メソッド定義》,《特異メソッド定義》又
は《ブロック》のいずれかに対応する局所変数のスコープのうち最内側のものをSとする。
b) Sの中にあって,例外が発生した地点を字句的に含む,全ての例外ハンドラについて,最内側から最
外側まで,次の調査を行う。
− 《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) 例外を処理できる例外ハンドラがS内に見つかった場合,例外ハンドラの探索を終了する。そして,
その例外ハンドラに関連するプログラム構成要素から,プログラムの評価を続ける[11.4.2.5 b),
11.5.2.5 d),及び12.7 b)参照]。
d) 例外を処理できる例外ハンドラがS内に見つからない場合,次の手順を行う。
1) Sが《メソッド定義》又は《特異メソッド定義》に対応する場合,13.3.3の手順h)又は手順i)を終了し,
現在のメソッド呼出しの手順j)を実行する(13.3.3参照)。そして,そのメソッドが呼び出された場
所でその例外が発生したものとして,手順a)から探索を続ける。
2) Sが《ブロック》に対応する場合,現在の《ブロック》の評価を終了し,11.3.3 f)を実行する。そして,
その《ブロック》が呼び出された場所でその例外が発生したものとして,手順a)から探索を続ける。
105
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
3) Sが《プログラム》に対応する場合,その《プログラム》の評価を終了し,10.1 d)を実行してから,そ
の例外の情報を処理系定義の方法で出力する。
15 組込みクラス及び組込みモジュール
15.1 概要
組込みクラス及び組込みモジュールは,プログラムの実行前にあらかじめ作成されるクラス及びモジュ
ールとする(7.2参照)。図1は,これらのクラスとモジュールとを,クラス階層とインクルードされてい
るモジュールとの関係とともに示したものである。
組込みクラス及び組込みモジュールは,それぞれ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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
図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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Objectクラスの定数束縛の名前として使われる(15.2.1.4参照)。
− Objectクラス(15.2.1参照)以外の組込みクラスは,その組込みクラスを規定する細分箇条の下位
階層にある“直接のスーパークラス”という題名の細分箇条に記載されたクラスを,直接のスーパー
クラスとしてもつ。
− 組込みクラス又は組込みモジュールを規定する細分箇条の下位階層に“インクルードモジュール”と
いう題名の細分箇条がある場合には,その組込みクラス又は組込みモジュールは,そこに記載された
モジュール群を,記載されている順にインクルード(13.1.3参照)する。
− “特異メソッド”という題名の細分箇条の下位階層に,“C.m”という形式の題名の細分箇条がある場
合,それはクラスCの特異メソッドmを規定する。
− “インスタンスメソッド”という題名の細分箇条の下位階層に,“C#m”という形式の題名の細分箇条
がある場合,それはクラスCのインスタンスメソッドmを規定する。
− メソッドの仮引数仕様は,《メソッド仮引数部》の形式で規定される(13.3.2参照)。
例1 次の例は,メソッドsampleの仮引数仕様を規定している。
sample(arg1, arg2, opt=expr, *ary, &blk)
− 特異メソッド名の前には,接頭語として,クラス又はモジュールの名前及びピリオド(“.”)を付加
する。
例2 次の例は,クラスSampleClassの特異メソッドsampleの仮引数仕様を規定している。
SampleClass.sample(arg1, arg2, opt=expr, *ary, &blk)
− 仮引数仕様に続き,メソッドの可視性及び動作を規定する。
可視性は,“可視性:”というラベルに続いて規定する。可視性は,public,protected又はprivateの
いずれかである。
次に,“動作:”というラベルに続けて,メソッドの動作,すなわち,メソッドの《メソッド本体》
を評価するときの手順[13.3.3 i)参照]を規定する。
これらの手順において,メソッドの仮引数仕様に現れる仮引数の名前の参照は,同名の局所変数に
束縛されたオブジェクトを示す。
− 仮引数の名前及び説明に使用する変数の名前はイタリック字体で示す。
− “Xを実引数としてblockを呼び出す”という表現は,Proc仮引数blockに対応する《ブロック》を,X
を実引数として,11.3.3のように呼び出すことをいう。
− “Xを返す”という表現は,メソッドの《メソッド本体》の評価をその時点で終了し,Xをこの《メソッ
ド本体》の値とすることを示す。
− “Nによって指定される名前”という表現は,次の手順の結果を示す。
a) NがSymbolクラスのインスタンスの場合,Nの名前とする。
b) NがStringクラスのインスタンスの場合,Nの内容(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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
(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
Bとする。)を,次のうちのいずれかが成り立つこと
であると定義する。
− Bがモジュールであって,BがAにインクルードされている(13.1.3参照)。
− AとBとが共にClassクラスのインスタンスであって,BがAのスーパークラスである。
15.2.2.2 直接のスーパークラス
Objectクラス
15.2.2.3 特異メソッド
15.2.2.3.1 Module.constants
109
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Module.constants
可視性:public
動作:
a) Arrayクラスの空の直接のインスタンスを作り,それをAとする。
b) 現在のクラス又はモジュールをCとする。
クラスモジュールリスト
の上から2番目の位置にあるリ
ストと同じ要素(最後の要素であるObjectクラスを除く。)を含むリストを,Lとする。
Cの全てのスーパークラス(Objectクラスを除く。)及びC自身からなる集合を,CSとする。た
だし,C自身がObjectクラスの場合には,ObjectクラスもCSに含まれる。CSに含まれる全ての
クラスのインクルードモジュールリストに含まれる全てのモジュールからなる集合を,MSとする。L,
CS及びMSの和集合を,CMとする。
c) CM内のクラス又はモジュールのそれぞれ(それをcとする。)に対して,更に,そのcの中に定義さ
れている定数の名前のそれぞれ(それをNとする。)に対して,次の手順を行う。
1) 内容がNである新しく作ったStringクラスの直接のインスタンス,又は,名前がNであるSymbol
クラスの直接のインスタンスのいずれかを,Sとする。ただし,Sの値としてどちらを選ぶかは,処
理系定義とする。
2) 次の場合を除き,SをAに挿入する(Sが挿入される位置は処理系定義とする。)。すなわち,Sが
Symbolクラスのインスタンスであって,かつ,AがSと同じ名前のSymbolクラスのインスタン
スを要素にもつ場合,又は,SがStringクラスのインスタンスであって,かつ,AがSと同じ内
容のStringクラスのインスタンスを要素にもつ場合は,追加しない。
d) Aを返す。
15.2.2.3.2 Module.nesting
Module.nesting
可視性:public
動作:
クラスモジュールリスト
の上から2番目の要素であるリストの,最後の要素以外の要素を同じ順
序で含む新しく作ったArrayクラスの直接のインスタンスを返す。
15.2.2.4 インスタンスメソッド
15.2.2.4.1 Module#<=>
<=>(other)
可視性:public
動作:Aをotherとする。Rをレシーバとする。
a) AがModuleクラスのインスタンスでない場合,nilを返す。
b) A及びRが同じオブジェクトの場合,値が0のIntegerクラスのインスタンスを返す。
c) R
Aの場合,値が−1のIntegerクラスのインスタンスを返す。
d) A
Rの場合,値が1のIntegerクラスのインスタンスを返す。
e) それ以外の場合,nilを返す。
15.2.2.4.2 Module#<
<(other)
可視性:public
動作:Aをotherとする。Rをレシーバとする。
110
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) AがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外と
して発生させる。
b) A及びRが同じオブジェクトの場合,falseを返す。
c) R
Aの場合,trueを返す。
d) A
Rの場合,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
動作:Aをotherとする。Rをレシーバとする。
a) AがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外と
して発生させる。
b) A及びRが同じオブジェクトの場合,falseを返す。
c) R
Aの場合,falseを返す。
d) A
Rの場合,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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:private
動作:Cをレシーバとする。
a) new̲nameによって指定される名前を,Nとする。aliased̲nameによって指定される名前を,Aとする。
b) 13.3.6の手順d)から手順h)までを行う。ここで,13.3.6のA,C及びNは,上記の手順のA,C及びN
とする。
c) Cを返す。
15.2.2.4.9 Module#ancestors
ancestors
可視性:public
動作:
a) Arrayクラスの空の直接のインスタンスAを作る。
b) Cをレシーバとする。
c) Cが特異クラスである場合,このメソッドの動作は処理系定義とする。
d) そうではない場合,CをAの末尾に追加する。
e) Cのインクルードモジュールリストのそれぞれの要素を,リスト内と逆順にAの末尾に追加する。
f) Cが直接のスーパークラスをもつ場合,Cの直接のスーパークラスを新たにCとし,手順c)から繰り
返す。
g) Aを返す。
15.2.2.4.10
Module#append̲features
append̲features(module)
可視性:private
動作:レシーバ及びmoduleのそれぞれのインクルードモジュールリストを,L1及びL2とする。
a) module及びレシーバが同じオブジェクトの場合,このメソッドの動作は未規定とする。
b) レシーバがL2の要素の場合,このメソッドの動作は処理系定義とする。
c) そうではない場合,L1のそれぞれのモジュールMについて,リスト内と同順に,次の手順を行う。
1) M及びmoduleが同じオブジェクトの場合,このメソッドの動作は未規定とする。
2) MがL2に含まれていない場合,MをL2の末尾に追加する。
d) レシーバをL2の末尾に追加する。
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
動作:Cをレシーバとする。
a) name̲listのそれぞれの要素Eに対し,次の手順を行う。
112
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) Eによって指定される名前をNとする。
2) Nが《局所変数識別子》又は《定数識別子》のいずれの形式でもない場合,Eを名前属性にもつ
NameErrorクラスの直接のインスタンスを例外として発生させる。
3) このメソッドが呼び出された位置で次のメソッド定義を評価するのと同様にして,Cにインスタン
スメソッドを定義する。次のメソッド定義内の “N” はNであるとし,“@N” はNの前に “@” を加
えた名前であるとする。
def N
@N
end
4) このメソッドが呼び出された位置で次のメソッド定義を評価するのと同様にして,Cにインスタン
スメソッドを定義する。次のメソッド定義内の “N=” はNの後に “=” を加えた名前であるとし,
“@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) Mをレシーバとする。
b) blockが与えられている場合,次の手順を行う。
1) stringが与えられている場合,ArgumentErrorクラスの直接のインスタンスを例外として発生さ
せる。
2) blockを,処理系定義の実引数とともに,11.3.3で規定されているように呼び出し,Vを呼出し結果
の値とする。規格適合処理系は,11.3.3 d)の直前に,実行環境を次のように変更しなければならな
い。
−
クラスモジュールリスト
の一番上のリストと同じ内容のリストを作り,その先頭にMを追加す
113
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
る。作ったリストを
クラスモジュールリスト
に積む。
− レシーバを
self
に積む。
− 可視性publicを
省略時可視性
に積む。
規格適合処理系は,11.3.3 d)及びe)においては,上記の手順で
クラスモジュールリスト
の一番上
のリストの先頭に追加したMを無視しなければならない。ただし,《メソッド定義》(13.3.1参照),
《alias文》(13.3.6参照),又は《undef文》(13.3.7参照)で現在のクラス又はモジュールを参照する
場合を除く。
3) Vを返す。
c) blockが与えられていない場合,次の手順を行う。
1) stringがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) このメソッドが呼び出される直前の実行環境をEとする。
3) Eを次のとおり変更する。
−
クラスモジュールリスト
の一番上のリストと同じ内容のリストを作り,その先頭にMを追加す
る。作ったリストを
クラスモジュールリスト
に積む。
− レシーバを
self
に積む。
− 可視性publicを
省略時可視性
に積む。
4) stringの内容を《プログラム》(10.1参照)として構文解析する。これが失敗した場合,SyntaxError
クラスの直接のインスタンスを例外として発生させる。
5) 《プログラム》を実行環境Eの下で評価し,評価結果の値をVとする。
6)
クラスモジュールリスト
,
self
及び
省略時可視性
の一番上の要素を取り除くことによって,実
行環境Eを復元する。この処理は,c) 4)又はc) 5)で例外が発生したが,それが処理されなかった場
合であっても行う。
7) Vを返す。
手順c) 5)では,その《プログラム》に対応する局所変数のスコープは,9.2 d) 1)において,《ブロック》に
対応する局所変数のスコープとみなされる。
15.2.2.4.16
Module#class̲variable̲defined?
class̲variable̲defined?(symbol)
可視性:public
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《クラス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接
のインスタンスを例外として発生させる。
c) 11.5.4.5の手順b)から手順d)までを実行することによって,名前がNであるクラス変数束縛を探す。
ここで,11.5.4.5のC及びNはそれぞれ上記の手順のC及びNとする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《クラス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接
のインスタンスを例外として発生させる。
c) 11.5.4.5のb)からd)までを実行することによって,名前がNであるクラス変数束縛を探す。ここで,
11.5.4.5のC及びNはそれぞれ上記の手順のC及びNとする。
d) 束縛が見つかった場合,その束縛の値を返す。
e) そうではない場合,symbolを名前属性にもつNameErrorクラスの直接のインスタンスを例外として
発生させる。
15.2.2.4.18
Module#class̲variable̲set
class̲variable̲set(symbol, obj)
可視性:処理系定義
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《クラス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接
のインスタンスを例外として発生させる。
c) 11.5.4.5の手順b)から手順d)までを実行することによって,名前がNであるクラス変数束縛を探す。
ここで,11.5.4.5のC及びNはそれぞれ上記の手順のC及びNとする。
d) 束縛が見つかった場合,その束縛の値をobjに置き換える。
e) そうではない場合,名前がNであり値がobjである束縛をCのクラス変数束縛の集合内に作る。
f) objを返す。
15.2.2.4.19
Module#class̲variables
class̲variables
可視性:public
動作:
a) クラス変数の名前の空の集合をNSとする。
b) Cをレシーバとする。Cに定義されている全てのクラス変数の名前をNSに追加する。
c) CのインクルードモジュールリストをLとする。LのそれぞれのモジュールMに対し,Mに定義され
ている全てのクラス変数の名前をNSに追加する。
d) CがClassクラスのインスタンスの場合,次の手順を行う。
1) Cが直接のスーパークラスをもたない場合は,手順e)へ進む。
2) Cの直接のスーパークラスをSとする。
3) Sに定義されている全てのクラス変数の名前をNSに追加する。
4) SのインクルードモジュールリストをLとする。LのそれぞれのモジュールMに対して,Mに定義
されている全てのクラス変数の名前をNSに追加する。
5) Sの直接のスーパークラスをCとする。手順d) 1)から処理を継続する。
e) NSの全ての名前を要素にもつArrayクラスの新しい直接のインスタンスAを返す。これらの名前は,
Stringクラス又はSymbolクラスの直接のインスタンスとして表す。どちらのクラスを選ぶかは処
理系定義とする。また,Aの要素の順序も処理系定義とする。
115
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
手順c)及びd)を行うかどうかは処理系定義とする。
15.2.2.4.20
Module#const̲defined?
const̲defined?(symbol)
可視性:public
動作:
a) Cをレシーバとする。
b) symbolによって指定される名前をNとする。
c) Nが《定数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接のイン
スタンスを例外として発生させる。
d) Cの定数束縛の集合内に名前がNである束縛が存在する場合,trueを返す。
e) 11.5.4.2の手順d)から,Nの定数束縛を探索する。ここで,11.5.4.2のCはこのメソッド呼出しのレシ
ーバであるとする。ただし,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によって指定される名前をNとする。
b) Nが《定数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接のイン
スタンスを例外として発生させる。
c) レシーバに対し,名前がNである定数束縛を探す。
d) 束縛が見つかった場合,その束縛の値を返す。
e) 名前がNである定数束縛の探索を,11.5.4.2の手順d)から行う。ここで,11.5.4.2のCはこのメソッド
呼出しのレシーバであるとする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《定数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接のイン
スタンスを例外として発生させる。
c) Cの定数束縛の集合内に名前がNである束縛が存在する場合,その束縛の値をobjに置き換える。
d) そうではない場合,Cの定数束縛の集合内に名前がNであり値がobjである束縛を作る。
e) objを返す。
15.2.2.4.24
Module#constants
constants
可視性:public
動作:
a) 定数の名前の空の集合をNSとする。
b) Cをレシーバとする。Cに定義されている全ての定数の名前をNSに追加する。
c) CのインクルードモジュールリストをLとする。LのそれぞれのモジュールMに対し,Mに定義され
ている全ての定数の名前をNSに追加する。
d) CがClassクラスのインスタンスの場合,次の手順を行う。
1) Cが直接のスーパークラスをもたない場合,又はCの直接のスーパークラスがObjectクラスの場
合は,手順e)へ進む。
2) Cの直接のスーパークラスをSとする。
3) Sに定義されている全ての定数の名前をNSに追加する。
4) SのインクルードモジュールリストをLとする。LのそれぞれのモジュールMに対して,Mに定義
されている全ての定数の名前をNSに追加する。
5) Sの直接のスーパークラスをCとする。手順d) 1)から処理を継続する。
e) NSの全ての名前を要素にもつArrayクラスの新しい直接のインスタンスAを返す。これらの名前は,
Stringクラス又はSymbol クラスの直接のインスタンスとして表す。どちらのクラスを選ぶかは処
理系定義とする。また,Aの要素の順序も処理系定義とする。
15.2.2.4.25
Module# extend̲object
extend̲object(object)
可視性:private
動作:Sをobjectの特異クラスとする。append̲featuresメソッド(15.2.2.4.10参照)をレシーバに対
しSを実引数として呼び出し,呼出し結果の値を返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
include(*module̲list)
可視性:private
動作:Cをレシーバとする。
a) module̲listのそれぞれの要素Aに対し,module̲list内と逆順に,次の手順を行う。
1) AがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外
として発生させる。
2) AがClassクラスのインスタンスの場合,TypeErrorクラスの直接のインスタンスを例外として
発生させる。
3) Aに対し,Cを実引数としてappend̲featuresメソッド(15.2.2.4.10参照)を呼び出す。
4) Aに対し,Cを実引数としてincludedメソッド(15.2.2.4.29参照)を呼び出す。
b) Cを返す。
15.2.2.4.28
Module#include?
include?(module)
可視性:public
動作:Cをレシーバとする。
a) moduleがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例
外として発生させる。
b) moduleがCのインクルードモジュールリストの要素の場合,trueを返す。
c) そうではない場合で,CがClassクラスのインスタンスであり,moduleがCのいずれかのスーパー
クラスのインクルードモジュールリストの要素の場合,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
動作:Cをレシーバとする。
a) Arrayクラスの空の直接のインスタンスAを作る。
b) Cのインクルードモジュールリストのそれぞれの要素を,リスト内と逆順に,それぞれAの末尾に追
加する。
c) CがClassクラスのインスタンスで,Cが直接のスーパークラスをもつ場合,Cの直接のスーパーク
ラスを新たにCとし,手順b)から繰り返す。
d) そうではない場合,Aを返す。
15.2.2.4.31
Module#initialize
118
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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) レシーバが特異クラスと関連付けられている場合,Eoをその特異クラスとして次の処理を行う。
1) 特異クラスEnを作る。Enの直接のスーパークラスは,Eoの直接のスーパークラスとする。
2) Eoのそれぞれの定数束縛Bv1について,同じ名前及び値をもつ変数束縛をEnの定数束縛の集合内に
作る。
3) Eoのそれぞれのクラス変数束縛Bv2について,同じ名前及び値をもつ変数束縛をEnのクラス変数束
縛の集合内に作る。
4) Eoのインスタンスメソッドのそれぞれの束縛Bmについて,同じ名前及び値をもつメソッド束縛を
Enのインスタンスメソッド束縛の集合内に作る。
5) レシーバとEnとを関連付ける。
c) レシーバがClassクラスのインスタンスの場合,次の手順を行う。
1) originalが直接のスーパークラスをもつ場合,originalの直接のスーパークラスをレシーバの直接の
スーパークラスとする。
2) そうではない場合,このメソッドの動作は未規定とする。
d) originalのインクルードモジュールリストのそれぞれの要素を,リスト内と同順に,レシーバのインク
ルードモジュールリストの末尾にそれぞれ追加する。
e) originalのそれぞれの定数束縛Bv3について,同じ名前及び値をもつ変数束縛をレシーバの定数束縛の
集合内に作る。
f) originalのそれぞれのクラス変数束縛Bv4について,同じ名前及び値をもつ変数束縛をレシーバのクラ
ス変数束縛の集合内に作る。
g) originalのインスタンスメソッドのそれぞれの束縛Bm2について,同じ名前及び値をもつメソッド束縛
をレシーバのインスタンスメソッド束縛の集合内に作る。
h) 処理系定義の値を返す。
15.2.2.4.33
Module#instance̲methods
instance̲methods(include̲super=true)
可視性:public
動作:Cをレシーバとする。
a) Arrayクラスの空の直接のインスタンスAを作る。
119
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) IをCのインスタンスメソッド束縛の集合とする。Iのそれぞれの束縛Bに対し,NをBの名前,Vを
Bの値として,次の手順を行う。
1) Vがundefであるか,Vの可視性がprivateの場合,次の二つの手順は行わない。
2) 内容がNである新しく作ったStringクラスの直接のインスタンス又は名前がNであるSymbol
クラスの直接のインスタンスのいずれかを,Sとする。Sの値としてどちらを選ぶかは処理系定義と
する。
3) SをAの末尾に追加する。ただし,SがSymbolクラスのインスタンスでありAが同じ名前のSymbol
クラスのインスタンスを要素にもつ場合,又はSがStringクラスのインスタンスでありAが同じ
内容のStringクラスのインスタンスを要素にもつ場合は追加しない。
c) include̲superが真の場合,次の手順を行う。
1) CのインクルードモジュールリストのそれぞれのモジュールMに対し,手順b)を行う。ここで,手
順b)のCはMとする。
2) Cが直接のスーパークラスをもたない場合,Aを返す。
3) Cの直接のスーパークラスを新たにCとする。
4) 手順b)から繰り返す。
d) Aを返す。
15.2.2.4.34
Module#method̲defined?
method̲defined?(symbol)
可視性:public
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) 名前がNであるインスタンスメソッド束縛を,Cを起点として,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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.2.4.38
Module#public
public(*symbol̲list)
可視性:private
動作:Cをレシーバとする。
a) NVをpublicとする。
b) symbol̲listの長さが0の場合,現在の可視性をNVに設定し,Cを返す。
c) そうではない場合,symbol̲listのそれぞれの要素Sに対し,次の手順を行う。
1) Sによって指定される名前をNとする。
2) 名前がNであるメソッド束縛を,Cを起点として,13.3.4で規定されているようにして探す。
3) 束縛が見つかり,その値がundefでない場合,Vをその束縛の値とする。
4) そうではない場合,Sを名前属性にもつNameErrorクラスの直接のインスタンスを例外として発
生させる。
5) 束縛がC内に見つかった場合は,Vの可視性をNVに変更する。
6) そうではない場合,次のメソッド定義を評価することで,Cにインスタンスメソッドを定義する。
次のメソッド定義内の “N” はNであるとする。“args” という名前は説明のためだけのものであり,
仮引数名には任意のものを使用してよい。
def N(*args)
super
end
上記のようにして作られるメソッドの属性は次のように初期化する。
i)
クラスモジュールリストは,
クラスモジュールリスト
の一番上の要素とする。
ii) 定義名は,Vの定義名と同じとする。
iii) 可視性は,NVとする。
d) Cを返す。
15.2.2.4.39
Module#remove̲class̲variable
remove̲class̲variable(symbol)
可視性:処理系定義
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《クラス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接
のインスタンスを例外として発生させる。
c) 名前がNである束縛がCのクラス変数束縛の集合内に存在する場合,Vをその束縛の値とする。
1) その束縛をCのクラス変数束縛の集合から取り除く。
2) Vを返す。
d) そうではない場合,symbolを名前属性にもつNameErrorクラスの直接のインスタンスを例外として
発生させる。
15.2.2.4.40
Module#remove̲const
remove̲const(symbol)
可視性:private
121
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:Cをレシーバとする。
a) symbolによって指定される名前をNとする。
b) Nが《定数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラスの直接のイン
スタンスを例外として発生させる。
c) 名前がNである束縛がCの定数束縛の集合内に存在する場合,Vをその束縛の値とする。
1) その束縛をCの定数束縛の集合から取り除く。
2) Vを返す。
d) そうではない場合,symbolを名前属性にもつNameErrorクラスの直接のインスタンスを例外として
発生させる。
15.2.2.4.41
Module#remove̲method
remove̲method(*symbol̲list)
可視性:private
動作:Cをレシーバとする。
a) symbol̲listのそれぞれの要素Sに対し,リスト内と同順で,次の手順を行う。
1) Sによって指定される名前をNとする。
2) 名前がNである束縛がCのインスタンスメソッド束縛の集合内に存在し,かつ,その束縛の値が
undefでない場合,その束縛を取り除く。
3) そうではない場合,Sを名前属性にもつNameErrorクラスの直接のインスタンスを例外として発
生させる。この場合,symbol̲listの残りの要素は処理しない。
b) Cを返す。
15.2.2.4.42
Module#undef̲method
undef̲method(*symbol̲list)
可視性:private
動作:Cをレシーバとする。
a) symbol̲listのそれぞれの要素Sに対し,リスト内と同順で,次の手順を行う。
1) Sによって指定される名前をNとする。
2) 13.3.7の手順a) 3)及び手順a) 4)を行う。ここで,13.3.7のC及びNはそれぞれ,上記のC及びN
とする。
b) Cを返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
は,これらのメソッドの定義が削除されている。
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) インスタンス変数の束縛をもたないレシーバの直接のインスタンスを作り,Oとする。
c) initializeメソッドをOに対しargsの全ての要素を実引数とし,blockを《ブロック》として呼び出
す。
d) Oを返す。
15.2.3.3.4 Class#superclass
123
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
superclass
可視性:public
動作:Cをレシーバとする。
a) Cが特異クラスの場合,処理系定義の値を返す。
b) Cが直接のスーパークラスをもたない場合,nilを返す。
c) 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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作: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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスNの値”という表現は,Nが表現する数値のことを表す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:
a) レシーバに対し,値が0であるIntegerクラスのインスタンスを実引数としてcoerceメソッドを
呼び出す。Vを呼出し結果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “-” メソッドを呼び出す。
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のクラスが同一の場合,X及びYをそれぞれother及びレシーバとする。
b) そうではない場合,X及びYをそれぞれ,other及びレシーバを次のようにしてFloatクラスのイン
スタンスに変換したものとする。
1) Oをother又はレシーバとする。
2) OがFloatクラスのインスタンスの場合,FをOとする。
3) そうではない場合:
i)
Oに対し,名前が “to̲f” であるSymbolクラスの直接のインスタンスを実引数として
respond̲to?メソッドを呼び出した結果が偽の場合,TypeErrorクラスの直接のインスタンス
を例外として発生させる。
ii) Oに対しto̲fメソッドを実引数なしで呼び出し,Fをその結果の値とする。
iii) FがFloatクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外
として発生させる。
4) Fの値がNaNの場合,このメソッドの動作は未規定とする。
5) Oの変換結果はFである。
c) 要素を二つ含み,最初の要素がX,最後の要素がYであるArrayクラスの直接のインスタンスを作る。
d) 作ったArrayクラスのインスタンスを返す。
15.2.8 Integer
15.2.8.1 概要
Integerクラスのインスタンスは整数を表す。その整数の範囲は無制限とする。ただし,実際にどのよ
127
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
うな値が計算可能であるかは,リソースの制限次第であり,処理系定義とする。また,実際にリソースの
制限を超えた場合の動作も処理系定義とする。
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メソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “<=>” メソッドを呼び出す。
ii) 呼出し結果の値がIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定と
する。
iii) 呼出し結果の値がIntegerクラスのインスタンスである場合,呼出し結果の値を返す。
2) そうではない場合,nilを返す。
15.2.8.3.2 Integer#==
==(other)
可視性:public
動作:
128
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスの場合,Rを浮動小数点数としてのレシーバの値とする。
Rとotherの値との和を値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “+” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.8.3.4 Integer#−
−(other)
可視性:public
動作:
a) otherがIntegerクラスのインスタンスの場合,レシーバの値からotherの値を引いたものを値にも
つIntegerクラスのインスタンスを返す。
b) otherがFloatクラスのインスタンスの場合,Rを浮動小数点数としてのレシーバの値とする。Rか
らotherの値を引いたものを値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “-” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.8.3.5 Integer#*
*(other)
可視性:public
動作:
129
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) otherがIntegerクラスのインスタンスの場合,レシーバの値とotherの値との積を値にもつInteger
クラスのインスタンスを返す。
b) otherがFloatクラスのインスタンスの場合,Rを浮動小数点数としてのレシーバの値とする。
Rとotherの値との積を値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “*” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.8.3.6 Integer#/
/(other)
可視性:public
動作:
a) otherがIntegerクラスのインスタンスの場合,次の手順を行う。
1) otherの値が0の場合,ZeroDivisionErrorクラスの直接のインスタンスを例外として発生させ
る。
2) そうではない場合,レシーバの値をotherの値で除したものをnとし,n以下の最大の整数を値にも
つIntegerクラスのインスタンスを返す。
注記 レシーバが負の値をもつ場合でも,この動作は同じである。例えば,-5/2は-3を返す。
b) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “/” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.8.3.7 Integer#%
%(other)
可視性:public
動作:
a) otherがIntegerクラスのインスタンスの場合,次の手順を行う。
1) otherの値が0の場合,ZeroDivisionErrorクラスの直接のインスタンスを例外として発生させ
る。
2) そうではない場合,x及びyをそれぞれレシーバの値及びotherの値とする。
i)
xをyで除した値以下の最大の整数をtとする。
ii) x−t×yをmとする。
iii) 値がmであるIntegerクラスのインスタンスを返す。
130
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “%” メソッドを呼び出す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) otherがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) otherがIntegerクラスのインスタンスである場合,x及びyをそれぞれレシーバの値及びotherの値
とする。
c) x×2y以下の最大の整数を値にもつIntegerクラスのインスタンスを返す。
15.2.8.3.13
Integer#>>
>>(other)
可視性:public
動作:
a) otherがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) otherがIntegerクラスのインスタンスである場合,x及びyをそれぞれレシーバの値及び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) iをレシーバの値とする。
c) iがnumの値より小さい場合,レシーバを返す。
d) 値がiであるIntegerクラスのインスタンスを実引数としてblockを呼び出す。
e) iを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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.8.3.18
Integer#hash
hash
可視性:public
動作:次の条件を満たす処理系定義のIntegerクラスのインスタンスを返す。
a) I1及びI2をIntegerクラスのインスタンスとする。
b) hashメソッドをI1及びI2に対し呼び出した結果の値をそれぞれ,H1及びH2とする。
c) I1の値とI2の値とが等しい場合,H1の値とH2の値とは等しくなければならない。
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) iを0とする。
c) iがレシーバの値以上の場合,レシーバを返す。
d) 値がiであるIntegerクラスのインスタンスを実引数としてblockを呼び出す。
e) iを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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:次の条件を満たす内容をもつStringクラスの直接のインスタンスを返す。
− レシーバの値が負の場合,最初の文字は,文字 “-” とする。
− 残りの文字の並びRは,レシーバの値の絶対値Mを10進数で表現する。Mが0の場合,Rは “0” 一
文字とする。そうではない場合,Rの最初の文字は “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) iをレシーバの値とする。
c) iがnumの値より大きい場合,レシーバを返す。
d) 値がiであるIntegerクラスのインスタンスを実引数としてblockを呼び出す。
e) iを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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.9.3.1 Float#<=>
<=>(other)
可視性:public
動作:
a) otherがIntegerクラスのインスタンス又はFloatクラスのインスタンスの場合,次の手順を行う。
1) aをレシーバの値とする。otherがFloatクラスのインスタンスの場合,bをotherの値とする。そ
うではない場合,bを浮動小数点数としてのotherの値とする。
2) 規格適合処理系がIEC 60559に適合していて,a又はbがNaNの場合,処理系定義の値を返す。
3) a>bの場合,値が1のIntegerクラスのインスタンスを返す。
4) a=bの場合,値が0であるIntegerクラスのインスタンスを返す。
5) a<bの場合,値が−1であるIntegerクラスのインスタンスを返す。
b) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “<=>” メソッドを呼び出す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) otherがIntegerクラスのインスタンスの場合,Rを浮動小数点数としてのotherの値とする。
Rとレシーバの値との和を値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスの1インスタンスの場合,F及びSをそれぞれVの最初及び最後
の要素とする。
i)
Fに対し,Sを実引数として “+” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.9.3.4 Float#-
-(other)
可視性:public
動作:
a) otherがFloatクラスのインスタンスの場合,レシーバの値からotherの値を引いたものを値にもつ
Floatクラスの直接のインスタンスを返す。
b) otherがIntegerクラスのインスタンスの場合,Rを浮動小数点数としてのotherの値とする。レシ
ーバの値からRを引いたものを値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “-” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.9.3.5 Float#*
*(other)
可視性:public
動作:
a) otherがFloatクラスのインスタンスの場合,レシーバの値とotherの値との積を値にもつFloatク
ラスの直接のインスタンスを返す。
b) otherがIntegerクラスのインスタンスの場合,Rを浮動小数点数としてのotherの値とする。Rとレ
シーバの値との積を値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “*” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
136
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.9.3.6 Float#/
/(other)
可視性:public
動作:
a) otherがFloatクラスのインスタンスの場合,otherの値をレシーバの値で除したものを値にもつ
Floatクラスの直接のインスタンスを返す。
b) otherがIntegerクラスのインスタンスの場合,Rを浮動小数点数としてのotherの値とする。
レシーバの値をRで除したものを値にもつFloatクラスの直接のインスタンスを返す。
c) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “/” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.9.3.7 Float#%
%(other)
可視性:public
動作:次の手順では,2項演算子 “+”,“−”,及び “×” はそれぞれ,Floatクラスのインスタンスメソ
ッド “+”,“-”,及び “*” で使われている浮動小数点数演算である加算,減算,及び乗算を表す。演算子 “×”
は演算子 “+” 及び “−” より優先度が高いとする。
a) otherがIntegerクラスのインスタンス又はFloatクラスのインスタンスの場合,次の手順を行う。
xをレシーバの値とする。
1) otherがFloatクラスのインスタンスの場合,yをotherの値とする。otherがIntegerクラスのイ
ンスタンスの場合,yを浮動小数点数としてのotherの値とする。
i)
xをyで除した値以下の最大の整数をtとする。
ii) x−t×yをmとする。
iii) 値がmであるFloatクラスの直接のインスタンスを返す。
b) そうではない場合,otherに対しレシーバを実引数としてcoerceメソッドを呼び出す。Vを呼出し結
果の値とする。
1) Vが要素を二つ含むArrayクラスのインスタンスの場合,F及びSをそれぞれVの最初及び最後の
要素とする。
i)
Fに対し,Sを実引数として “%” メソッドを呼び出す。
ii) 呼出し結果の値を返す。
2) そうではない場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
15.2.9.3.8 Float#ceil
ceil
可視性:public
動作:レシーバの値以上の最小の整数を値とするIntegerクラスのインスタンスを返す。
137
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
スは,Classクラスのnewメソッドの手順b)によって作られたとき,空でなければならない。
“文字Cを表すObjectクラスのインスタンス”という表現は,次のいずれかを意味する。
− 値がCの文字符号であるようなIntegerクラスのインスタンス。
− 内容が一つの文字CであるようなStringクラスのインスタンス。
規格適合処理系は,上記のうちどちらか一つの表現を選び,上記の表現が出現する箇所は全て選んだ方
の表現を用いなければならない。
Stringクラスのインスタンスの文字は0から始まる添字をもつ。“Stringクラスのインスタンスのn
番目の文字”という表現は,そのインスタンスの含む文字のうち,添字がnであるものを指す。
15.2.10.2
直接のスーパークラス
Objectクラス
15.2.10.3
インクルードモジュール
Stringクラスは,次のモジュールをインクルードする。
− Comparable
15.2.10.4
大文字及び小文字
Stringクラスの幾つかのメソッドは,大文字及び小文字に対して処理を行う。大文字と小文字との対
応関係を表3に示す。
表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のそれぞれの内容を,S1及びS2とする。
c) S1及びS2の両方が空の場合,値が0であるIntegerクラスのインスタンスを返す。
d) そうではなく,S1が空の場合,値が−1であるIntegerクラスのインスタンスを返す。
e) そうではなく,S2が空の場合,値が1であるIntegerクラスのインスタンスを返す。
f) S1及びS2のそれぞれの最初の文字の文字符号を,a及びbとする。
1) a > bの場合,値が1であるIntegerクラスのインスタンスを返す。
2) a < bの場合,値が−1であるIntegerクラスのインスタンスを返す。
3) そうではない場合,S1及びS2をそれぞれ,S1及びS2からその最初の文字を除いたものに置き換え,
手順c)から繰り返す。
15.2.10.5.2
String#==
==(other)
可視性:public
動作:
139
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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のそれぞれの内容を,S及びOとする。
c) SとOとを連結したものを内容とする新しく作ったStringクラスの直接のインスタンスを返す。
15.2.10.5.5
String#*
*(num)
可視性:public
動作:
a) numがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) nをnumの値とする。
c) nが0未満の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
d) そうではない場合,Cをレシーバの内容とする。
e) 内容がCのn回の繰返しであるStringクラスの直接のインスタンスSを作る。
f) Sを返す。
15.2.10.5.6
String#[]
[](*args)
可視性:public
動作:
a) argsの長さが0であるか,2より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外
として発生させる。
b) Pをargsの最初の要素とする。nをレシーバの長さとする。
c) PがIntegerクラスのインスタンスの場合,bをPの値とする。
1) argsの長さが1の場合,次の手順を行う。
i)
bが0未満の場合,bをnだけ増加させる。bがまだ0未満の場合,nilを返す。
ii) b ≧ nの場合,nilを返す。
140
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
iii) レシーバのb番目の文字を表す新しく作ったObjectクラスのインスタンスを返す。
2) argsの長さが2の場合,次の手順を行う。
i)
argsの最後の要素がIntegerクラスのインスタンスの場合,lをそのインスタンスの値とする。
そうではない場合,このメソッドの動作は未規定とする。
ii) lが0未満であるか,bがnより大きい場合,nilを返す。
iii) bが0未満の場合,bをnだけ増加させる。bがまだ0未満の場合,nilを返す。
iv) b+lがnより大きい場合,lを新たにn−bとする。
v) lが0以下の場合,Stringクラスの空の直接のインスタンスを作って返す。
vi) そうではない場合,レシーバのb番目からl個の文字を,同じ順序で保持するStringクラスの
直接のインスタンスを作って返す。
d) PがRegexpクラスのインスタンスの場合,次の手順を行う。
1) argsの長さが1の場合,iを0とする。
2) argsの長さが2であり,argsの最後の要素がIntegerクラスのインスタンスの場合,iをそのイン
スタンスの値とする。そうではない場合,このメソッドの動作は未規定とする。
3) レシーバの内容に対して,Pのパターン属性とのマッチを試みる(15.2.15.4及び15.2.15.5参照)。M
をマッチ処理の結果とする。
4) Mがnilの場合,nilを返す。
5) iがMのマッチ結果属性の長さより大きい場合,nilを返す。
6) iが0未満の場合,iをMのマッチ結果属性の長さだけ増加させる。iがまだ0以下の場合,nilを返
す。
7) mをMのマッチ結果属性のi番目の要素とする。mの部分文字列を内容にもつStringクラスの直
接のインスタンスを作って返す。
e) PがStringクラスのインスタンスの場合,次の手順を行う。
1) argsの長さが2の場合,このメソッドの動作は未規定とする。
2) レシーバがPの内容を部分的に含む場合,Pと同じ内容をもつStringクラスの直接のインスタン
スを作って返す。
3) そうではない場合,nilを返す。
f)
そうではない場合,このメソッドの動作は未規定とする。
15.2.10.5.7
String#capitalize
capitalize
可視性:public
動作:次の場合を除き,レシーバと同じ内容をもつ新しく作ったStringクラスの直接のインスタンスを
返す。
− レシーバの最初の文字が小文字の場合,その文字に対応する大文字をこのメソッドが返すインスタン
スの内容の最初の文字とする。
− レシーバのi番目の文字(ただしi > 0とする。)が大文字の場合,その文字に対応する小文字をこ
のメソッドが返すインスタンスの内容のi番目の文字とする。
15.2.10.5.8
String#capitalize!
capitalize!
141
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:
a) レシーバに対しcapitalizeメソッドを呼び出した際に返るStringクラスのインスタンスの内容
を,sとする。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
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クラスのインスタ
ンスの内容を,sとする。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) レシーバに対しchopメソッドを呼び出した際に返るStringクラスのインスタンスの内容を,sと
する。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
15.2.10.5.13 String#downcase
downcase
可視性:public
動作:レシーバの内容の全てを含み,その中の全ての大文字を対応する小文字に置き換えたものを内容と
する新しく作ったStringクラスの直接のインスタンスを返す。
15.2.10.5.14 String#downcase!
downcase!
可視性:public
動作:
a) レシーバに対しdowncaseメソッドを呼び出した際に返るStringクラスのインスタンスの内容を,
sとする。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
15.2.10.5.15 String#each̲line
each̲line(&block)
可視性:public
動作:sをレシーバの内容とする。cをsの最初の文字とする。
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) s中の,c以降の最初の0x0aを探す。このような0x0aが存在する場合,次の手順を行う。
1) dをその0x0aとする。
2) cからdまでの文字列を内容とするStringクラスの直接のインスタンスSを作る。
3) blockを,Sを実引数として呼び出す。
4) dがsの最後の文字の場合,レシーバを返す。そうではない場合,cを新たにdの直後の文字とし手
順b)から繰り返す。
c) このような0x0aが存在しない場合,cからsの最後の文字までの文字列を内容とする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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性: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) Pをargsの最初の要素とする。PがRegexpクラスのインスタンスでない場合,又は,argsの長さが
2であってargsの最後の要素がStringクラスのインスタンスでない場合,このメソッドの動作は未
規定とする。
c) Sをレシーバの内容とし,lをSの長さとする。
d) Lを空のリストとし,nを0とする。
e) Sに対し,添字nの位置から,Pのパターン属性とのマッチを試みる(15.2.15.4及び15.2.15.5参照)。
Mをマッチ処理の結果とする。
f) Mがnilの場合,Lの末尾に,Sのn番目から最後までの文字の列を追加する。
g) そうではない場合,次の手順を行う。
1) argsの長さが1の場合,次の手順を行う。
i)
Mのマッチする部分文字列を内容とする新しく作ったStringクラスの直接のインスタンスを実
引数としてblockを呼び出す。
ii) Vを呼出し結果の値とする。VがStringクラスのインスタンスでない場合,このメソッドの動
作は未規定とする。
2) Mのマッチ前(15.2.16.1参照)をpreとする。nがpreの最後の文字の添字より大きくない場合,pre
のn番目から最後までの文字列をLの末尾に追加する。
3) argsの長さが1の場合,Vの内容をLの末尾に追加する。argsの長さが2の場合,argsの最後の要
素の内容をLの末尾に追加する。
4) Mのマッチ後(15.2.16.1参照)をpostとする。postの最初の文字のS内の添字を,iとする。
i)
iがnと等しい,すなわちPが空文字列にマッチする場合,次の手順を行う。
I) Sのi番目の文字だけを内容とする新しく作ったStringクラスの直接のインスタンスを,Lの
末尾に追加する。
II) nを1だけ増加させる。
ii) そうではない場合,nの値をiで置き換える。
5) n < lの場合,手順e)から繰り返す。
h) Lの全ての要素を連結したものを内容とするStringクラスの直接のインスタンスを作って返す。
15.2.10.5.19 String#gsub!
144
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
gsub!(*args, &block)
可視性:public
動作:
a) レシーバに対しgsubメソッドを呼び出した際に返るStringクラスのインスタンスの内容を,sと
する。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
15.2.10.5.20 String#hash
hash
可視性:public
動作:次の条件を満たすような処理系定義の値をもつIntegerクラスのインスタンスを返す。
a) 異なる二つのStringクラスのインスタンスを,S1及びS2とする。
b) S1及びS2に対しhashメソッドを呼び出した結果の値をそれぞれ,H1及びH2とする。
c) S1とS2とが同じ内容をもつ場合,H1の値とH2の値とが等しくなければならない。
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) R及びSをそれぞれレシーバ及びsubstringの内容とする。
c) offsetがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
d) nをoffsetの値とする。
e) nが0以上の場合,Oをnとする。
f)
そうではない場合,lをSの長さとして,Oをl+nとする。
g) Oが0より小さい場合,nilを返す。
h) O以上の添字をもつ一つ以上の位置にSがRの部分文字列として現れる場合,最初の位置の添字を値
とするIntegerクラスのインスタンスを返す。
i)
そうではない場合,nilを返す。
15.2.10.5.23 String#initialize
145
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスの場合,Rをregexpとする。
b) そうではなく,regexpがStringクラスのインスタンスの場合,newメソッドをRegexpクラスに対
しregexpを実引数として呼び出すことによって,Regexpクラスの直接のインスタンスを作る。Rを
このRegexpクラスのインスタンスとする。
c) それ以外の場合は,このメソッドの動作は未規定とする。
d) Rに対し,レシーバを実引数として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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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) R及びSをそれぞれレシーバ及びsubstringの内容とする。
c) offsetが与えられた場合,次の手順を行う。
1) offsetがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) nをoffsetの値とする。
3) nが0以上の場合,Oをnとする。
4) そうではない場合,lをSの長さとして,Oをl+nとする。
5) Oが0より小さい場合,nilを返す。
d) そうではない場合,Oを0とする。
e) O以下の添字をもつ一つ以上の位置にSがRの部分文字列として現れる場合,最後の位置の添字を値
とするIntegerクラスのインスタンスを返す。
f)
そうではない場合,nilを返す。
15.2.10.5.32 String#scan
scan(reg, &block)
可視性:public
動作:
a) regがRegexpクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) blockが与えられていない場合,Arrayクラスの空の直接のインスタンスAを作る。
c) Sをレシーバの内容とし,lをSの長さとする。
d) nを0とする。
e) Sに対し,添字nの位置から,regのパターン属性とのマッチを試みる(15.2.15.4及び15.2.15.5参照)。
Mをマッチ処理の結果とする。
f) Mがnilでない場合,次の手順を行う。
147
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) LをMのマッチ結果属性とする。
2) Lの長さが1の場合,Mのマッチする部分文字列を内容とするStringクラスの直接のインスタン
スVを作る。
3) Lの長さが1より大きい場合,次の手順を行う。
i)
Arrayクラスの空の直接のインスタンスVを作る。
ii) Lの先頭以外のそれぞれの要素eについてリスト内と同順に,eの部分文字列を内容とする新しく
作ったStringクラスの直接のインスタンスをVの末尾に追加する。
4) blockが与えられている場合,blockをVを実引数として呼び出す。そうではない場合,VをAの末
尾に追加する。
5) postをMのマッチ後とする。iをpostの最初の文字のS内での添字とする。
i)
iとnとが等しい,すなわちregが空文字列にマッチした場合,nを1だけ増加させる。
ii) そうではない場合,nを新たにiとする。
6) n < lの場合,手順e)から繰り返す。
g) blockが与えられている場合,レシーバを返す。そうではない場合,Aを返す。
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クラスの空の直接のインスタンスAを作る。
c) Sをレシーバの内容とし,lをSの長さとする。
d) sp及びbpをそれぞれ0とし,was-emptyを偽とする。
e) Sに対し,添字spの位置から,sepのパターン属性とのマッチを試みる(15.2.15.4及び15.2.15.5参照)。
Mをマッチ処理の結果とする。
f) Mがnilの場合,Aの末尾に,Sのsp番目から最後までの文字の列を内容とする新しく作ったString
クラスの直接のインスタンスを追加する。
g) そうではない場合,次の手順を行う。
1) Mのマッチする部分文字列が空の場合,次の手順を行う。
i)
was-emptyが真の場合,Sのbp番目の文字だけを内容とする新しく作ったStringクラスの直接
のインスタンスをAの末尾に追加する。
ii) そうではない場合,spを1だけ増加させる。sp < lの場合,was-emptyを真とし手順e)から繰り
148
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
返す。
2) そうではない場合,was-emptyを偽とする。preをMのマッチ前とする。bpがpreの最後の文字の添
字より大きくない場合,preのbp番目から最後までの文字列を内容とする新しく作ったStringク
ラスの直接のインスタンスをAの末尾に追加する。
3) LをMのマッチ結果属性とする。
4) Lの長さが1より大きい場合,Lの先頭を除くそれぞれの要素eについてリスト内と同順で,次の
手順を行う。
i)
cをeの部分文字列とする。
ii) cがnilでない場合,cを内容とする新しく作ったStringクラスの直接のインスタンスをAの末
尾に追加する。
5) postをMのマッチ後とし,sp及びbpをいずれもpostの最初の文字の添字とする。
6) sp > lの場合,手順e)から繰り返す。
h) Aの末尾に幾つかの空のStringクラスのインスタンスがある場合,それらのインスタンスをAから
削除する。
i)
Aを返す。
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参照)。Mをマッチ処理の結果とする。
3) Mがnilの場合,レシーバと同じ内容をもつStringクラスの直接のインスタンスを作って返す。
4) そうではない場合,次の手順を行う。
i)
argsの長さが1の場合,Mのマッチする部分文字列を内容とする新しく作ったStringクラスの
直接のインスタンスを実引数としてblockを呼び出す。Sを呼出し結果の値とする。SがString
クラスのインスタンスでない場合,このメソッドの動作は未規定とする。
ii) argsの長さが2の場合,Sをargsの最後の要素とする。SがStringクラスのインスタンスでな
い場合,このメソッドの動作は未規定とする。
iii) Mのマッチ前,Sの内容,及びMのマッチ後を連結したものを内容とするStringクラスの直接
のインスタンスを作って返す。
b) そうではない場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
15.2.10.5.37 String#sub!
sub!(*args, &block)
可視性:public
動作:
a) レシーバに対しsubメソッドを呼び出した際に返るStringクラスのインスタンスの内容を,sとす
149
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
る。
b) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
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クラスのインスタンスである場合,bを
baseの値とする。そうではない場合,このメソッドの動作は未規定とする。
b) レシーバが空の場合,値が0のIntegerクラスのインスタンスを返す。
c) iを0とする。レシーバのi番目の文字が《空白類》である間,iを1だけ増加させ続ける。
d) レシーバのi番目の文字が “+” 又は “-” の場合,iを1だけ増加させる。
e) レシーバのi番目の文字が “0” であり,次のいずれかの条件が成り立つ場合,iを2だけ増加させる。
添字がi+1であるレシーバ中の文字をcとする。
− bが2であり,cが “b” 又は “B” である。
− bが8であり,cが “o” 又は “O” である。
− bが10であり,cが “d” 又は “D” である。
− bが16であり,cが “x” 又は “X” である。
f)
レシーバのi番目から始まる,次の文字の並びを,sとする。
− bが2の場合,《2進数字》及び “̲”。
− bが8の場合,《8進数字》及び “̲”。
− bが10の場合,《10進数字》及び “̲”。
− bが16の場合,《16進数字》及び “̲”。
g) sの長さが0の場合,値が0のIntegerクラスのインスタンスを返す。
h) sが “̲” から始まるか,連続した “̲” を含む場合,このメソッドの動作は未規定とする。
i)
bを基数とし,“̲” を無視してsを数値化したものをnとする。
手順d)で “-” が現れていた場合は,値が−nのIntegerクラスのインスタンスを返す。
そうではない場合,値がnのIntegerクラスのインスタンスを返す。
150
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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) レシーバの内容とsとが等しい場合,nilを返す。そうではない場合,レシーバの内容をsに置き換え,
レシーバを返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
===(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に対し,末尾に追加,先頭に追加,及び削除の操作を次のように定義す
る。
末尾に追加:オブジェクトOをAの末尾に追加するとは,次のような動作とする。
− Oを,Aの最後の要素の後に追加する。
− あるオブジェクトをAの末尾に追加すると,Aの長さは1だけ増加する。
先頭に追加:オブジェクトOをAの先頭に追加するとは,次のような動作とする。
− Oを,Aの先頭の要素にする。Aの元の要素は,それぞれ1ずつ後ろに移動する。
− あるオブジェクトをAの先頭に追加すると,Aの長さは1だけ増加する。
削除:要素XをAから削除するとは,次のような動作とする。
a) XをAから取り除く。
b) XがAの最後の要素でない場合,AのXより後の全ての要素を,それぞれ1ずつ前に移動する。
− ある要素をAから削除すると,Aの長さは1だけ減少する。
15.2.12.2
直接のスーパークラス
Objectクラス
15.2.12.3
インクルードモジュール
Arrayクラスは,次のモジュールをインクルードする。
152
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− 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クラスのインスタンスの場合,Aをotherとする。そうではない場合,このメソッドの
動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスRを作る。
c) レシーバのそれぞれの要素を,添字順に,Rの末尾に追加する。次に,Aのそれぞれの要素を,添字
順に,Rの末尾に追加する。
d) Rを返す。
15.2.12.5.2
Array#*
*(num)
可視性:public
動作:
a) numがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) numの値が0より小さい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させ
る。
c) numの値が0の場合,Arrayクラスの空の直接のインスタンスを返す。
d) そうではない場合,Arrayクラスの直接のインスタンスAを作り,次の手順をnum回繰り返す。
− レシーバの全ての要素を,同じ順序でAの末尾に追加する。
e) Aを返す。
15.2.12.5.3
Array#<<
<<(obj)
可視性:public
動作:objをレシーバの末尾に追加し,レシーバを返す。
15.2.12.5.4
Array#[]
[](*args)
可視性:public
動作:
a) nをレシーバの長さとする。
b) argsの長さが0の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
c) argsの長さが1の場合,次の手順を行う。
153
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
1) 唯一の実引数がIntegerクラスのインスタンスの場合,kをその値とする。そうではない場合,こ
のメソッドの動作は未規定とする。
2) k < 0の場合,kをn増加させる。kがまだ0より小さい場合,nilを返す。
3) k ≧ nの場合,nilを返す。
4) そうではない場合,レシーバのk番目の要素を返す。
d) argsの長さが2の場合,次の手順を行う。
1) argsの要素がいずれもIntegerクラスのインスタンスの場合,bとlとをそれぞれargsの最初及び
最後の要素の値とする。そうではない場合,このメソッドの動作は未規定とする。
2) b < 0の場合,bをn増加させる。bがまだ0より小さい場合,nilを返す。
3) b > n又はl < 0の場合,nilを返す。
4) b = nの場合,Arrayクラスの空の直接のインスタンスを作って返す。
5) l > n−bの場合,lを新たにn−bとする。
6) Arrayクラスの空の直接のインスタンスAを作る。レシーバのb番目からl個の要素を,同じ順序
で,Aの末尾に追加する。Aを返す。
e) argsの長さが2より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生さ
せる。
15.2.12.5.5
Array#[]=
[]=(*args)
可視性:public
動作:
a) nをレシーバの長さとする。
b) argsの長さが2より小さい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生さ
せる。
c) argsの長さが2の場合,次の手順を行う。
1) argsの最初の要素がIntegerクラスのインスタンスの場合,kをその要素の値とし,Vをargsの最
後の要素とする。そうではない場合,このメソッドの動作は未規定とする。
2) k < 0の場合,kをn増加させる。kがまだ0より小さい場合,IndexErrorクラスの直接のイン
スタンスを例外として発生させる。
3) k < nの場合,レシーバのk番目の要素をVに置き換える。
4) そうではない場合,レシーバの長さをk+1に拡張する。レシーバの最後の要素はVとする。k > n
の場合,添字がn以上k−1以下の要素はnilとする。
5) Vを返す。
d) argsの長さが3の場合,このメソッドの動作は未規定とする。
e) argsの長さが3より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生さ
せる。
15.2.12.5.6
Array#clear
clear
可視性:public
動作:レシーバの全ての要素を削除し,レシーバを返す。
154
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスである場合,iをindexの値とする。
c) nをレシーバの長さとする。
d) iが0より小さい場合,iをn増加させる。bがまだ0より小さい場合,nilを返す。
e) iがn以上の場合,nilを返す。
f)
そうではない場合,レシーバのi番目の要素を削除し,削除した要素を返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスである場合,nをその実引数の値とする。そうでは
ない場合,このメソッドの動作は未規定とする。
2) nが0より小さい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
3) そうではない場合,n及びレシーバの長さのうちの小さい方を,Nとする。
4) レシーバの最初のN個の要素を同じ順序で保持するArrayクラスのインスタンスを作って返す。
c) argsの長さが1より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生さ
せる。
15.2.12.5.14 Array#index
index(object=nil)
可視性:public
動作:
a) objectが与えられた場合,次の手順を行う。
1) レシーバのそれぞれの要素Eについて,添字順に,次の手順を行う。
i)
Eに対してobjectを実引数として “==” メソッドを呼び出す。
ii) 呼出し結果の値が真の場合,Eの添字を値にもつ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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) sizeがIntegerクラスのインスタンスである場合,nをsizeの値とする。そうではない場合,このメ
ソッドの動作は未規定とする。
b) nが0未満の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
c) レシーバの全ての要素を削除する。
d) nが0の場合,処理系定義の値を返す。
e) nが0より大きい場合,次の手順を行う。
1) blockが与えられている場合,次の手順を行う。
i)
kを0とする。
ii) kを値とするIntegerクラスのインスタンスを唯一の実引数としてblockを呼び出す。呼出し結
果の値をレシーバの末尾に追加する。
iii) kを1増加させる。kがnに等しくなった場合,この処理を終了させる。そうではない場合,手順
e) 1) ii)から繰り返す。
2) そうではない場合,objをレシーバの末尾にn回追加する。
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クラスの空の直接のインスタンスSを作る。
c) レシーバのそれぞれの要素Xについて,添字順に,次の手順を行う。
1) sepがnilでなく,かつ,Xがレシーバの最初の要素でない場合,sepの内容をSの末尾に追加する。
2) XがStringクラスのインスタンスの場合,Xの内容をSの末尾に追加する。
3) XがArrayクラスのインスタンスの場合,次の手順を行う。
i)
Xがレシーバである,すなわち,レシーバが自分自身を含んでいる場合,処理系定義の文字列を
Sの末尾に追加する。
ii) そうではない場合,joinメソッドをXに対しsepを実引数として呼び出し,その結果である
Stringクラスのインスタンスの内容をSの末尾に追加する。
4) そうではない場合,このメソッドの動作は未規定とする。
d) Sを返す。
157
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.12.5.18 Array#last
last(*args)
可視性:public
動作:
a) argsの長さが0の場合,次の手順を行う。
1) レシーバが空の場合,nilを返す。
2) そうではない場合,レシーバの最後の要素を返す。
b) argsの長さが1の場合,次の手順を行う。
1) 唯一の実引数がIntegerクラスのインスタンスである場合,nをその実引数の値とする。そうでは
ない場合,このメソッドの動作は未規定とする。
2) nが0未満の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
3) そうではない場合,Nをn及びレシーバの長さのうち小さい方とする。
レシーバの末尾からN個の要素を同じ順序で保持する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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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) レシーバのそれぞれの要素Eについて,添字の逆順に,次の手順を行う。
i)
Eに対してobjectを実引数として “==” メソッドを呼び出す。
ii) 呼出し結果の値が真の場合,Eの添字を値にもつ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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.13.1
概要
Hashクラスのインスタンスは,ハッシュ,すなわち,キーと値との組の集合を表す。
キーと値との組を一つももたないHashクラスのインスタンスは空であるという。Hashクラスのイン
スタンスは,Classクラスのnewメソッドの手順b)によって作られたとき,空でなければならない。
Hashクラスのインスタンスは,あるキーに対して二つ以上のキーと値との組をもってはならない。言
い換えれば,Hashクラスの一つのインスタンスの中の個々のキーはそれぞれ異なる。
Hashクラスのインスタンスは次の属性をもつ。
省略時の値又はproc:この属性の値は,次のいずれかである。
− 省略時の値。これは,指定されたキーがHashクラスのインスタンス内に存在しなかった場合
に “[]” メソッドによって返される。
− 省略時のproc。これは,Procクラスのインスタンスであり,指定されたキーがHashクラス
のインスタンス内に存在しなかった場合に “[]” メソッドが返す値を生成するために使われ
る。
Hashクラスのインスタンスは,省略時の値と省略時のprocとを同時にもってはならない。
二つのキーK1及びK2について,“K1 ≡ K2” という表現は,二つのキーが同値である,すなわち次の全て
の条件が成り立つことを示す。
− eql?メソッドを,K1に対し,K2を唯一の実引数として呼び出すと,真が返される。
− K1及びK2に対しhashメソッドを呼び出した結果の値をそれぞれ,H1及びH2とする。
H1とH2とが,同じ整数を表すIntegerクラスのインスタンスである。
規格適合処理系は,ある整数の範囲を定め,H1又はH2の値がこの範囲外であるときに,H1又はH2
を,この範囲内の値を表すIntegerクラスのインスタンスに変換してよい。変換後のインスタンス
をそれぞれ,I1及びI2とする。
I1とI2とが同じ整数を表す。
H1又はH2がIntegerクラスのインスタンスでない場合は,K1 ≡ K2であるかどうかは処理系定義
とする。
注記 K1 ≡ K2とK2 ≡ K1とは,等価ではない。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
− レシーバのそれぞれのキーと値との組Pについて,次の条件を満たすような対応するキーと値との
組Qをotherがもつ。
− (Pのキー)≡(Qのキー)である。
− “==” メソッドを,Pの値に対し,Qの値を実引数として呼び出したとき,結果が真になる。
c) そうではない場合,falseを返す。
15.2.13.4.2
Hash#[]
[](key)
可視性:public
動作:
a) key ≡(Pのキー)が成り立つようなキーと値との組Pをレシーバがもつ場合,Pの値を返す。
b) そうではない場合,レシーバに対しdefaultメソッドを,keyを実引数として呼び出し,呼出し結果
の値を返す。
15.2.13.4.3
Hash#[]=
[]=(key, value)
可視性:public
動作:
a) key ≡(Pのキー)が成り立つようなキーと値との組Pをレシーバがもつ場合,Pの値をvalueに置き
換える。
b) そうではない場合,次の手順を行う。
1) keyがStringクラスの直接のインスタンスの場合,keyの複製を作る。すなわち,内容がkeyの内
容と同じStringクラスの直接のインスタンスKを作る。
2) keyがStringクラスのインスタンスでない場合,Kをkeyとする。
3) keyがStringクラスのサブクラスのインスタンスの場合,複製を作るかどうかは処理系定義とす
る。
4) Kと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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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 ≡(Pのキー)が成り立つようなキーと値との組Pをレシーバがもつ場合,Pをレシーバから取り
除き,Pの値を返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性: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 ≡(Pのキー)が成り立つようなキーと値との組Pをレシーバがもつ場合,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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) blockが与えられており,argsの長さが0でない場合,ArgumentErrorクラスの直接のインスタンス
を例外として発生させる。
b) blockが与えられており,argsの長さが0の場合,blockを表すProcクラスの直接のインスタンスを
作り,それをレシーバの省略時のprocとする。
c) blockが与えられていない場合,次の手順を行う。
1) argsの長さが0の場合,Dをnilとする。
2) argsの長さが1の場合,Dをその唯一の要素とする。
3) argsの長さが1より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生
させる。
4) レシーバの省略時の値をDとする。
d) 処理系定義の値を返す。
15.2.13.4.17 Hash#initialize̲copy
initialize̲copy(original)
可視性:private
動作:
a) originalがHashクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) レシーバから全てのキーと値との組を取り除く。
c) originalのそれぞれのキーと値との組Pについて,処理系定義の順序で,レシーバに対してPのキー
及びPの値を実引数として “[]=” メソッド(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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性: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クラス
の直接のインスタンスHを作る。
c) otherのそれぞれのキーと値との組Pについて,処理系定義の順序で,次の手順を行う。
1) blockが与えられている場合,次の手順を行う。
i)
Hが,(Pのキー)≡(Qのキー)であるようなキーと値との組Qをもつ場合,Pのキー,Qの値,
及びPの値を実引数としてblockを呼び出す。呼出し結果の値をVとする。Hに対してPのキー
及びVを実引数として “[]=” メソッド(15.2.13.4.3参照)を呼び出すことによって,Hがもつキ
ーと値との組を追加又は更新する。
ii) そうではない場合,Hに対してPのキー及びPの値を実引数として “[]=” メソッド(15.2.13.4.3
参照)を呼び出すことによって,Hがもつキーと値との組を追加又は更新する。
2) blockが与えられていない場合,Hに対してPのキー及びPの値を実引数として “[]=” メソッド
(15.2.13.4.3参照)を呼び出すことによって,Hがもつキーと値との組を追加又は更新する。
d) Hを返す。
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を選び,それをレシーバから取り除く。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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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クラスのインスタンスである。
− Sをotherの始点とする。“==” メソッドをレシーバの始点に対し,Sを実引数として呼び出した場
合に真が返る。
− Eをotherの終点とする。“==” メソッドをレシーバの終点に対し,Eを実引数として呼び出した場
合に真が返る。
− レシーバの排他的フラグ属性とotherの排他的フラグ属性とが同じ真理値である。
166
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) そうではない場合,falseを返す。
15.2.14.4.2
Range#===
===(obj)
可視性:public
動作:
a) レシーバの始点又は終点がNumericクラスのインスタンスでない場合,このメソッドの動作は未規
定とする。
b) “<=>” メソッドを,レシーバの始点に対し,objを実引数として呼び出す。Sを呼出し結果の値とする。
1) SがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) Sの値が0より大きい場合,falseを返す。
c) “<=>” メソッドをobjに対しレシーバの終点を実引数として呼び出す。Eを呼出し結果の値とする。
− EがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
− レシーバの排他的フラグ属性が真で,Eが0未満の場合,trueを返す。
− レシーバの排他的フラグ属性が偽で,Eの値が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) Vをレシーバの始点とする。
d) “<=>” メソッドを,Vに対し,レシーバの終点を実引数として呼び出す。Cを呼出し結果の値とする。
1) CがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) Cの値が0より大きい場合,レシーバを返す。
3) Cの値が0の場合,次の手順を行う。
i)
レシーバの排他的フラグ属性が真の場合,レシーバを返す。
ii) レシーバの排他的フラグ属性が偽の場合,blockをVを実引数として呼び出し,レシーバを返す。
e) blockを,Vを実引数として呼び出す。
f)
succメソッドを,Vに対して実引数なしで呼び出し,Vを新たに呼出し結果の値とする。
g) 手順d)から処理を続ける。
15.2.14.4.5
Range#end
end
167
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性: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が真の場合,fを真とする。そうではない場合,fを偽とする。
c) レシーバの始点,終点,及び排他的フラグ属性をそれぞれleft,right,及びfとする。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
大小文字同一視フラグ:マッチを行う際に大文字と小文字とを区別するか否かを表す真理値である。こ
の属性のデフォルトの値は偽とする。
複数行フラグ:“.” 形式のパターンが《行終端子》にマッチするか否かを表す真理値である(15.2.15.4参
照)。この属性のデフォルトの値は偽とする。
15.2.15.2
直接のスーパークラス
Objectクラス
15.2.15.3
定数
Regexpクラスには,次の定数が定義されている。
IGNORECASE:値が2nのIntegerクラスのインスタンスとする。ここで,nは整数で,その値は処理
系定義とする。この定数の値は次の “MULTILINE” の値と同じであってはならない。
MULTILINE:値が2mのIntegerクラスのインスタンスとする。mは整数で,その値は処理系定義と
する。
これらの定数は,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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
《パターン文字》 ::
《ソース文字》 − 《正規表現メタ文字》
《正規表現メタ文字》 ::
“|”|“.”|“*”|“+”|“^”|“?”|“(”|“)”|“#”|“\”|“$”
|《将来的予約メタ文字》
《将来的予約メタ文字》 ::
“[”|“]”|“{”|“}”
《グループ化》 ::
“(” 《パターン》 “)”
《アトムエスケープ列》 ::
《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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
先順位が最も高い部分文字列が選択される。《パターン》のそれぞれの要素は,対象文字列の部分文字列に
次のようにマッチする。
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) 《項》が《アンカー》の場合は,対象文字列S中の特定の位置にある空文字列に,次のようにマッチす
る。
i)
《アンカー》が “\A” の場合は,Sの先頭の空文字列にマッチする。
ii) 《アンカー》が “^” の場合は,Sの先頭又は《行終端子》の直後の空文字列にマッチする。ただし,
《行終端子》の直後の空文字列にマッチする場合,その《行終端子》の後に最低一文字が存在しなけ
ればならない。
iii) 《アンカー》が “\z” の場合は,Sの終端の空文字列にマッチする。
iv) 《アンカー》が “$” の場合は,Sの終端又は《行終端子》の直前の空文字列にマッチする。
d) 《アトム》は次の文字列にマッチする。
1) 《アトム》が《パターン文字》の場合は,《パターン文字》が表す文字Cにマッチする。大小文字同一視
フラグ属性が真のRegexpクラスのインスタンスのパターン属性中に《アトム》が存在する場合は,
Cが小文字の場合はCに対応する大文字にも,Cが大文字の場合はCに対応する小文字にも《アト
ム》はマッチする。
171
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
2) 《アトム》が《グループ化》の場合は,《グループ化》がマッチする文字列にマッチする。
3) 《アトム》が “.” の場合は,《行終端子》以外の文字にマッチする。《アトム》が複数行フラグ属性が真
のRegexpクラスのインスタンスのパターン属性中に存在する場合は,《アトム》は《行終端子》にも
マッチする。
4) 《アトム》が《アトムエスケープ列》の場合は,《アトムエスケープ列》がマッチする文字列にマッチす
る。
e) 《グループ化》は,その《パターン》がマッチする文字列にマッチする。
f)
《アトムエスケープ列》は次の文字列にマッチする。
1) 《アトムエスケープ列》が《10進エスケープ列》の場合は,《10進エスケープ列》がマッチする文字列に
マッチする。
2) 《アトムエスケープ列》が《正規表現文字エスケープ列》の場合は,《正規表現文字エスケープ列》が表
す文字を内容とする長さ1の文字列にマッチする。
g) 《10進エスケープ列》は次の文字列にマッチする。
1) 《0以外の10進数字》が表す整数をiとする。
2) Gを《パターン》中に存在する1から数えてi番目の《グループ化》とする。《グループ化》は,その “(”
が出現する順に《パターン》の左側から数える。
3) 《パターン》の中で《10進エスケープ列》がGよりも前に存在する場合は,《10進エスケープ列》はど
の文字列にもマッチしない。
4) Gがマッチする文字列がある場合は,《10進エスケープ列》はGがマッチする文字列にマッチする。
5) 上記のいずれでもない場合は,《10進エスケープ列》はどの文字列にもマッチしない。
h) 《正規表現文字エスケープ列》は次の文字を表す。
− 《正規表現エスケープ列》は8.7.6.3.3の表1で示す文字を表す。
− 《正規表現非エスケープ列》は《正規表現メタ文字》が表す文字を表す。
− 《16進エスケープ列》は8.7.6.3.3で規定されるとおりの文字を表す。
− 《正規表現8進エスケープ列》は《8進エスケープ列》と同様に解釈する(8.7.6.3.3参照)。
− 《正規表現制御エスケープ列》は,文字符号が《正規表現制御エスケープ文字》が表す文字の文字符号
と0x9fとのビット単位の論理積とする文字を表す。ただし,《正規表現制御エスケープ文字》が “?”
の場合は,《正規表現制御エスケープ列》は文字符号が0x7fの文字を表す。
15.2.15.5
マッチ処理
文字列Sに対し,《パターン》Pのマッチが成功するとは,PがマッチするSの部分文字列(S自身も含む。)
が存在することである。
a) 添字が指定された場合は,その添字の位置から開始し,Sの終端で終了するようなSの部分文字列に
対して,Pのマッチが試みられる。ただし,Pが部分文字列にマッチする場合は,マッチ処理の結果
のMatchDataクラスのインスタンスの文字列属性の値はマッチが試みられるSの部分文字列ではな
く,Sとする。
b) マッチ処理は,マッチが成功する場合はMatchDataクラスのインスタンス(15.2.16参照)を,失敗
する場合はnilを返す。
c) MatchDataクラスのインスタンスは次のようにして生成される。
1) PがマッチするSの部分文字列をBとする。
2) MatchDataクラスの直接のインスタンスを生成する。それをMとする。
172
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
3) Sを,Mの文字列属性(15.2.16.1参照)に設定する。
4) 新たな空リストLを生成する。
5) 部分文字列Bと,Bの先頭の文字のS中での添字との組を,Oとする。OをLの末尾に追加する。
6) P内のそれぞれの《グループ化》Gについて,その “(” がPに出現する順に,次の手順を行う。
i)
Pのマッチ処理において,GがBの部分文字列にマッチする場合は,その部分文字列をBGとする。
部分文字列BGと,BGの先頭の文字のS中での添字との組を,Oとする。OをLの末尾に追加す
る。
ii) そうではない場合は,その部分文字列及び部分文字列の添字がnilである組をLに追加する。
7) L をMのマッチ結果属性に設定する。
8) このMを,マッチ処理が返すMatchDataクラスのインスタンスとする。
d) マッチ処理は “~” という名前の局所変数束縛を,そのような名前の束縛がない場合は作成し,ある場
合はその束縛の値を更新する。この束縛はRegexp.last̲matchメソッドによって利用される
(15.2.15.6.3参照)。束縛の作成又は更新は,次のようにして行われる。
1) マッチ処理の結果をMとする。
2) “~” を《局所変数識別子》と仮定し,9.2の記述に従い局所変数の名前解決を行う。“~” という名前の
束縛が解決される場合は,その束縛の値をMに置き換える。
3) 名前が解決されない場合は,
局所変数束縛集合
に積まれた《ブロック》に対応しない局所変数束縛
の集合で,
局所変数束縛集合
中で最も上にあるものに,名前が “~” で値がMの局所変数束縛を
追加する。
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の内容をSとする。
c) その内容がSと同じである新しく作ったStringクラスの直接のインスタンスを返す。ただし,戻り
値のStringクラスのインスタンスでは,表4の左側の列の文字は全て右側の列の文字列に置き換え
られる。
173
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
表4−Regexpのエスケープされた文字
置き換えられる文字
エスケープシーケンス
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クラスのインスタンスである場合は,Mをそのインスタン
スとする。名前解決が失敗した場合は,nilを返す。
c) indexの長さが0の場合はMを返す。
d) indexの長さが2以上の場合は,ArgumentErrorクラスの直接のインスタンスを例外として発生させ
る。
e) indexの長さが1の場合は,その唯一の実引数をAとする。
f) AがIntegerクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
g) Aを実引数とし “[]” メソッド(15.2.16.3.1参照)をMに対して呼び出し,呼出し結果の値をRとす
る。
h) Rを返す。
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
==(other)
可視性:public
動作:
a) otherがRegexpクラスのインスタンスでない場合は,falseを返す。
b) レシーバとotherとの対応する属性の値が同じである場合は,trueを返す。
c) それ以外の場合は,falseを返す。
15.2.15.7.2
Regexp#===
===(string)
可視性:public
動作:
a) stringがStringクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) stringの内容をSとする。
c) Sに対してレシーバのパターン属性のマッチを試みる(15.2.15.4及び15.2.15.5参照)。マッチ処理の結
果をMとする。
d) MがMatchDataクラスのインスタンスの場合は,trueを返す。
e) そうではない場合は,falseを返す。
15.2.15.7.3
Regexp#=~
=~(string)
可視性:public
動作:
a) stringがStringクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) stringの内容をSとする。
c) Sに対してレシーバのパターン属性のマッチを試みる(15.2.15.4及び15.2.15.5参照)。マッチ処理の結
果をMとする。
d) Mがnilの場合は,nilを返す。
e) MがMatchDataクラスのインスタンスの場合は,Mのマッチ結果属性の最初の要素をPとする。P
の部分文字列の添字をiとする。
f)
その値がiの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のパターン属性をSとする。sourceがString
クラスのインスタンスの場合は,sourceの内容をSとする。それら以外の場合は,このメソッドの動
作は未規定とする。
175
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) Sが《パターン》(15.2.15.4参照)という形式でない場合は,RegexpErrorクラスの直接のインスタ
ンスを例外として発生させる。
c) レシーバのパターン属性をSに設定する。
d) flagがIntegerクラスのインスタンスの場合は,そのインスタンスの値をnとする。
1) Regexpクラスの定数IGNORECASEの値とnとのビット単位の論理積が0でない場合は,レシーバ
の大小文字同一視フラグ属性を真に設定する。
2) Regexpクラスの定数MULTILINEの値とnとのビット単位の論理積が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) originalの複数行フラグ属性をレシーバの複数行フラグ属性に設定する。
e) 処理系定義の値を返す。
15.2.15.7.7
Regexp#match
match(string)
可視性:public
動作:
a) stringがStringクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) stringの内容をSとする。
c) Sに対してレシーバのパターン属性のマッチを試みる(15.2.15.4及び15.2.15.5参照)。マッチ処理の結
果をMとする。
d) Mを返す。
15.2.15.7.8
Regexp#source
source
可視性:public
動作:その内容がレシーバのパターン属性であるStringクラスの直接のインスタンスを返す。
15.2.16
MatchData
15.2.16.1
概要
MatchDataクラスのインスタンスは,Stringクラスのインスタンスに対するRegexpクラスのイン
スタンスのマッチが成功した場合の結果を表す。
MatchDataクラスのインスタンスは文字列及びマッチ結果という属性をもつ。これらの属性は15.2.15.5
176
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
の記述に従い初期化される。文字列属性は,マッチ処理の対象となった文字列Sとする。マッチ結果属性
は,Regexpクラスのインスタンスの《パターン》又はその《パターン》内の《グループ化》がマッチした部分
文字列Bと,S中でのBの先頭の文字の添字Iとの組を要素としてもつリストとする。Bをその要素の部
分文字列,Iをその要素の部分文字列の添字という。マッチ結果属性のそれぞれの要素は,0から始まる整
数によって添字付けされる。
あるMatchDataクラスのインスタンスMに対して,そのマッチする部分文字列,マッチ前及びマッチ
後という三つの値を次のように定義する。
Mの文字列属性の値をSとする。Mのマッチ結果属性の第1要素をFとする。Fの部分文字列をBとし,
Fの部分文字列の添字をOとする。Bの長さとOの和をiとする。
マッチする部分文字列:Bとする。
マッチ前:Sの先頭からO番目の文字の直前までを含むSの部分文字列とする。
マッチ後:Sのi番目の文字から最後の文字までを含むSの部分文字列とする。
15.2.16.2
直接のスーパークラス
Objectクラス
15.2.16.3
インスタンスメソッド
15.2.16.3.1
MatchData#[]
[](*args)
可視性:public
動作:レシーバに対してto̲aメソッド(15.2.16.3.12参照)を呼び出し,その戻り値であるArrayクラ
スのインスタンスに対して,このメソッドに渡されたのと同じ実引数で “[]” メソッド(15.2.12.5.4参照)
を呼び出し,“[]” メソッドの戻り値を返す。
15.2.16.3.2
MatchData#begin
begin(index)
可視性:public
動作:
a) indexがIntegerクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) レシーバのマッチ結果属性をLとし,indexの値をiとする。
c) iが0未満である場合,又はLの要素の数以上の場合は,IndexErrorクラスの直接のインスタンス
を例外として発生させる。
d) そうではない場合は,Lのi番目の要素の第2要素を返す。
15.2.16.3.3
MatchData#captures
captures
可視性:public
動作:
a) レシーバのマッチ結果属性をLとする。
b) Arrayクラスの空の直接のインスタンスAを生成する。
c) Lの先頭から順に,その最初の要素を除くそれぞれの要素eについて,eの部分文字列をその内容とす
るStringクラスの直接のインスタンスをAの末尾に追加する。
d) Aを返す。
177
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.16.3.4
MatchData#end
end(index)
可視性:public
動作:
a) indexがIntegerクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) レシーバのマッチ結果属性をLとし,indexの値をiとする。
c) iが0未満,又はLの要素の数以上の場合は,IndexErrorクラスの直接のインスタンスを例外とし
て発生させる。
d) Lのi番目の要素の部分文字列をFとし,その要素の部分文字列の添字をSとする。
e) Fがnilの場合は,nilを返す。
f)
そうではない場合は,Fの長さをfとする。fとSとの和をその値とするIntegerクラスのインスタ
ンスを返す。
15.2.16.3.5
MatchData#initialize̲copy
initialize̲copy(original)
可視性:private
動作:
a) originalがレシーバのクラスのインスタンスでない場合は,TypeErrorクラスの直接のインスタンス
を例外として発生させる。
b) originalの文字列属性を,レシーバの文字列属性に設定する。
c) originalのマッチ結果属性を,レシーバのマッチ結果属性に設定する。
d) 処理系定義の値を返す。
15.2.16.3.6
MatchData#length
length
可視性:public
動作:レシーバのマッチ結果属性の要素数を返す。
15.2.16.3.7
MatchData#offset
offset(index)
可視性:public
動作:
a) indexがIntegerクラスのインスタンスでない場合は,このメソッドの動作は未規定とする。
b) レシーバのマッチ結果属性をLとし,indexの値をiとする。
c) iが0未満,又はLの要素の数以上の場合は,IndexErrorクラスの直接のインスタンスを例外とし
て発生させる。
d) Lのi番目の要素の部分文字列をSとし,その要素の部分文字列の添字をbとする。bとSの長さとの
和をeとする。
e) b及びeをそれぞれその値とする二つのIntegerクラスのインスタンスをこの順番で含む要素数が2
のArrayクラスを生成し,それを返す。
15.2.16.3.8
MatchData#post̲match
post̲match
178
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:レシーバのマッチ後をその内容とするStringクラスのインスタンスを返す。
15.2.16.3.9
MatchData#pre̲match
pre̲match
可視性:public
動作:レシーバのマッチ前をその内容とするStringクラスのインスタンスを返す。
15.2.16.3.10 MatchData#size
size
可視性:public
動作:lengthメソッドと同じとする(15.2.16.3.6参照)。
15.2.16.3.11 MatchData#string
string
可視性:public
動作:レシーバの文字列属性をその内容とするStringクラスのインスタンスを返す。
15.2.16.3.12 MatchData#to̲a
to̲a
可視性:public
動作:
a) レシーバのマッチ結果属性をLとする。
b) Arrayクラスの空の直接のインスタンスAを生成する。
c) Lの先頭の方から,そのそれぞれの要素eについて,eの部分文字列をその内容とするStringクラ
スの直接のインスタンスをAの末尾に追加する。
d) Aを返す。
15.2.16.3.13 MatchData#to̲s
to̲s
可視性:public
動作:レシーバのマッチする部分文字列をその内容とするStringクラスのインスタンスを返す。
15.2.17
Proc
15.2.17.1
概要
Procクラスのインスタンスは,《ブロック》を表す。
Procクラスのインスタンスは次の属性をもつ。
ブロック:このインスタンスの表す《ブロック》。
15.2.17.2
直接のスーパークラス
Objectクラス
15.2.17.3
特異メソッド
15.2.17.3.1
Proc.new
Proc.new(&block)
可視性:public
動作:
179
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) blockが与えられている場合,Bをblockとする。
b) そうではない場合,次の手順を行う。
1)
ブロック
の一番上の要素がblock-not-givenの場合,ArgumentErrorクラスの直接のインスタン
スを例外として発生させる。
2) そうではない場合,Bを
ブロック
の一番上の値とする。
c) Bをブロック属性としてもつ新しく作ったProcクラスの直接のインスタンスを作る。
d) 作ったインスタンスを返す。
15.2.17.4
インスタンスメソッド
15.2.17.4.1
Proc#[]
[](*args)
可視性:public
動作:callメソッドと同じとする(15.2.17.4.3参照)。
15.2.17.4.2
Proc#arity
arity
可視性:public
動作:Bをレシーバのブロック属性とする。
a) 《ブロック仮引数》がBに現れない場合,処理系定義の値をもつIntegerクラスのインスタンスを返
す。
b) 《ブロック仮引数》がBに現れる場合,次の手順を行う。
1) 《ブロック仮引数リスト》が《ブロック仮引数》に現れない場合,値が0のIntegerクラスのインス
タンスを返す。
2) 《ブロック仮引数リスト》が《ブロック仮引数》に現れる場合,次の手順を行う。
i)
《ブロック仮引数リスト》が《左辺》という形式の場合,値が1のIntegerクラスのインスタンス
を返す。
ii) 《ブロック仮引数リスト》が《多重代入左辺》という形式の場合,次の手順を行う。
I)
《多重代入左辺》が《グループ化された左辺》という形式の場合,値が処理系定義のIntegerク
ラスのインスタンスを返す。
II) 《多重代入左辺》が《一括左辺》という形式の場合,値が−1のIntegerクラスのインスタンスを
返す。
III) そうではない場合,nを《多重代入左辺》の《多重代入左辺項目》の個数とする。
IV) 《多重代入左辺》が《一括左辺》で終わっている場合,値が−(n+1)のIntegerクラスのインスタ
ンスを返す。
V) そうではない場合,値がnのIntegerクラスのインスタンスを返す。
15.2.17.4.3
Proc#call
call(*args)
可視性:public
動作:Bをレシーバのブロック属性とする。Lを空のリストとする。
a) argsのそれぞれの要素を添字順に,Lの末尾に追加する。
b) Lを実引数リストとして,Bを呼び出す(11.3.3参照)。Vを呼出し結果の値とする。
180
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
c) Vを返す。
15.2.17.4.4
Proc#clone
clone
可視性:public
動作:
a) インスタンス変数の束縛をもたない,レシーバと同じクラスのインスタンスを作り,これをOとする。
b) レシーバのそれぞれのインスタンス変数束縛Bについて,同じ名前及び値をもつ変数束縛をOのイン
スタンス変数束縛の集合内に作る。
c) レシーバが特異クラスと関連付けられている場合,Eoをその特異クラスとし,次の手順を実行する。
1) 特異クラスEnを作る。Enの直接のスーパークラスは,Eoの直接のスーパークラスとする。
2) Eoのそれぞれの定数束縛Bv1について,同じ名前及び値をもつ変数束縛をEnの定数束縛の集合内に
作る。
3) Eoのそれぞれのクラス変数束縛Bv2について,同じ名前及び値をもつ変数束縛をEnのクラス変数束
縛の集合内に作る。
4) Eoのインスタンスメソッドのそれぞれの束縛Bmについて,同じ名前及び値をもつメソッド束縛を
Enのインスタンスメソッド束縛の集合内に作る。
5) OとEnとを関連付ける。
d) Oのブロック属性を,レシーバのブロック属性の値とする。
e) Oを返す。
15.2.17.4.5
Proc#dup
dup
可視性:public
動作:
a) インスタンス変数の束縛をもたない,レシーバと同じクラスのインスタンスを作り,これをOとする。
b) Oのブロック属性を,レシーバのブロック属性とする。
c) Oを返す。
15.2.18
Struct
15.2.18.1
概要
Structクラスは,構造型(すなわち,幾つかのフィールド及びそれらのフィールドにアクセスするた
めのメソッドの集合をもつクラス)を生成する。フィールドは,0から始まる整数によって添字付けされ
る[15.2.18.3.1のe)及びf)参照]。生成されたクラスのインスタンスは,それぞれのフィールドに対応する
値をもつ。これらの値は,アクセサメソッドによって参照及び更新される。
15.2.18.2
直接のスーパークラス
Objectクラス
15.2.18.3
特異メソッド
15.2.18.3.1
Struct.new
Struct.new(string, *symbol̲list)
可視性:public
動作:このメソッドはクラスを作り,フィールドの集合及びそのアクセサメソッドを定義する。
181
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
このメソッドが呼び出された場合,次の手順を実行する。
a) Structクラスを直接のスーパークラスとしてもつClassクラスの直接のインスタンスを作り,Cと
する。
b) stringがStringクラスのインスタンスでもSymbolクラスでもない場合,このメソッドの動作は未
規定とする。
c) stringがStringクラスのインスタンスの場合,Nをその内容とする。
1) Nが《定数識別子》という形式でない場合,ArgumentErrorクラスの直接のインスタンスを例外と
して発生させる。
2) Nが《定数識別子》という形式である場合,次の手順を行う。
i)
Structクラスの定数束縛の集合内に名前がNのものが存在する場合,その束縛の値をCに置き
換える。
ii) そうではない場合,Structクラスの定数束縛の集合内に名前がNで値がCである束縛を作成す
る。
d) stringがSymbolクラスのインスタンスの場合,stringをsymbol̲listの先頭に追加する。
e) iを0とする。
f) symbol̲listのそれぞれの要素Sについて,次の手順を行う。
1) Sによって指定される名前をNとする。
2) 名前がNで添字がiのフィールドを,Cに定義する。
3) Nが《局所変数識別子》又は《定数識別子》という形式の場合,次の手順を行う。
i)
実引数をとらず,呼び出された際に名前がNのフィールドの値を返すようなメソッドを,Nとい
う名前でCに定義する。
ii) 実引数を一つとり,呼び出された際にその実引数を名前がNのフィールドに設定してその実引数
を返すようなメソッドを,N=(すなわち,Nの後に “=” が続く。)という名前でCに定義する。
4) iを1だけ増加させる。
g) Cを返す。
Struct.newメソッドによって作られるクラスは,publicな特異メソッドのnew,[],及びmembers
をもつ。Struct.newメソッドによって作られたクラスの名前をCとして,これらのメソッドについて次
のように規定する。
C.new(*args)
可視性:public
動作:
a) Cが定義するフィールドをもつ,Cの直接のインスタンスIを作る。
b) initializeメソッドを,Iに対し,argsを実引数リストとして呼び出す。
c) Iを返す。
C.[](*args)
可視性:public
動作:上記のnewメソッドと同じとする。
C.members
可視性:public
182
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) Arrayクラスの直接のインスタンスAを作る。レシーバのそれぞれのフィールドについて,フィール
ドの添字順に,フィールドの名前を内容としてもつStringクラスの直接のインスタンスを作ってA
の末尾に追加する。
b) Aを返す。
15.2.18.4
インスタンスメソッド
15.2.18.4.1
Struct#==
==(other)
可視性:public
動作:
a) otherとレシーバとが同じオブジェクトの場合,trueを返す。
b) otherのクラスとレシーバのクラスとが違う場合,falseを返す。
c) そうではない場合,レシーバのそれぞれのフィールドについて,そのフィールド名をfとし,次の手
順を行う。
1) レシーバ及びotherのそれぞれの,fという名前をもつフィールドの値を,R及びOとする。
2) RとOとが同じオブジェクトでない場合,次の手順を行う。
i)
“==” メソッドを,Rに対し,Oを実引数として呼び出す。Vを呼出し結果の値とする。
ii) Vが偽の場合,falseを返す。
d) trueを返す。
15.2.18.4.2
Struct#[]
[](name)
可視性:public
動作:
a) nameがSymbolクラス又はStringクラスのインスタンスの場合,次の手順を行う。
1) nameによって指定される名前をNとする。
2) レシーバがNという名前のフィールドをもつ場合,そのフィールドの値を返す。
3) そうではない場合,Sを名前がNであるSymbolクラスのインスタンスとし,Sを名前属性にもつ
NameErrorクラスの直接のインスタンスを例外として発生させる。
b) nameがIntegerクラスのインスタンスの場合,iをnameの値とし,nをレシーバのフィールドの個
数とする。
1) iが負の場合,iを新たにn+iとする。
2) iがまだ負であるか,iがn以上の場合,IndexErrorクラスの直接のインスタンスを例外として発
生させる。
3) そうではない場合,添字がiであるフィールドの値を返す。
c) そうではない場合,このメソッドの動作は未規定とする。
15.2.18.4.3
Struct#[]=
[]=(name, obj)
可視性:public
動作:
183
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) nameがSymbolクラスのインスタンス又はStringクラスのインスタンスの場合,次の手順を行う。
1) nameによって指定される名前をNとする。
2) レシーバがNという名前のフィールドをもつ場合,次の手順を行う。
i)
そのフィールドの値をobjで置き換える。
ii) objを返す。
3) そうではない場合,Sを名前がNであるSymbolクラスのインスタンスとし,Sを名前属性にもつ
NameErrorクラスの直接のインスタンスを例外として発生させる。
b) nameがIntegerクラスのインスタンスの場合,iをnameの値とする。nをレシーバのフィールドの
個数とする。
1) iが負の場合,iを新たにn+iとする。
2) iがまだ負であるか,iがn以上の場合,IndexErrorクラスの直接のインスタンスを例外として発
生させる。
3) そうではない場合,次の手順を行う。
i)
添字がiであるフィールドの値をobjで置き換える。
ii) objを返す。
c) そうではない場合,このメソッドの動作は未規定とする。
15.2.18.4.4
Struct#each
each(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) レシーバのそれぞれのフィールドについて,添字順に,そのフィールドの値を実引数としてblockを
呼び出す。
c) レシーバを返す。
15.2.18.4.5
Struct#each̲pair
each̲pair(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) レシーバのそれぞれのフィールドについて,添字順に,次の手順を行う。
1) そのフィールドの名前及び値をそれぞれ,N及びVとする。Sを名前がNであるSymbolクラスの
インスタンスとする。
2) S及びVを実引数として,blockを呼び出す。
c) レシーバを返す。
15.2.18.4.6
Struct#initialize
initialize(*args)
可視性:private
動作:Naをargsの長さとし,Nfをレシーバのフィールドの個数とする。
a) NaがNfより大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
184
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
b) そうではない場合,レシーバのそれぞれのフィールドfについて,iをfの添字とし,argsのi番目の
値をfの値とする。ただし,iがNa以上ならばnilをfの値とする。
c) 処理系定義の値を返す。
15.2.18.4.7
Struct#initialize̲copy
initialize̲copy(original)
可視性:private
動作:
a) レシーバとoriginalとが同じオブジェクトの場合,処理系定義の値を返す。
b) originalがレシーバのクラスのインスタンスでない場合は,TypeErrorクラスの直接のインスタンス
を例外として発生させる。
c) レシーバのフィールドの個数とoriginalとのフィールドの個数とが異なる場合,TypeErrorクラスの
直接のインスタンスを例外として発生させる。
d) originalのそれぞれのフィールドfについて,iをfの添字とし,レシーバのi番目のフィールドの値を
fの値とする。
e) 処理系定義の値を返す。
15.2.18.4.8
Struct#members
members
可視性:public
動作:15.2.18.3.1で規定されているmembersメソッドと同じとする。
15.2.18.4.9
Struct#select
select(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバのそれぞれのフィールドについて,添字順に,次の手順を行う。
1) Vをそのフィールドの値とする。
2) blockをVを実引数として呼び出す。Rを呼出し結果の値とする。
3) Rが真の場合,VをAの末尾に追加する。
d) Aを返す。
15.2.19
Time
15.2.19.1
概要
Timeクラスのインスタンスは日時を表す。
Timeクラスのインスタンスは,次の属性をもつ。
マイクロ秒:1970年1月1日00:00 UTCからの経過時間をマイクロ秒で表したものである。マイクロ秒
は整数とし,その範囲は処理系定義とする。マイクロ秒属性の値は,マイクロ秒の表現に納まるよ
うに,処理系定義の方法で丸める。Timeクラスのインスタンスの作成時に与えられるマイクロ秒
がその範囲外であった場合は,ArgumentErrorクラス又はRangeErrorクラスのいずれかの直
接のインスタンスである例外を発生させなければならない。どちらのクラスを選ぶかは,処理系定
185
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
義とする。
時間帯:時間帯である。
15.2.19.2
直接のスーパークラス
Objectクラス
15.2.19.3
日時の計算
この細分箇条で定義する数学的な関数は15.2.19全体で用いる。これらの関数は数学的に厳密な整数値を
計算すると仮定する。
この規格では,うるう秒を考慮しない。ただし,規格適合処理系は,処理系定義の方法によってうるう
秒をサポートしてもよい。
15.2.19.3.1
日
1日当たりのマイクロ秒は次のように計算される。
MicroSecPerDay=24×60×60×106
1970年1月1日00:00 UTCからの経過マイクロ秒tに対応する経過日数は,次のとおり計算される。
=
rDay
MicroSecPe
t
floor
t
Day)
(
floor(t)=x ≦ t < x + 1を満たす整数x
マイクロ秒tに対応する日の曜日を表す数は次のように計算される。
WeekDay(t)=(Day(t)+4)を7で除した余り
15.2.19.3.2
年
1年は365日とする。ただし,うるう年は366日とする。うるう年は次のいずれかの条件を満たす年で
ある。
− 4の整数倍であるが,100の整数倍でない。
− 400の整数倍である。
西暦の年yが与えられた場合に,1970年1月1日00:00 UTCからyの初めまでの経過日数は次のとおり
計算される。
−
+
−
−
−
+
−
×
=
400
1601
100
1901
4
1969
1970)
(
365
)
(
y
floor
y
floor
y
floor
y
y
r
DayFromYea
1970年1月1日00:00 UTCからyの初めまでの経過マイクロ秒は,次のように計算される。
MicroSecFromYear(y)=DayFromYear(y)×MicroSecPerDay
1970年1月1日00:00 UTCからの経過マイクロ秒tが与えられた場合に,tに対応する西暦の年yは次
のように計算される。
YearFromTime(t)=MicroSecFromYear (y) ≦ t < MicroSecFromYear(y+1)を満たす整数y
tに対応する年の初めからの通算日数は次のとおり計算される。
DayWithinYear(t)=Day(t)−DayFromYear(YearFromTime(t))
15.2.19.3.3
月
それぞれの月には通常の日数が割り当てられる。ただし,うるう年では余分な1日が2月に割り当てら
れる。それぞれの月は1から12までの整数で識別される(それぞれ1月から12月までに対応する。)。
1970年1月1日00:00 UTCからの経過マイクロ秒tが与えられた場合に,tに対応する日の月の番号は
次のように計算される。
186
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
MonthFromTime(t)=
1
0 ≦ DayWithinYear(t) < 31の場合
2
31 ≦ DayWithinYear(t) < 59+LeapYear(t)の場合
3
59+LeapYear(t) ≦ DayWithinYear(t) < 90+LeapYear(t)の場合
4
90+LeapYear(t) ≦ DayWithinYear(t) < 120+LeapYear(t)の場合
5
120+LeapYear(t) ≦ DayWithinYear(t) < 151+LeapYear(t)の場合
6
151+LeapYear(t) ≦ DayWithinYear(t) < 181+LeapYear(t)の場合
7
181+LeapYear(t) ≦ DayWithinYear(t) < 212+LeapYear(t)の場合
8
212+LeapYear(t) ≦ DayWithinYear(t) < 243+LeapYear(t)の場合
9
243+LeapYear(t) ≦ DayWithinYear(t) < 273+LeapYear(t)の場合
10
273+LeapYear(t) ≦ DayWithinYear(t) < 304+LeapYear(t)の場合
11
304+LeapYear(t) ≦ DayWithinYear(t) < 334+LeapYear(t)の場合
12
334+LeapYear(t) ≦ DayWithinYear(t) < 365+LeapYear(t)の場合
LeapYear(t)=
1
YearFromTime(t) がうるう年の場合
0
それ以外
15.2.19.3.4
月の中での通算日
1970年1月1日00:00 UTCからの経過マイクロ秒tが与えられた場合に,tに対応する日の月の中での
通算日は次のように計算される。
DayWithinMonth(t)=
DayWithinYear(t)+1
Month FromTime(t)=1の場合
DayWithinYear(t)−30
Month FromTime(t)=2の場合
DayWithinYear(t)−58−LeapYear(t)
Month FromTime(t)=3の場合
DayWithinYear(t)−89−LeapYear(t)
Month FromTime(t)=4の場合
DayWithinYear(t)−119−LeapYear(t)
Month FromTime(t)=5の場合
DayWithinYear(t)−150−LeapYear(t)
Month FromTime(t)=6の場合
DayWithinYear(t)−180−LeapYear(t)
Month FromTime(t)=7の場合
DayWithinYear(t)−211−LeapYear(t)
Month FromTime(t)=8の場合
DayWithinYear(t)−242−LeapYear(t)
Month FromTime(t)=9の場合
DayWithinYear(t)−272−LeapYear(t)
Month FromTime(t)=10の場合
DayWithinYear(t)−303−LeapYear(t)
Month FromTime(t)=11の場合
DayWithinYear(t)−333−LeapYear(t)
Month FromTime(t)=12の場合
15.2.19.3.5
時間,分及び秒
1時間,1分,及び1秒当たりのマイクロ秒は,次のとおりである。
MicroSecPerHour=60×60×106
MicroSecPerMinute=60×106
MicroSecPerSecond=106
1970年1月1日00:00 UTCからの経過マイクロ秒tが与えられた場合に,tに対応する(24時間制での)
時間,分,曜日は次のように計算される。
で除した余り
を24
)
( =
rHour
MicroSecPe
t
floor
t
me
HourFromTi
187
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
で除した余り
を60
)
( =
rMinute
MicroSecPe
t
floor
t
Time
MinuteFrom
で除した余り
を60
)
( =
rSecond
MicroSecPe
t
floor
t
Time
SecondFrom
15.2.19.4
時間帯及び現地時間
プログラムの評価時の時間帯は,処理系が動作しているシステムが提供する時間帯の情報から決定され
る。システムから現地時間帯の情報が得られない場合は,Timeクラスのインスタンスの時間帯属性は処
理系定義とする。
Timeクラスのインスタンスの現地時間は,そのインスタンスのマイクロ秒属性tと時間帯属性zとから
次のように計算される。
LocalTime=t+ZoneOffset(z)
ZoneOffset(z)=zのUTCからの時差をマイクロ秒で表したもの
15.2.19.5
夏時間
規格適合処理系は,処理系の動作するシステムがそれぞれの時間帯の夏時間の情報を提供する場合,
Timeクラスのインスタンスの時間帯属性が夏時間の期間は,そのインスタンスのマイクロ秒属性を調整
することが望ましい。この調整に用いるアルゴリズムは処理系定義とする。
15.2.19.6
特異メソッド
15.2.19.6.1
Time.at
Time.at(*args)
可視性:public
動作:
a) argsの長さが0である場合,又は2より大きい場合は,ArgumentErrorクラスの直接のインスタン
スを例外として発生させる。
b) argsの長さが1の場合は,その唯一の要素をAとする。
1) AがTimeクラスのインスタンスの場合は,Aと同じマイクロ秒属性及び時間帯属性をもつTime
クラスのインスタンスを作成し,それを返す。
2) AがIntegerクラスのインスタンス又はFloatクラスのインスタンスの場合,次の手順を行う。
i)
Aの値をNとする。
ii) 1970年1月1日00:00 UTCからN×106マイクロ秒後の日時を表すTimeクラスの直接のインス
タンスを作成する。そのインスタンスの時間帯属性はシステムの現地時間帯とする。
iii) 作成したインスタンスを返す。
3) それら以外の場合は,このメソッドの動作は未規定とする。
c) argsの長さが2の場合は,argsの第1要素,第2要素をそれぞれS,Mとする。
1) SがIntegerクラスのインスタンスの場合は,Sの値をNSとする。
2) そうではない場合は,このメソッドの動作は未規定とする。
3) MがIntegerクラスのインスタンス又はFloatクラスのインスタンスの場合は,Mの値をNmと
する。
4) そうではない場合は,このメソッドの動作は未規定とする。
5) 1970年1月1日00:00 UTCからNS×106+NMマイクロ秒後の日時を表すTimeクラスの直接のイン
188
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
スタンスを作成する。そのインスタンスの時間帯属性はシステムの現地時間帯とする。
6) 作成したインスタンスを返す。
15.2.19.6.2
Time.gm
Time.gm(year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
可視性:public
動作:
a) year,day,hour,min,sec,及びusecに対応する整数を,次に示すとおりに計算する。その計算結果
を,それぞれY,D,H,Min,S,及びUとする。
実引数として与えられたオブジェクトOに対応する整数Iは次のように計算する。
1) OがIntegerクラスのインスタンスの場合は,Oの値をIとする。
2) OがFloatクラスのインスタンスの場合は,Oの整数部分をIとする。
3) OがStringクラスのインスタンスの場合,
i)
Oの内容が《10進数字》の並びである場合は,その並びを10進数として解釈した値をIとする。
ii) それ以外の場合は,このメソッドの動作は未規定とする。
4) それら以外の場合は,このメソッドの動作は未規定とする。
b) monthに対応する値は次のように計算する。
1) monthがIntegerクラスのインスタンスの場合,monthの値をMonとする。
2) monthがStringクラスのインスタンスの場合,次の手順を行う。
i)
monthの内容が表5の下段のいずれかと大文字小文字の違いを除いて一致する場合は,対応する
上段の整数をMonとする。
ii) monthの最初の文字が《10進数字》の場合は,monthに対応する整数を手順a)に従い計算する。そ
の結果をMonとする。
iii) それら以外の場合は,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
3) そうではない場合,このメソッドの動作は未規定とする。
c) Yが0 ≦ Y ≦ 138を満たす場合は,このメソッドの動作は処理系定義とする。
d) これまでの手順で計算した整数が次に示す条件を満たさない場合は,ArgumentErrorクラスの直接
のインスタンスを例外として発生させる。
− 1 ≦ Mon ≦ 12
− 1 ≦ D ≦ 31
− 0 ≦ H ≦ 23
− 0 ≦ Min ≦ 59
− 0 ≦ S ≦ 59
Yの値に条件を設けるかどうかは,処理系定義とする。
e) tを次の全ての等式を満たす最も小さい整数とする。
− YearFromTime(t)=Y
− MonthFromTime(t)=Mon
− DayWithinMonth(t)=1
f) Tを次のようにして計算する。
T=t+D×MicroSecPerDay+H×MicroSecPerHour+Min×MicroSecPerMinute+S×106+U
189
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
g) 1970年1月1日00:00 UTCからTマイクロ秒後の日時を表すTimeクラスの直接のインスタンスを作
成する。そのインスタンスの時間帯属性はUTCとする。
h) 作成したインスタンスを返す。
表5−月名に対応する整数
1
2
3
4
5
6
7
8
9
10
11
12
Jan
Feb
Mar
Apr
May
Jun
Jul
Aug
Sep
Oct
Nov
Dec
15.2.19.6.3
Time.local
Time.local(year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
可視性:public
動作:Time.gmメソッドと同じとする(15.2.19.6.2参照)。ただし,メソッドの戻り値であるTimeクラ
スの直接のインスタンスの時間帯属性は,システムの現地時間帯とする。
15.2.19.6.4
Time.mktime
Time.mktime(year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
可視性:public
動作:Time.localメソッドと同じとする(15.2.19.6.3参照)。
15.2.19.6.5
Time.now
Time.now
可視性:public
動作:このメソッドは,呼出し時の時刻及びシステムの現地時間帯を表すTimeクラスの直接のインスタ
ンスを返す。このメソッドの動作はnewメソッドと同じとする(15.2.3.3.3参照)。
15.2.19.6.6
Time.utc
Time.utc(year, month=1, day=1, hour=0, min=0, sec=0, usec=0)
可視性:public
動作:Time.gmメソッドと同じとする(15.2.19.6.2参照)。
15.2.19.7
インスタンスメソッド
15.2.19.7.1
Time#<=>
<=>(other)
可視性:public
動作:
a) otherがTimeクラスのインスタンスでない場合は,nilを返す。
b) それ以外の場合は,レシーバのマイクロ秒属性及びotherのマイクロ秒属性を,それぞれTr及びToと
する。
1) Tr > Toである場合は,その値が1のIntegerクラスのインスタンスを返す。
2) Tr = Toである場合は,その値が0のIntegerクラスのインスタンスを返す。
3) Tr < Toである場合は,その値が−1のIntegerクラスのインスタンスを返す。
15.2.19.7.2
Time#+
+(offset)
可視性:public
190
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) offsetがIntegerクラスのインスタンス,又はFloatクラスのインスタンスでない場合は,このメ
ソッドの動作は未規定とする。
b) offsetの値をVとする。
c) V×106の計算結果をoとする。
d) レシーバのマイクロ秒属性をt,時間帯属性をzとする。
e) 1970年1月1日00:00 UTCからt+oマイクロ秒後の日時を表すTimeクラスの直接のインスタンスを
作成する。そのインスタンスの時間帯属性はzとする。
f)
作成したインスタンスを返す。
15.2.19.7.3
Time#−
−(offset)
可視性:public
動作:
a) offsetがIntegerクラスのインスタンス,又はFloatクラスのインスタンスでない場合は,このメ
ソッドの動作は未規定とする。
b) offsetの値をVとする。
c) V×106の計算結果をoとする。
d) レシーバのマイクロ秒属性をt,時間帯属性をzとする。
e) 1970年1月1日00:00 UTCからt−oマイクロ秒後の日時を表すTimeクラスの直接のインスタンスを
作成する。そのインスタンスの時間帯属性はzとする。
f)
作成したインスタンスを返す。
15.2.19.7.4
Time#asctime
asctime
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) 表6において,WeekDay(t)に対応する下段の曜日名をWとする。
c) 表5において,MonthFromTime(t)に対応する下段の月名をMonとする。
d) D,H,M,S,及びYを次の値とする。
D=DayWithinMonth(t)
H=HourFromTime(t)
M=MinuteFromTime(t)
S=SecondFromTime(t)
Y=YearFromTime(t)
e) 次の内容をもつStringクラスの直接のインスタンスを作成する。
W Mon D H:M:S Y
Dは2桁に整形し,必要な場合は先頭に一つの空白文字(0x20)を付加する。H,M及びSは2桁に整
形し,必要な場合は先頭に一つの0を付加する。
例 Time.local(1,10,1,13,20,5).asctimeは,"Mon Oct 1 13:20:05 2001" を返す。
191
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
f)
作成したインスタンスを返す。
表6−整数に対応する曜日名
0
1
2
3
4
5
6
Sun
Mon
Tue
Wed
Thu
Fri
Sat
15.2.19.7.5
Time#ctime
ctime
可視性:public
動作:asctimeメソッドと同じとする(15.2.19.7.4参照)。
15.2.19.7.6
Time#day
day
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) DayWithinMonth(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.7
Time#dst?
dst?
可視性:public
動作:レシーバのマイクロ秒属性をT,時間帯属性をZとする。
a) TがZの夏時間の期間内である場合は,trueを返す。
b) そうではない場合は,falseを返す。
15.2.19.7.8
Time#getgm
getgm
可視性:public
動作:getutcメソッドと同じとする(15.2.19.7.10参照)。
15.2.19.7.9
Time#getlocal
getlocal
可視性:public
動作:このメソッドは,レシーバと同じマイクロ秒及びシステムの現地時間帯を表すTimeクラスの直接
のインスタンスを返す。
15.2.19.7.10 Time#getutc
getutc
可視性:public
動作:このメソッドは,レシーバと同じマイクロ秒及びUTC時間帯を表すTimeクラスの直接のインスタ
ンスを返す。
15.2.19.7.11 Time#gmt?
gmt?
可視性:public
192
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:utc?メソッドと同じとする(15.2.19.7.28参照)。
15.2.19.7.12 Time#gmt̲offset
gmt̲offset
可視性:public
動作:utc̲offsetメソッドと同じとする(15.2.19.7.29参照)。
15.2.19.7.13 Time#gmtime
gmtime
可視性:public
動作:utcメソッドと同じとする(15.2.19.7.27参照)。
15.2.19.7.14 Time#gmtoff
gmtoff
可視性:public
動作:utc̲offsetメソッドと同じとする(15.2.19.7.29参照)。
15.2.19.7.15 Time#hour
hour
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) HourFromTime(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.16 Time#initialize
initialize
可視性:private
動作:
a) 1970年1月1日00:00 UTCからの経過マイクロ秒をレシーバのマイクロ秒属性に設定する。
b) システムの現地時間帯をレシーバの時間帯属性に設定する。
c) 処理系定義の値を返す。
15.2.19.7.17 Time#initialize̲copy
initialize̲copy(original)
可視性:private
動作:
a) originalがTimeクラスのインスタンスでない場合は,TypeErrorクラスの直接のインスタンスを例
外として発生させる。
b) originalのマイクロ秒属性をレシーバのマイクロ秒属性に設定する。
c) originalの時間帯属性をレシーバの時間帯属性に設定する。
d) 処理系定義の値を返す。
15.2.19.7.18 Time#localtime
localtime
可視性:public
193
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) レシーバの時間帯属性を,システムの現地時間帯へ変更する。
b) レシーバを返す。
15.2.19.7.19 Time#mday
mday
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) DayWithinMonth(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.20 Time#min
min
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) MinuteFromTime(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.21 Time#mon
mon
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) MonthFromTime(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.22 Time#month
month
可視性:public
動作:monメソッドと同じとする(15.2.19.7.21参照)。
15.2.19.7.23 Time#sec
sec
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) SecondFromTime(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.24 Time#to̲f
to̲f
可視性:public
動作:レシーバのマイクロ秒属性をtとする。
194
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) t/106を計算する。
b) 手順a)の計算結果を値としてもつFloatクラスのインスタンスを返す。
15.2.19.7.25 Time#to̲i
to̲i
可視性:public
動作:レシーバのマイクロ秒属性をtとする。
a) floor(t/106)を計算する。
b) 手順a)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.26 Time#usec
usec
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) tを106で除した余りを計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.27 Time#utc
utc
可視性:public
動作:
a) レシーバの時間帯属性を,UTCへ変更する。
b) レシーバを返す。
15.2.19.7.28 Time#utc?
utc?
可視性:public
動作:レシーバの時間帯属性をZとする。
a) ZがUTCの場合は,trueを返す。
b) そうではない場合は,falseを返す。
15.2.19.7.29 Time#utc̲offset
utc̲offset
可視性:public
動作:レシーバの時間帯属性をZとする。
a) floor(ZoneOffset(Z)/106)を計算する。
b) 手順a)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.30 Time#wday
wday
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) WeekDay(t)を計算する。
195
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.31 Time#yday
yday
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) DayWithinYear(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.32 Time#year
year
可視性:public
動作:
a) レシーバの現地時間を計算する(15.2.19.4参照)。その結果をtとする。
b) YearFromTime(t)を計算する。
c) 手順b)の計算結果を値としてもつIntegerクラスのインスタンスを返す。
15.2.19.7.33 Time#zone
zone
可視性:public
動作:レシーバの時間帯属性をZとする。
a) Zの名前を表すStringクラスの直接のインスタンスを作成する。そのインスタンスの正確な内容は
処理系定義とする。
b) 作成したインスタンスを返す。
15.2.20
IO
15.2.20.1
概要
IOクラスのインスタンスはストリーム,すなわちデータの入力元又は出力先を表す。
IOクラスのインスタンスは次の属性をもつ。
読込み可能フラグ:ストリームからの入力が行えるかを表す真理値。
この値が真のときに限り,IOクラスのインスタンスは読込み可能であるという。
読込み可能でないストリームからの読込みは,IOErrorクラスの直接のインスタンスを例外とし
て発生させる。
書込み可能フラグ:ストリームへの出力が行えるかを表す真理値。
この値が真のときに限り,IOクラスのインスタンスは書込み可能であるという。
書込み可能でないストリームへの書込みは,IOErrorクラスの直接のインスタンスを例外として
発生させる。
オープン中フラグ:ストリームが開いているかどうかを表す真理値。
この値が真のときに限り,IOクラスのインスタンスは開いているという。この値が偽のときに限
り,IOクラスのインスタンスは閉じているという。
閉じているストリームは読込み可能でも,書込み可能でもない。
バッファリングフラグ:ストリームに書き込んだデータの出力が遅延されるかどうかを表す真理値。
196
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
この値が真のとき,レシーバに対する書込みを,インスタンスメソッドflush又はcloseが呼
び出されるまで保留してよい。
IOクラスのメソッドの実行中に動作中のシステムがエラーを報告したとき,SystemCallErrorクラ
スを例外として発生させてもよい。
IOクラスのinitializeメソッドの動作は未規定とする。すなわち,Objectクラスの定数STDIN,
STDOUT及びSTDERR(15.2.1参照)以外にIOクラスの直接のインスタンスを作成できるかどうかは未
規定とする。
注記 ただし,IOクラスのサブクラスであるFileクラスに関しては,15.2.21.4.1でinitialize
メソッドを規定しているため,newメソッドによってインスタンスを作成できる。
次のIOクラスのメソッド群の規定の中では,バイトは0から255までの整数を表す。
15.2.20.2
直接のスーパークラス
Objectクラス
15.2.20.3
インクルードモジュール
IOクラスは,次のモジュールをインクルードする。
− Enumerable
15.2.20.4
特異メソッド
15.2.20.4.1
IO.open
IO.open(*args, &block)
可視性:public
動作:
a) レシーバに対し,argsの全ての要素を実引数にしてnewメソッドを呼び出す。Iを呼出し結果の値と
する。
b) blockが与えられない場合,Iを返す。
c) そうではない場合,blockを,Iを実引数として呼び出す。Vを呼出し結果の値とする。
d) Iに対し,実引数なしでcloseメソッドを呼び出す(15.2.20.5.1参照)。この処理は,手順c)で例外が
発生したがそれが処理されなかった場合であっても行う。
e) Vを返す。
例 ブロックが渡された場合,自動的にcloseメソッドが呼ばれる。
File.open("data.txt"){|f|
puts f.read
}
ブロックが渡されない場合,プログラマは明示的にcloseメソッドを呼ぶのがよい。
f = File.open("data.txt")
puts f.read
f.close
注記 IOクラスに対するnewメソッドの呼出しの動作は未規定であるため,IOクラスに対するopen
メソッドの呼出しの動作も未規定である。ただし,IOクラスのサブクラスであるFileクラス
に対してopenメソッドを呼び出すことができる。
15.2.20.5
インスタンスメソッド
197
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.20.5.1
IO#close
close
可視性:public
動作:
a) レシーバが閉じている場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバのバッファリングフラグ属性が真であり,レシーバが出力を遅延しているデータをもつ場合,
これらのデータを直ちにレシーバの表すストリームに対して書き出す。
c) レシーバのオープン中フラグ属性を偽にする。
d) 処理系定義の値を返す。
15.2.20.5.2
IO#closed?
closed?
可視性:public
動作:
a) レシーバが閉じている場合,trueを返す。
b) そうではない場合,falseを返す。
15.2.20.5.3
IO#each
each(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
c) レシーバがストリームの終端に達している場合,レシーバを返す。
d) そうではない場合,0x0aが読み込まれるか,終端に達するまで,レシーバの表すストリームから読込
みを行う。
e) 手順d)で読み込んだ文字列を内容としてもつStringクラスの直接のインスタンスを作り,それを実
引数としてblockを呼び出す。
f)
手順c)から処理を続ける。
15.2.20.5.4
IO#each̲byte
each̲byte(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
c) レシーバがストリームの終端に達している場合,レシーバを返す。
d) そうではない場合,レシーバの表すストリームから1バイト読み込み,それを値としてもつInteger
クラスのインスタンスを実引数としてblockを呼び出す。
e) 手順c)から処理を続ける。
15.2.20.5.5
IO#each̲line
each̲line(&block)
198
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:eachメソッドと同じとする(15.2.20.5.3参照)。
15.2.20.5.6
IO#eof?
eof?
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,trueを返す。そうではない場合,falseを返す。
15.2.20.5.7
IO#flush
flush
可視性:public
動作:
a) レシーバが書込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバのバッファリングフラグ属性が真であり,レシーバが出力を遅延しているデータをもつ場合,
これらのデータを直ちにレシーバの表すストリームに対して書き出す。
c) レシーバを返す。
15.2.20.5.8
IO#getc
getc
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,nilを返す。
c) そうではない場合,レシーバから1文字読み込み,その文字を表すObjectクラスのインスタンス
(15.2.10.1参照)を返す。
15.2.20.5.9
IO#gets
gets
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,nilを返す。
c) そうではない場合,0x0aが読み込まれるか,終端に達するまで,レシーバの表すストリームから文字
を読み込む。
d) 手順c)で読み込んだ文字列を内容としてもつStringクラスの直接のインスタンスを作って返す。
15.2.20.5.10 IO#initialize̲copy
initialize̲copy(original)
可視性:private
動作:このメソッドの動作は未規定とする。
15.2.20.5.11 IO#print
print(*args)
199
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:
a) argsのそれぞれの要素Vについて,添字順に次の手順を行う。
1) Vがnilの場合,規格適合処理系は,内容が “nil” であるStringクラスの直接のインスタンスを
作成し,Vをそのインスタンスとしてもよい。
2) レシーバに対し,Vを実引数としてwriteメソッドを呼び出す。
b) 処理系定義の値を返す。
15.2.20.5.12 IO#putc
putc(obj)
可視性:public
動作:
a) objがIntegerクラスのインスタンスでもStringクラスのインスタンスでもない場合,このメソッ
ドの動作は未規定とする。objが,値が0未満又は255より大きいIntegerクラスのインスタンスの
場合,このメソッドの動作は未規定とする。
b) objがIntegerクラスのインスタンスの場合,文字符号がobjの値に等しい文字だけを内容としても
つStringクラスの直接のインスタンスSを作る。
c) objがStringクラスのインスタンスの場合,objの最初の文字だけを内容としてもつStringクラス
の直接のインスタンスSを作る。
d) レシーバに対し,Sを実引数としてwriteメソッドを呼び出す。
e) objを返す。
15.2.20.5.13 IO#puts
puts(*args)
可視性:public
動作:
a) argsの長さが0の場合,0x0aを1文字だけ内容としてもつStringクラスの直接のインスタンスを作
り,それを実引数としてレシーバに対しwriteメソッドを呼び出す。
b) そうではない場合,argsのそれぞれの要素Eについて,添字順に次の手順を行う。
1) EがArrayクラスのインスタンスの場合,Eのそれぞれの要素Xについて,添字順に次の手順を行
う。
i)
XがEと同じオブジェクトである,すなわちEが自分自身を含む場合,処理系定義の内容をもつ
Stringクラスのインスタンスを実引数として,レシーバに対しwriteメソッドを呼び出す。
ii) そうではない場合,Xを実引数としてレシーバに対しwriteメソッドを呼び出す。
2) そうではない場合,次の手順を行う。
i)
Eがnilの場合,規格適合処理系は,内容が “nil” であるStringクラスの直接のインスタンス
を作成し,Eをそのインスタンスとしてもよい。
ii) EがStringクラスのインスタンスでない場合,Eに対しto̲sメソッドを呼び出す。呼出し結
果の値がStringクラスのインスタンスである場合,Eを呼出し結果の値とする。そうではない
場合,このメソッドの動作は未規定とする。
iii) Eを実引数としてレシーバに対しwriteメソッドを呼び出す。
200
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
iv) Eの最後の文字が0x0aでない場合,0x0aを1文字だけ内容としてもつStringクラスの直接の
インスタンスを作り,それを実引数としてレシーバに対しwriteメソッドを呼び出す。
c) 処理系定義の値を返す。
15.2.20.5.14 IO#read
read(length=nil)
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,次の手順を行う。
1) lengthがnilの場合,Stringクラスの空の直接のインスタンスを作って返す。
2) lengthがnilでない場合,nilを返す。
c) そうではない場合,次の手順を行う。
1) lengthがnilの場合,レシーバからストリームの終端に達するまで読込みを行う。
2) lengthがIntegerクラスのインスタンスの場合,Nをlengthの値とする。そうではない場合,この
メソッドの動作は未規定とする。
3) Nが0未満の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
4) レシーバから,N個のバイトを読み込むかストリームの終端に達するまで読込みを行う。
d) 手順c)で読み込んだ文字列を内容としてもつStringクラスの直接のインスタンスを作って返す。
15.2.20.5.15 IO#readchar
readchar
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,EOFErrorクラスの直接のインスタンスを例外とし
て発生させる。
c) そうではない場合,レシーバから1文字読み込み,それを表すObjectクラスのインスタンスを返す。
15.2.20.5.16 IO#readline
readline
可視性:public
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバがストリームの終端に達している場合,EOFErrorクラスの直接のインスタンスを例外とし
て発生させる。
c) そうではない場合,0x0aが読み込まれるか,終端に達するまで,レシーバの表すストリームから読込
みを行う。
d) 手順c)で読み込んだ文字列を内容としてもつStringクラスの直接のインスタンスを作って返す。
15.2.20.5.17 IO#readlines
readlines
可視性:public
201
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) レシーバが読込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバがストリームの終端に達している場合,Aを返す。
d) そうではない場合,0x0aが読み込まれるか,終端に達するまで,レシーバの表すストリームから読込
みを行う。
e) 手順d)で読み込んだ文字列を内容としてもつStringクラスの直接のインスタンスを作り,Aの末尾
に追加する。
f)
手順c)から処理を続ける。
15.2.20.5.18 IO#sync
sync
可視性:public
動作:
a) レシーバが閉じている場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) レシーバのバッファリングフラグ属性が真の場合,falseを返す。そうではない場合,trueを返す。
15.2.20.5.19 IO#sync=
sync=(bool)
可視性:public
動作:
a) レシーバが閉じている場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
b) boolが真の場合,レシーバのバッファリングフラグ属性を偽にする。boolが偽の場合,レシーバのバ
ッファリングフラグ属性を真にする。
c) boolを返す。
15.2.20.5.20 IO#write
write(str)
可視性:public
動作:
a) strがStringクラスのインスタンスの場合,Sをstrとする。
b) そうではない場合,strに対しto̲sメソッドを呼び出す。Sを呼出し結果の値とする。SがString
クラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Sが空の場合,値が0のIntegerクラスのインスタンスを返す。
d) レシーバが書込み可能でない場合,IOErrorクラスの直接のインスタンスを例外として発生させる。
e) Sの全ての文字を,S内と同じ順序で,レシーバの表すストリームに書き込む。
f)
処理系定義の値をもつIntegerクラスのインスタンスを返す。
15.2.21
File
15.2.21.1
概要
Fileクラスのインスタンスは,開いているファイルを表す。
規格適合処理系は,Fileクラスのメソッドの実行中に動作中のシステムがエラーを報告したとき,
SystemCallErrorクラスを例外として発生させてもよい。
202
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Fileクラスのインスタンスは次の属性をもつ。
パス:ファイルの位置を示す文字列。パスの正確な構文は,処理系定義とする。
15.2.21.2
直接のスーパークラス
IOクラス
15.2.21.3
特異メソッド
15.2.21.3.1
File.exist?
File.exist?(path)
可視性:public
動作:
a) pathで指定されたファイルが存在する場合,trueを返す。
b) そうではない場合,falseを返す。
15.2.21.4
インスタンスメソッド
15.2.21.4.1
File#initialize
initialize(path, mode="r")
可視性:private
動作:
a) pathがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) modeの内容が “r” 又は “w” であるStringクラスのインスタンスでない場合,このメソッドの動作
は未規定とする。
c) pathで指定されたファイルを処理系定義の方法で開き,レシーバに関連付ける。
d) レシーバのパスにpathの内容を設定する。
e) レシーバのオープン中フラグ属性及びバッファリングフラグ属性を真にする。
f)
レシーバの読込み可能フラグ属性及び書込み可能フラグ属性を次の手順で設定する。
1) modeの内容が “r” のStringクラスのインスタンスの場合,読込み可能フラグ属性を真に,書込
み可能フラグ属性を偽にする。
2) modeの内容が “w” のStringクラスのインスタンスの場合,読込み可能フラグ属性を偽に,書込
み可能フラグ属性を真にする。
g) 処理系定義の値を返す。
15.2.21.4.2
File#path
path
可視性:public
動作:内容がレシーバのパスであるようなStringクラスの直接のインスタンスを作って返す。
15.2.22
Exception
15.2.22.1
概要
Exceptionクラスのインスタンスは,例外を表す。Exceptionクラスは,全ての例外クラスのスーパ
ークラスとする(15.1の図1参照)。この規格で規定されている様々な異常状態において,これらのサブ
クラスのインスタンスが例外として発生する。
Exceptionクラスのインスタンスは次の属性をもつ。
メッセージ:to̲sメソッドによって返されるオブジェクト(15.2.22.4.4参照)。
203
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Kernelクラスのcloneメソッド(15.3.1.3.8参照)又はdupメソッド(15.3.1.3.9参照)がException
クラスのインスタンスに対して呼び出された場合,レシーバのメッセージ属性を呼出し結果のインスタン
スにコピーしなければならない。
15.2.22.2
直接のスーパークラス
Objectクラス
15.2.22.3
特異メソッド
15.2.22.3.1
Exception.exception
Exception.exception(*args, &block)
可視性:public
動作:newメソッドと同じとする(15.2.3.3.3参照)。
15.2.22.4
インスタンスメソッド
15.2.22.4.1
Exception#exception
exception(*string)
可視性:public
動作:
a) stringの長さが0の場合,レシーバを返す。
b) stringの長さが1の場合,次の手順を行う。
1) 唯一の実引数がレシーバと同一のオブジェクトの場合,レシーバを返す。
2) そうではない場合,Mをその実引数とする。
i)
レシーバのクラスの直接のインスタンスを作る。Eを作ったインスタンスとする。
ii) Eのメッセージ属性をMとする。
iii) Eを返す。
c) stringの長さが1より大きい場合,ArgumentErrorクラスの直接のインスタンスを例外として発生
させる。
15.2.22.4.2
Exception#initialize
initialize(message=nil)
可視性:private
動作:
a) レシーバのメッセージ属性をmessageとする。
b) 処理系定義の値を返す。
15.2.22.4.3
Exception#message
message
可視性:public
動作:
a) レシーバに対しto̲sメソッドを呼び出す。
b) 呼び出した結果の値を返す。
15.2.22.4.4
Exception#to̲s
to̲s
可視性:public
204
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) Mをレシーバのメッセージ属性とする。
b) Mがnilの場合,処理系定義の値を返す。
c) MがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
d) MがStringクラスのインスタンスである場合,Mを返す。
15.2.23
StandardError
15.2.23.1
概要
StandardErrorクラスのインスタンスは,標準的なエラーを表す。これらのインスタンスは,《例外
クラスリスト》をもたない《rescue節》によって処理できる(11.5.2.5参照)。
15.2.23.2
直接のスーパークラス
Exceptionクラス
15.2.24
ArgumentError
15.2.24.1
概要
ArgumentErrorクラスのインスタンスは,実引数に関するエラーを表す。
15.2.24.2
直接のスーパークラス
StandardErrorクラス
15.2.25
LocalJumpError
LocalJumpErrorクラスのインスタンスは,《ブロック》又は《ジャンプ式》の評価中に起こったエラー
を表す。
15.2.25.1
直接のスーパークラス
StandardErrorクラス
15.2.25.2
インスタンスメソッド
15.2.25.2.1
LocalJumpError#exit̲value
exit̲value
可視性:public
動作:レシーバのインスタンス変数@exit̲valueの値を返す。
15.2.25.2.2
LocalJumpError#reason
reason
可視性:public
動作:レシーバのインスタンス変数@reasonの値を返す。
15.2.26
RangeError
15.2.26.1
概要
RangeErrorクラスのインスタンスは,範囲に関するエラーを表す。
15.2.26.2
直接のスーパークラス
StandardErrorクラス
15.2.27
RegexpError
15.2.27.1
概要
RegexpErrorクラスのインスタンスは,正規表現に関するエラーを表す。
15.2.27.2
直接のスーパークラス
205
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
StandardErrorクラス
15.2.28
RuntimeError
15.2.28.1
概要
RuntimeErrorクラスのインスタンスは,実行時エラーを表す。RuntimeErrorクラスのインスタン
スは,Kernelクラスのraiseメソッド(15.3.1.2.12参照)で例外クラスを指定しなかった場合に,例外
として発生する。
15.2.28.2
直接のスーパークラス
StandardErrorクラス
15.2.29
TypeError
15.2.29.1
概要
TypeErrorクラスのインスタンスは,型に関するエラーを表す。
15.2.29.2
直接のスーパークラス
StandardErrorクラス
15.2.30
ZeroDivisionError
15.2.30.1
概要
ZeroDivisionErrorクラスのインスタンスは,0除算エラーを表す。
15.2.30.2
直接のスーパークラス
StandardErrorクラス
15.2.31
NameError
NameErrorクラスのインスタンスは,名前を値へ解決する場合のエラーを表す。
NameErrorクラスのインスタンスは次の属性をもつ。
名前:この例外が発生する原因となった名前を表す。
Kernelクラスのcloneメソッド(15.3.1.3.8参照)又はdupメソッド(15.3.1.3.9参照)がNameError
クラスのインスタンスに対して呼び出された場合,レシーバの名前属性を呼出し結果のインスタンスにコ
ピーしなければならない。
15.2.31.1
直接のスーパークラス
StandardErrorクラス
15.2.31.2
インスタンスメソッド
15.2.31.2.1
NameError#initialize
initialize(message=nil, name=nil)
可視性:public
動作:
a) レシーバの名前属性の値をnameとする。
b) NameErrorクラスのスーパークラスであるExceptionクラスに定義されているinitializeメソ
ッドを,messageだけを含む実引数リストをその《括弧なし実引数》の値とする《実引数付きsuper》を評
価するのと同様にして呼び出す。
c) 処理系定義の値を返す。
15.2.31.2.2
NameError#name
name
206
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:レシーバの名前属性の値を返す。
15.2.32
NoMethodError
NoMethodErrorクラスのインスタンスは,存在しないか呼び出せないメソッドを呼び出そうとした場
合に発生するエラーを表す。
NoMethodErrorクラスのインスタンスは,名前(15.2.31参照)及び実引数という属性をもつ。これら
の属性の値はinitializeメソッドによって設定される(15.2.32.2.2参照)。
Kernelクラスのcloneメソッド(15.3.1.3.8参照)又はdupメソッド(15.3.1.3.9参照)が
NoMethodErrorクラスのインスタンスに対して呼び出された場合,レシーバのこれらの属性を呼出し結
果のインスタンスにコピーしなければならない。
15.2.32.1
直接のスーパークラス
NameErrorクラス
15.2.32.2
インスタンスメソッド
15.2.32.2.1
NoMethodError#args
args
可視性:public
動作:レシーバの実引数属性の値を返す。
15.2.32.2.2
NoMethodError#initialize
initialize(message=nil, name=nil, args=nil)
可視性:private
動作:
a) レシーバの実引数属性の値をargsとする。
b) 15.2.31.2.1で規定されているinitializeメソッドの全ての手順を実行する。
c) 処理系定義の値を返す。
15.2.33
IndexError
15.2.33.1
概要
IndexErrorクラスのインスタンスは,添字に関するエラーを表す。
15.2.33.2
直接のスーパークラス
StandardErrorクラス
15.2.34
IOError
15.2.34.1
概要
IOErrorクラスのインスタンスは,入出力に関するエラーを表す。
15.2.34.2
直接のスーパークラス
StandardErrorクラス
15.2.35
EOFError
15.2.35.1
概要
EOFErrorクラスのインスタンスは,ストリームが終端に達した際に発生するエラーを表す。
15.2.35.2
直接のスーパークラス
IOErrorクラス
207
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.2.36
SystemCallError
15.2.36.1
概要
SystemCallErrorクラスのインスタンスは,IOクラスのメソッドの実行中に発生したエラーを表す。
15.2.36.2
直接のスーパークラス
StandardErrorクラス
15.2.37
ScriptError
15.2.37.1
概要
ScriptErrorクラスのインスタンスは,構文エラー,外部プログラムの読込みエラーなどのプログラ
ムの誤りを表す。
15.2.37.2
直接のスーパークラス
Exceptionクラス
15.2.38
SyntaxError
15.2.38.1
概要
SyntaxErrorクラスのインスタンスは,構文エラーを表す。
15.2.38.2
直接のスーパークラス
ScriptErrorクラス
15.2.39
LoadError
15.2.39.1
概要
LoadErrorクラスのインスタンスは,外部プログラムの読込み時のエラーを表す(15.3.1.2.13参照)。
15.2.39.2
直接のスーパークラス
ScriptErrorクラス
15.3 組込みモジュール
15.3.1 Kernel
15.3.1.1 概要
Kernelモジュールは,Objectクラスによってインクルードされる。Kernelモジュールに定義され
ているインスタンスメソッドは,上書きされない限り,Objectクラスの任意のインスタンスに対して呼
び出すことができる。
15.3.1.2 特異メソッド
15.3.1.2.1 Kernel.ʻ
Kernel.ʻ(string)
可視性:public
動作:このメソッドは,8.7.6.3.7で規定する形式によって呼び出される。
このメソッドは,stringに対応する外部コマンドを実行する。このメソッドによって実行される外部コ
マンドは,処理系定義とする。
このメソッドが呼び出された場合,次の手順を実行する。
a) stringがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) stringの内容に対応した外部コマンドを実行する。外部コマンドの出力をRとする。
c) 内容がRであるStringクラスの直接のインスタンスを作って返す。
15.3.1.2.2 Kernel.block̲given?
208
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Kernel.block̲given?
可視性:public
動作:
a)
ブロック
の一番上の要素がblock-not-givenの場合,falseを返す。
b) そうではない場合,trueを返す。
15.3.1.2.3 Kernel.eval
Kernel.eval(string)
可視性:public
動作:
a) stringがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) stringの内容を,《プログラム》(10.1参照)とみなして構文解析する。構文解析に失敗した場合,
SyntaxErrorクラスの直接のインスタンスを例外として発生させる。
c) 構文解析した《プログラム》(10.1参照)を,このメソッドが呼び出される直前の実行環境の下で評価
する。評価結果の値をVとする。
d) Vを返す。
手順c)では,その《プログラム》に対応する局所変数のスコープは,9.2 d) 1)において,《ブロック》に対応
する局所変数のスコープとみなされる。
例1 次のプログラムは,“123” と出力する。
x=123
Kernel.eval("print x")
例2 次のプログラムは例外を発生させる。
Kernel.eval("x = 123") # xのスコープはプログラム"x = 123"である。
print x
# xはここでは未定義である。
15.3.1.2.4 Kernel.global̲variables
Kernel.global̲variables
可視性:public
動作:全ての大域変数の名前を含む新しく作ったArrayクラスの直接のインスタンスを返す。これらの
名前は,Stringクラス又はSymbolクラスの直接のインスタンスとして表す。どちらのクラスを選ぶか
は処理系定義とする。
15.3.1.2.5 Kernel.iterator?
Kernel.iterator?
可視性:public
動作:Kernel.block̲given?メソッドと同じとする(15.3.1.2.2参照)。
15.3.1.2.6 Kernel.lambda
Kernel.lambda(&block)
可視性:public
動作:このメソッドは,Proc.newと同様にしてProcクラスのインスタンスを作る(15.2.17.3.1参照)
が,blockが《yield式》によって呼ばれた場合を除き,blockの評価方法が11.3.3に規定しているものとは次
のように異なる。
209
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) 11.3.3 d)の前に,実引数の個数について次のチェックを行う。
1) Aを《ブロック》に渡された実引数のリストとする。NaをAの長さとする。
2) 《ブロック仮引数リスト》が《左辺》という形式であり,Naが1でない場合,このメソッドの動作は未
規定とする。
3) 《ブロック仮引数リスト》が《多重代入左辺》という形式の場合,次の手順を行う。
i)
《多重代入左辺》が,《グループ化された左辺》又は《一括左辺》という形式のいずれでもない場合,
次の手順を行う。
I)
《多重代入左辺》のもつ《多重代入左辺項目》の個数をNpとする。
II) Na < Npの場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
III) 《一括左辺》が現れず,Na > Npの場合,ArgumentErrorクラスの直接のインスタンスを例外
として発生させる。
ii) 《多重代入左辺》が《グループ化された左辺》という形式で,Naが1でない場合,このメソッドの動
作は未規定とする。
b) 11.3.3 e)において,lambdaの呼出しに関連付けられた《ブロック》の評価が《return式》又は《break式》
によって終了された場合,実行環境をEo(すなわち,保存された実行環境)に戻し,lambdaの実行
を終了する。
lambdaの呼出しの値は次のように決定する。
1) 《return式》又は《break式》が《ジャンプ実引数》をもつ場合,lambdaの呼出しの値はその《ジャンプ実
引数》の値とする。
2) そうではない場合,lambdaの呼出しの値はnilとする。
15.3.1.2.7 Kernel.local̲variables
Kernel.local̲variables
可視性:public
動作:次の条件を満たす全ての局所変数束縛の名前を含む新しく作ったArrayクラスの直接のインスタ
ンスを返す。
− その束縛の名前が《局所変数識別子》という形式である。
− このメソッドを呼び出した地点を含む局所変数のスコープ内で,その束縛を9.2で規定する手順によ
って解決できる。
このメソッドが返すArrayクラスのインスタンス内の名前は,Stringクラス又はSymbolクラスのイ
ンスタンスで表す。どちらのクラスを選ぶかは処理系定義とする。
15.3.1.2.8 Kernel.loop
Kernel.loop(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) blockが与えられている場合,blockを繰り返し呼び出す。
15.3.1.2.9 Kernel.p
Kernel.p(*args)
可視性:public
210
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
動作:
a) argsのそれぞれの要素Eに対し,添字順に,次の手順を行う。
1) Eに対しinspectメソッド(15.3.1.3.17参照)を呼び出し,Xを呼出し結果の値とする。
2) XがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
3) Object::STDOUTに対し,Xを実引数としてwriteメソッド(15.2.20.5.20参照)を呼び出す。
4) Object::STDOUTに対し,文字0x0aだけを含む新しく作ったStringクラスの直接のインスタン
スを実引数としてwriteメソッドを呼び出す。
b) 処理系定義の値を返す。
15.3.1.2.10
Kernel.print
Kernel.print(*args)
可視性:public
動作:IOクラスのprintメソッド(15.2.20.5.11参照)をObject::STDOUTに対し同じ実引数で呼び出
し,呼出し結果の値を返す。
15.3.1.2.11
Kernel.puts
Kernel.puts(*args)
可視性:public
動作:IOクラスのputsメソッド(15.2.20.5.13参照)をObject::STDOUTに対し同じ実引数で呼び出
し,呼出し結果の値を返す。
15.3.1.2.12
Kernel.raise
Kernel.raise(*args)
可視性:public
動作:
a) argsの長さが2より大きい場合,このメソッドの動作は未規定とする。
b) argsの長さが0の場合,次の手順を行う。
1) このメソッドが呼び出された地点が《rescue修飾子付き代入》の《演算子式》2,《rescue修飾文の後退
文》,又は《rescue節》の中である場合,Eを現在の例外とする(14.3参照)。
2) そうではない場合,RuntimeErrorクラスに対しnewメソッドを呼び出す。Eを呼出し結果の値
とする。
c) argsの長さが1の場合,Aをargsの唯一の要素とする。
1) AがStringクラスのインスタンスの場合,RuntimeErrorクラスに対し,Aを実引数としてnew
メソッドを呼び出す。Eを呼出し結果の値とする。
2) そうではない場合,exceptionメソッドをAに対して呼び出す。Eを呼出し結果の値とする。
3) EがExceptionクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例
外として発生させる。
d) argsの長さが2の場合,F及びSをそれぞれargsの最初及び最後の要素とする。
1) Fに対し,Sを実引数としてexceptionメソッドを呼び出す。Eを呼出し結果の値とする。
2) EがExceptionクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例
外として発生させる。
e) Eを例外として発生させる。
211
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.3.1.2.13
Kernel.require
Kernel.require(string)
可視性:public
動作:requireメソッドは,stringに対応する外部プログラムPを評価する。stringからPがどのように
決定されるかは処理系定義とする。
このメソッドが呼ばれた場合,次の処理を実行する。
a) stringがStringクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) stringに対応する外部プログラムPを探す。
c) そのような外部プログラムが存在しない場合,LoadErrorクラスの直接のインスタンスを例外とし
て発生させる。
d) Pが《プログラム》(10.1参照)という形式でない場合,SyntaxErrorクラスの直接のインスタンス
を例外として発生させる。
e) Pの評価のために一時的に,実行環境の状態を次のように変更する。
1)
self
を,現在の実行環境の
self
の一番下のオブジェクトだけを含むようにする。
2)
クラスモジュールリスト
を,Objectクラスだけを含むリストとする。
3)
省略時可視性
を,可視性privateだけを含むようにする。
4) 実行環境のその他の全ての属性は,空のスタックとする。
f)
手順e)で設定した実行環境の下で,Pを評価する。
g) 実行環境の状態を,手順e)の直前の状態に戻す。この処理は,Pの評価中に例外が発生したがそれが
処理されなかった場合であっても行う。
注記 Pの評価が元の実行環境内のオブジェクトの属性を書き換えた場合,復元された実行環境内
の値も影響を受けることに注意する必要がある。
h) 手順f)で例外が発生して処理されなかった場合を除き,trueを返す。
15.3.1.3 インスタンスメソッド
15.3.1.3.1 Kernel#==
==(other)
可視性:public
動作:
a) レシーバとotherとが同じオブジェクトの場合,trueを返す。
b) そうではない場合,falseを返す。
Objectクラスがクラス継承木の根でない場合,“==” メソッドは,Kernelモジュールに定義する代わ
りに,クラス継承木の根であるクラスに定義しなければならない。
15.3.1.3.2 Kernel#===
===(other)
可視性:public
動作:
a) レシーバとotherとが同じオブジェクトの場合,trueを返す。
b) そうではない場合,“==” メソッドを,レシーバに対し,otherを実引数として呼び出す。Vを呼出し
結果の値とする。
212
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
c) Vが真の場合,trueを返す。そうではない場合,falseを返す。
15.3.1.3.3 Kernel#ʻ
ʻ(string)
可視性:private
動作:Kernel.ʻ メソッドと同じとする(15.3.1.2.1参照)。
15.3.1.3.4 Kernel#̲̲id̲̲
̲̲id̲̲
可視性:public
動作:object̲idメソッドと同じとする(15.3.1.3.33参照)。
15.3.1.3.5 Kernel#̲̲send̲̲
̲̲send̲̲(symbol, *args, &block)
可視性:public
動作:sendメソッドと同じとする(15.3.1.3.44参照)。
Objectクラスがクラス継承木の根でない場合,“̲̲send̲̲” メソッドは,Kernelモジュールに定義
する代わりに,クラス継承木の根であるクラスに定義しなければならない。
15.3.1.3.6 Kernel#block̲given?
block̲given?
可視性:private
動作:Kernel.block̲given?メソッドと同じとする(15.3.1.2.2参照)。
15.3.1.3.7 Kernel#class
class
可視性:public
動作:レシーバのクラスを返す。
15.3.1.3.8 Kernel#clone
clone
可視性:public
動作:
a) レシーバがNilClass,TrueClass,FalseClass,Integer,Float,又はSymbolのインスタ
ンスの場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) インスタンス変数の束縛を一つももたないような,レシーバのクラスの直接のインスタンスOを作る。
c) レシーバのそれぞれのインスタンス変数束縛Bについて,同じ名前及び値をもつ変数束縛をOのイン
スタンス変数束縛の集合内に作る。
d) レシーバが特異クラスと関連付けられている場合,Eoをその特異クラスとして次の手順を行う。
1) 特異クラスEnを作る。Enの直接のスーパークラスは,Eoの直接のスーパークラスとする。
2) Eoのそれぞれの定数束縛Bv1について,同じ名前及び値をもつ変数束縛をEnの定数束縛の集合内に
作る。
3) Eoのそれぞれのクラス変数束縛Bv2について,同じ名前及び値をもつ変数束縛をEnのクラス変数束
縛の集合内に作る。
4) Eoのインスタンスメソッドのそれぞれの束縛Bmについて,同じ名前及び値をもつメソッド束縛を
213
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
Enのインスタンスメソッド束縛の集合内に作る。
5) OとEnとを関連付ける。
e) initialize̲copyメソッドをOに対しレシーバを実引数として呼び出す。
f) Oを返す。
15.3.1.3.9 Kernel#dup
dup
可視性:public
動作:
a) レシーバがNilClass,TrueClass,FalseClass,Integer,Float,又はSymbolのインスタ
ンスの場合,TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) インスタンス変数の束縛を一つももたないような,レシーバのクラスの直接のインスタンスOを作る。
c) レシーバのそれぞれのインスタンス変数束縛Bについて,Bと同じ名前及び値をもつ束縛をOのイン
スタンス変数束縛の集合内に作る。
d) initialize̲copyメソッドを,Oに対し,レシーバを実引数として呼び出す。
e) Oを返す。
15.3.1.3.10
Kernel#eql?
eql?(other)
可視性:public
動作:“==” メソッドと同じとする(15.3.1.3.1参照)。
15.3.1.3.11
Kernel#equal?
equal?(other)
可視性:public
動作:“==” メソッドと同じとする(15.3.1.3.1参照)。
Objectクラスがクラス継承木の根でない場合,equal?メソッドは,Kernelモジュールに定義する代
わりに,クラス継承木の根であるクラスに定義しなければならない。
15.3.1.3.12
Kernel#eval
eval(string)
可視性:private
動作:Kernel.evalメソッドと同じとする(15.3.1.2.3参照)。
15.3.1.3.13
Kernel#extend
extend(*module̲list)
可視性:public
動作:Rをレシーバとする。
a) module̲listの長さが0の場合,ArgumentErrorクラスの直接のインスタンスを例外として発生させ
る。
b) module̲listのそれぞれの要素Aについて,次の手順を行う。
1) AがModuleクラスのインスタンスでない場合,TypeErrorクラスの直接のインスタンスを例外
として発生させる。
2) AがClassクラスのインスタンスの場合,TypeErrorクラスの直接のインスタンスを例外として
214
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
発生させる。
3) Aに対し,Rを実引数としてextend̲objectメソッドを呼び出す。
4) Aに対し,Rを実引数としてextendedメソッドを呼び出す。
c) Rを返す。
15.3.1.3.14
Kernel#global̲variables
global̲variables
可視性:private
動作:Kernel.global̲variablesメソッドと同じとする(15.3.1.2.4参照)。
15.3.1.3.15
Kernel#hash
hash
可視性:public
動作:このメソッドはIntegerクラスのインスタンスを返す。このメソッドが同じオブジェクトに対し
て複数回呼び出された場合,このメソッドが返すIntegerクラスのインスタンスはどれも同じ値をもた
なければならない。
規格適合処理系がeql?メソッド(15.3.1.3.10参照)を上書きする場合,その処理系はeql?メソッドを
上書きしたクラス又はモジュール内に,次のような条件を満たす形でhashメソッドを上書き定義しなけ
ればならない。
あるオブジェクトOに対し,eql?メソッドを,あるオブジェクトPを実引数として呼び出した結果が
真の場合,O及びPに対しhashメソッドを呼び出した結果が同じ値をもつIntegerクラスのインスタ
ンスでなければならない。
15.3.1.3.16
Kernel#initialize̲copy
initialize̲copy(original)
可視性:private
動作:initialize̲copyメソッドは,あるオブジェクトがcloneメソッド(15.3.1.3.8参照)又はdup
メソッド(15.3.1.3.9参照)によって作られる際に呼び出す。
このメソッドが呼び出された場合,次の手順を行う。
a) レシーバのクラスとoriginalのクラスとが異なる場合,TypeErrorクラスの直接のインスタンスを例
外として発生させる。
b) 処理系定義の値を返す。
15.3.1.3.17
Kernel#inspect
inspect
可視性:public
動作:レシーバの状態を表す文字列を内容にもつ新しく作ったStringクラスの直接のインスタンスを返
す。このインスタンスの具体的な内容は処理系定義とする。
15.3.1.3.18
Kernel#instance̲eval
instance̲eval(string=nil, &block)
可視性:public
動作:
a) レシーバがIntegerクラスのインスタンス,Symbolクラスのインスタンス,nil,true,又はfalse
215
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
のいずれかである場合,このメソッドの動作は未規定とする。
b) レシーバが特異クラスと関連付けられていない場合,新しい特異クラスMを作る。
c) レシーバが特異クラスと関連付けられている場合,その特異クラスをMとする。
d) Moduleクラスのclass̲evalメソッドの手順b)から最後の手順までを実行する(15.2.2.4.15参照)。
Objectクラスがクラス継承木の根でない場合,instance̲evalメソッドは,Kernelモジュールに
定義する代わりに,クラス継承木の根であるクラスに定義しなければならない。
15.3.1.3.19
Kernel#instance̲of?
instance̲of?(module)
可視性:public
動作:Cをレシーバのクラスとする。
a) moduleがClassクラスのインスタンスでもModuleクラスのインスタンスでもない場合,
TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) module及びCが同じオブジェクトの場合,trueを返す。
c) そうではない場合,falseを返す。
15.3.1.3.20
Kernel#instance̲variable̲defined?
instance̲variable̲defined?(symbol)
可視性:public
動作:
a) symbolによって指定される名前をNとする。
b) Nが《インスタンス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラス
の直接のインスタンスを例外として発生させる。
c) レシーバのインスタンス変数束縛の集合内に名前がNである束縛が存在する場合,trueを返す。
d) そうではない場合,falseを返す。
15.3.1.3.21
Kernel#instance̲variable̲get
instance̲variable̲get(symbol)
可視性:public
動作:
a) symbolによって指定される名前をNとする。
b) Nが《インスタンス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラス
の直接のインスタンスを例外として発生させる。
c) レシーバのインスタンス変数束縛の集合内に名前がNである束縛が存在する場合,その束縛の値を返
す。
d) そうではない場合,nilを返す。
15.3.1.3.22
Kernel#instance̲variable̲set
instance̲variable̲set(symbol, obj)
可視性:public
動作:
a) symbolによって指定される名前をNとする。
b) Nが《インスタンス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラス
216
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
の直接のインスタンスを例外として発生させる。
c) レシーバのインスタンス変数束縛の集合内に名前がNである束縛が存在する場合,その束縛の値をobj
で置き換える。
d) そうではない場合,名前がNで値がobjである束縛をレシーバのインスタンス変数束縛の集合内に作
る。
e) objを返す。
15.3.1.3.23
Kernel#instance̲variables
instance̲variables
可視性:public
動作:レシーバの全てのインスタンス変数の名前を含む新しく作ったArrayクラスの直接のインスタン
スを返す。これらの名前は,Stringクラス又はSymbolクラスの直接のインスタンスとして表す。どち
らのクラスを選ぶかは処理系定義とする。
15.3.1.3.24
Kernel#is̲a?
is̲a?(module)
可視性:public
動作:
a) moduleがClassクラスのインスタンスでもModuleクラスのインスタンスでもない場合,
TypeErrorクラスの直接のインスタンスを例外として発生させる。
b) Cをレシーバのクラスとする。
c) moduleがClassクラスのインスタンスであり,次のいずれかの条件が成り立つ場合,trueを返す。
− module及びCが同じオブジェクトである。
− moduleがCのスーパークラスである。
− module及びレシーバの特異クラスが同じオブジェクトである。
d) moduleがModuleクラスのインスタンスであり,かつ,Cのスーパークラスのいずれか又はC自身が
moduleをインクルードしている場合,trueを返す。
e) そうではない場合,falseを返す。
15.3.1.3.25
Kernel#iterator?
iterator?
可視性:private
動作:Kernel.iterator?メソッドと同じとする(15.3.1.2.5参照)。
15.3.1.3.26
Kernel#kind̲of?
kind̲of?(module)
可視性:public
動作:is̲a?メソッドと同じとする(15.3.1.3.24参照)。
15.3.1.3.27
Kernel#lambda
lambda(&block)
可視性:private
動作:Kernel.lambdaメソッドと同じとする(15.3.1.2.6参照)。
15.3.1.3.28
Kernel#local̲variables
217
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
local̲variables
可視性:private
動作:Kernel.local̲variablesメソッドと同じとする(15.3.1.2.7参照)。
15.3.1.3.29
Kernel#loop
loop(&block)
可視性:private
動作:Kernel.loopメソッドと同じとする(15.3.1.2.8参照)。
15.3.1.3.30
Kernel#method̲missing
method̲missing(symbol, *args)
可視性:private
動作:
a) symbolがSymbolクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
b) symbolがSymbolクラスのインスタンスである場合,名前属性がsymbolで,実引数属性がargsであ
るNoMethodErrorクラスの直接のインスタンスを例外として発生させる。このメソッドが《局所変
数識別子》をメソッド呼出しとして評価している際に13.3.3 e)で呼び出された場合,規格適合処理系は
NoMethodErrorの代わりにsymbolを名前属性にもつNameErrorクラスの直接のインスタンスを例
外として発生させてもよい。
Objectクラスがクラス継承木の根でない場合,method̲missingメソッドは,Kernelモジュールに
定義する代わりに,クラス継承木の根であるクラスに定義しなければならない。
15.3.1.3.31
Kernel#methods
methods(all=true)
可視性:public
動作:Cをレシーバのクラスとする。
a) allが真の場合,Cに対しinstance̲methodsメソッド(15.2.2.4.33参照)を呼び出し,呼出し結果
の値を返す。
b) allが偽の場合,レシーバに対しfalseを実引数としてsingleton̲methodsメソッド(15.3.1.3.45参
照)を呼び出し,呼出し結果の値を返す。
15.3.1.3.32
Kernel#nil?
nil?
可視性:public
動作:
a) レシーバがnilの場合,trueを返す。
b) そうではない場合,falseを返す。
15.3.1.3.33
Kernel#object̲id
object̲id
可視性:public
動作:このメソッドはIntegerクラスのインスタンスを返す。このメソッドが同じオブジェクトに対し
て複数回呼び出された場合,このメソッドが返すIntegerクラスのインスタンスはどれも同じ値をもた
なければならない。また,このメソッドが異なる二つのオブジェクトに対し呼び出された場合,このメソ
218
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ッドが返すIntegerクラスのインスタンスは異なる値をもたなければならない。
15.3.1.3.34
Kernel#p
p(*args)
可視性:private
動作:Kernel.pメソッドと同じとする(15.3.1.2.9参照)。
15.3.1.3.35
Kernel#print
print(*args)
可視性:private
動作:Kernel.printメソッドと同じとする(15.3.1.2.10参照)。
15.3.1.3.36
Kernel#private̲methods
private̲methods(all=true)
可視性:public
動作:
a) MVをprivateとする。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバが特異クラスと結び付けられている場合,Cをその特異クラスとする。
d) IをCのインスタンスメソッド束縛の集合とする。
Iのそれぞれの束縛Bについて,N及びVをそれぞれBの名前及び値とし,次の手順を行う。
1) Vがundefであるか,Vの可視性がMVでない場合,次の二つの手順は行わない。
2) 内容がNである新しく作ったStringクラスの直接のインスタンス又は名前がNであるSymbol
クラスの直接のインスタンスのいずれかを,Sとする。Sの値としてどちらを選ぶかは処理系定義と
する。
3) SをAの末尾に追加する。ただし,SがSymbolクラスのインスタンスでありAが同じ名前のSymbol
クラスのインスタンスを要素にもつ場合,又はSがStringクラスのインスタンスでありAが同じ
内容のStringクラスのインスタンスを要素にもつ場合は追加しない。
e) CのインクルードモジュールリストのそれぞれのモジュールMについて手順d)を実行する。ここで,
この手順の中のCはMであるとする。
f) Cを新たにレシーバのクラスとし,手順d)を実行する。
g) allが真の場合,次の手順を行う。
1) 手順e)を実行する。
2) Cが直接のスーパークラスをもたない場合,Aを返す。
3) Cを新たにCの直接のスーパークラスとする。
4) 手順d)を実行し,手順g) 1)から繰り返す。
h) Aを返す。
15.3.1.3.37
Kernel#protected̲methods
protected̲methods(all=true)
可視性:public
動作:private̲methodsメソッドと同じとする(15.3.1.3.36参照)。ただし,15.3.1.3.36 a)において,MV
はprotectedとする。
219
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
15.3.1.3.38
Kernel#public̲methods
public̲methods(all=true)
可視性:public
動作:private̲methodsメソッドと同じとする(15.3.1.3.36参照)。ただし,15.3.1.3.36 a)において,MV
はpublicとする。
15.3.1.3.39
Kernel#puts
puts(*args)
可視性:private
動作:Kernel.putsメソッドと同じとする(15.3.1.2.11参照)。
15.3.1.3.40
Kernel#raise
raise(*args)
可視性:private
動作:Kernel.raiseメソッドと同じとする(15.3.1.2.12参照)。
15.3.1.3.41
Kernel#remove̲instance̲variable
remove̲instance̲variable(symbol)
可視性:private
動作:
a) symbolによって指定される名前をNとする。
b) Nが《インスタンス変数識別子》という形式でない場合,symbolを名前属性にもつNameErrorクラス
の直接のインスタンスを例外として発生させる。
c) レシーバのインスタンス変数束縛の集合内に名前がNである束縛が存在する場合,Vをその束縛の値
とする。
1) その束縛をレシーバのインスタンス変数束縛の集合から取り除く。
2) Vを返す。
d) そうではない場合,symbolを名前属性にもつNameErrorクラスの直接のインスタンスを例外として
発生させる。
15.3.1.3.42
Kernel#require
require(*args)
可視性:private
動作:Kernel.requireメソッドと同じとする(15.3.1.2.13参照)。
15.3.1.3.43
Kernel#respond̲to?
respond̲to?(symbol, include̲private=false)
可視性:public
動作:
a) symbolによって指定される名前をNとする。
b) 13.3.4で規定したように,レシーバを起点として名前がNであるインスタンスメソッド束縛を探す。
c) 束縛が見つかった場合,Vをその束縛の値とする。
1) Vがundefの場合,falseを返す。
2) Vの可視性がprivateの場合,次の手順を行う。
220
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
i)
include̲privateが真の場合,trueを返す。
ii) そうではない場合,falseを返す。
3) そうではない場合,trueを返す。
d) そうではない場合,falseを返す。
15.3.1.3.44
Kernel#send
send(symbol, *args, &block)
可視性:public
動作:
a) symbolによって指定される名前をNとする。
b) レシーバに対し,argsを実引数リストとし,blockが渡されていればそれを《ブロック》として,名前が
Nであるメソッドを呼び出す。
c) 呼出し結果の値を返す。
15.3.1.3.45
Kernel#singleton̲methods
singleton̲methods(all=true)
可視性:public
動作:Eをレシーバの特異クラスとする。
a) Arrayクラスの空の直接のインスタンスAを作る。
b) Eのインスタンスメソッドの束縛の集合をIとする。
Iのそれぞれの束縛Bに対し,N及びVをそれぞれBの名前及び値として,次の手順を実行する。
1) Vがundefであるか,Vの可視性がprivateの場合,次の二つの手順[2)及び3)]は行わない。
2) 内容がNである新しく作ったStringクラスの直接のインスタンス又は名前がNであるSymbol
クラスの直接のインスタンスのいずれかを,Sとする。Sの値としてどちらを選ぶかは処理系定義と
する。
3) SをAの末尾に追加する。ただし,SがSymbolクラスのインスタンスでありAが同じ名前のSymbol
クラスのインスタンスを要素にもつ場合,又はSがStringクラスのインスタンスでありAが同じ
内容のStringクラスのインスタンスを要素にもつ場合は追加しない。
c) allが真の場合,EのインクルードモジュールリストのそれぞれのモジュールMについて手順b)を実
行する。ここで,この手順の中のEはMであるとする。
d) Aを返す。
15.3.1.3.46
Kernel#to̲s
to̲s
可視性:public
動作:レシーバの文字列表現を内容にもつStringクラスの直接のインスタンスを作って返す。このイン
スタンスの具体的な内容は処理系定義とする。
15.3.2 Enumerable
15.3.2.1 概要
Enumerableモジュールは,eachメソッドを用いてあるオブジェクトの要素に対して繰り返すような
メソッドを提供する。
次のEnumerableモジュールのメソッドの説明では,要素という表現は,eachメソッドが《ブロック》
221
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
呼出し時に実引数として渡す値を指す。
15.3.2.2 インスタンスメソッド
15.3.2.2.1 Enumerable#all?
all?(&block)
可視性:public
動作:
a) レシーバに対し,eachメソッドを呼び出す。
b) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) blockが与えられている場合,blockをXを実引数として呼び出す。
呼出し結果が偽の場合,falseを返す。
2) blockが与えられず,Xが偽の場合,falseを返す。
c) trueを返す。
15.3.2.2.2 Enumerable#any?
any?(&block)
可視性:public
動作:
a) レシーバに対し,eachメソッドを呼び出す。
b) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) blockが与えられている場合,blockをXを実引数として呼び出す。
呼出し結果が真の場合,trueを返す。
2) blockが与えられず,Xが真の場合,trueを返す。
c) falseを返す。
15.3.2.2.3 Enumerable#collect
collect(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバに対し,eachメソッドを呼び出す。
d) eachメソッドが渡すそれぞれの要素Xについて,Xを実引数としてblockを呼び出し,呼出し結果の
値をAの末尾に追加する。
e) Aを返す。
15.3.2.2.4 Enumerable#detect
detect(ifnone=nil, &block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) レシーバに対し,eachメソッドを呼び出す。
c) eachメソッドが渡すそれぞれの要素Xについて,Xを実引数としてblockを呼び出す。呼出し結果の
222
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
値が真の場合,Xを返す。
d) ifnoneを返す。
15.3.2.2.5 Enumerable#each̲with̲index
each̲with̲index(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) iを0とする。
c) レシーバに対し,eachメソッドを呼び出す。
d) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) X及びiを実引数としてblockを呼び出す。
2) iを1増加させる。
e) レシーバを返す。
15.3.2.2.6 Enumerable#entries
entries
可視性:public
動作:
a) Arrayクラスの空の直接のインスタンスAを作る。
b) レシーバに対し,eachメソッドを呼び出す。
c) eachメソッドが渡すそれぞれの要素Xについて,XをAの末尾に追加する。
d) Aを返す。
15.3.2.2.7 Enumerable#find
find(ifnone=nil, &block)
可視性:public
動作:detectメソッドと同じとする(15.3.2.2.4参照)。
15.3.2.2.8 Enumerable#find̲all
find̲all(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバに対し,eachメソッドを呼び出す。
d) eachメソッドが渡すそれぞれの要素Xについて,Xを実引数としてblockを呼び出す。呼出し結果の
値が真の場合,XをAの末尾に追加する。
e) Aを返す。
15.3.2.2.9 Enumerable#grep
grep(pattern, &block)
可視性:public
動作:
223
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
a) Arrayクラスの空の直接のインスタンスAを作る。
b) レシーバに対し,eachメソッドを呼び出す。
c) eachメソッドが渡すそれぞれの要素Xについて,patternに対し,Xを実引数として “===” メソッド
を呼び出す。
呼出し結果が真の場合,次の手順を行う。
1) blockが与えられている場合,Xを実引数としてblockを呼び出し,その結果の値をAの末尾に追加
する。
2) そうではない場合,XをAの末尾に追加する。
d) Aを返す。
15.3.2.2.10
Enumerable#include?
include?(obj)
可視性:public
動作:
a) レシーバに対し,eachメソッドを呼び出す。
b) eachメソッドが渡すそれぞれの要素Xについて,Xに対し,objを実引数として “==” メソッドを呼
び出す。呼出し結果の値が真の場合,trueを返す。
c) falseを返す。
15.3.2.2.11
Enumerable#inject
inject(*args, &block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) argsの長さが2の場合,このメソッドの動作は未規定とする。argsの長さが2より大きい場合,
ArgumentErrorクラスの直接のインスタンスを例外として発生させる。
c) レシーバに対し,eachメソッドを呼び出す。eachメソッドが要素を一つも渡さなかった場合,nil
を返す。
d) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) Xが最初の要素であり,argsの長さが0の場合,VをXとする。
2) Xが最初の要素で,argsの長さが1の場合,argsの唯一の要素及びXを実引数としてblockを呼び
出す。Vを呼出し結果の値とする。
3) Xが最初の要素でない場合,V及びXを実引数としてblockを呼び出す。Vを新たに呼出し結果の値
とする。
e) Vを返す。
15.3.2.2.12
Enumerable#map
map(&block)
可視性:public
動作:collectメソッドと同じとする(15.3.2.2.3参照)。
15.3.2.2.13
Enumerable#max
max(&block)
224
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
可視性:public
動作:
a) レシーバに対し,eachメソッドを呼び出す。
b) eachメソッドが要素を一つも渡さなかった場合,nilを返す。
c) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) Xが最初の要素の場合,VをXとする。
2) そうではない場合,次の手順を行う。
i)
blockが与えられている場合,次の手順を行う。
I) X及びVを実引数としてblockを呼び出す。Dを呼出し結果の値とする。
II) DがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
III) Dの値が0より大きい場合,Vを新たにXとする。
ii) blockが与えられていない場合,次の手順を行う。
I) X及びVを実引数として “<=>” メソッドを呼び出す。Dを呼出し結果の値とする。
II) DがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
III) Dの値が0より大きい場合,Vを新たにXとする。
d) Vを返す。
15.3.2.2.14
Enumerable#member?
member?(obj)
可視性:public
動作:include?メソッドと同じとする(15.3.2.2.10参照)。
15.3.2.2.15
Enumerable#min
min(&block)
可視性:public
動作:
a) レシーバに対し,eachメソッドを呼び出す。
b) eachメソッドが要素を一つも渡さなかった場合,nilを返す。
c) eachメソッドが渡すそれぞれの要素Xについて,次の手順を行う。
1) Xが最初の要素の場合,VをXとする。
2) そうではない場合,次の手順を行う。
i)
blockが与えられている場合,次の手順を行う。
I) X及びVを実引数としてblockを呼び出す。Dを呼出し結果の値とする。
II) DがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
III) Dの値が0より小さい場合,Vを新たにXとする。
ii) blockが与えられていない場合,次の手順を行う。
I) X及びVを実引数として “<=>” メソッドを呼び出す。Dを呼出し結果の値とする。
II) DがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
III) Dの値が0より小さい場合,Vを新たにXとする。
d) Vを返す。
15.3.2.2.16
Enumerable#partition
225
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
partition(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスT及びFを作る。
c) レシーバに対し,eachメソッドを呼び出す。
d) eachメソッドが渡すそれぞれの要素Xについて,Xを実引数としてblockを呼び出す。
呼出し結果が真の場合,XをTの末尾に追加する。呼出し結果が偽の場合,XをFの末尾に追加する。
e) T及びFだけを,この順で要素としてもつArrayクラスのインスタンスを作って返す。
15.3.2.2.17
Enumerable#reject
reject(&block)
可視性:public
動作:
a) blockが与えられていない場合,このメソッドの動作は未規定とする。
b) Arrayクラスの空の直接のインスタンスAを作る。
c) レシーバに対し,eachメソッドを呼び出す。
d) eachメソッドが渡すそれぞれの要素Xについて,Xを実引数としてblockを呼び出す。呼出し結果の
値が偽の場合,XをAの末尾に追加する。
e) Aを返す。
15.3.2.2.18
Enumerable#select
select(&block)
可視性:public
動作:find̲allメソッドと同じとする(15.3.2.2.8参照)。
15.3.2.2.19
Enumerable#sort
sort(&block)
可視性:public
動作:
a) Arrayクラスの空の直接のインスタンスAを作る。
b) レシーバに対し,eachメソッドを呼び出す。
c) eachメソッドが渡す全ての要素をAに追加する。Aのどの二つの要素Ei及びEjも,次の条件を満た
さなければならない。
1) Ei及びEjの添字をそれぞれ,i及びjとする。
2) blockが与えられている場合,次の手順を行う。
i)
blockを,Ei及びEjを実引数として呼び出したとする。
ii) 呼出し結果がIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
iii) 呼出し結果が,値が0より大きいIntegerクラスのインスタンスの場合,jはiより大きくなけ
ればならない。
iv) 呼出し結果が,値が0未満のIntegerクラスのインスタンスの場合,iはjより大きくなければ
ならない。
226
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
3) blockが与えられていない場合,次の手順を行う。
i)
“<=>” メソッドを,Eiに対し,Ejを実引数として呼び出したとする。
ii) 呼出し結果がIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
iii) 呼出し結果が,値が0より大きいIntegerクラスのインスタンスの場合,jはiより大きくなけ
ればならない。
iv) 呼出し結果が,値が0未満のIntegerクラスのインスタンスの場合,iはjより大きくなければ
ならない。
d) Aを返す。
15.3.2.2.20
Enumerable#to̲a
to̲a
可視性:public
動作:entriesメソッドと同じとする(15.3.2.2.6参照)。
15.3.3 Comparable
15.3.3.1 概要
Comparableモジュールは,“<=>” メソッドを用いてレシーバと実引数とを比較するメソッド群を提供
する。
15.3.3.2 インスタンスメソッド
15.3.3.2.1 Comparable#<
<(other)
可視性:public
動作:
a) レシーバに対し,otherを実引数として “<=>” メソッドを呼び出す。Iを呼出し結果の値とする。
b) IがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Iの値が0未満の場合,trueを返す。そうではない場合,falseを返す。
15.3.3.2.2 Comparable#<=
<=(other)
可視性:public
動作:
a) レシーバに対し,otherを実引数として “<=>” メソッドを呼び出す。Iを呼出し結果の値とする。
b) IがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Iの値が0以下の場合,trueを返す。そうではない場合,falseを返す。
15.3.3.2.3 Comparable#>
>(other)
可視性:public
動作:
a) レシーバに対し,otherを実引数として “<=>” メソッドを呼び出す。Iを呼出し結果の値とする。
b) IがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Iの値が0より大きい場合,trueを返す。そうではない場合,falseを返す。
15.3.3.2.4 Comparable#>=
227
X 3017:2013 (ISO/IEC 30170:2012)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
>=(other)
可視性:public
動作:
a) レシーバに対し,otherを実引数として “<=>” メソッドを呼び出す。Iを呼出し結果の値とする。
b) IがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Iの値が0以上の場合,trueを返す。そうではない場合,falseを返す。
15.3.3.2.5 Comparable#==
==(other)
可視性:public
動作:
a) レシーバに対し,otherを実引数として “<=>” メソッドを呼び出す。Iを呼出し結果の値とする。
b) IがIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
c) Iの値が0の場合,trueを返す。そうではない場合,falseを返す。
15.3.3.2.6 Comparable#between?
between?(left, right)
可視性:public
動作:
a) レシーバに対し,leftを実引数として “<=>” メソッドを呼び出す。I1を呼出し結果の値とする。
1) I1がIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) I1の値が0未満の場合,falseを返す。
b) レシーバに対し,rightを実引数として “<=>” メソッドを呼び出す。I2を呼出し結果の値とする。
1) I2がIntegerクラスのインスタンスでない場合,このメソッドの動作は未規定とする。
2) I2の値が0より大きい場合,falseを返す。そうではない場合,trueを返す。