diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec | 1459 |
1 files changed, 877 insertions, 582 deletions
@@ -42,10 +42,10 @@ Rubyのオブジェクト指向機能について学べば, より強力なこともできるように イルをリンクできるし, そうでなくてもRubyを再コンパイルして組み込みクラ スを追加するのは容易である(Perlなどよりもはるかに容易である). -* Rubyの基本 +* Rubyの文法 -Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは -さほど難しくないだろう. +ここではRuby言語の文法を解説する. Rubyの基本的な部分は非常に小さく, 文 +法に例外が少ないので身につけるのはさほど難しくないだろう. ** コメント @@ -54,214 +54,193 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは ** 区切り記号 -空白文字(タブとスペース)および改行(\n)が区切り記号となる. ただし, +空白文字(タブとスペース)および改行(\n)が区切り記号となる. 更に +改行は a + b -のように行が式(文)の途中で終り, 次の行に続くことが明白な場合以外は改行 -は文の区切りとして認識される. - -** 識別子 - -アルファベットか`_'で始まり, アルファベット, 数字, `_'の任意の並びは識 -別子である. 識別子の長さに制限はない. +のように行が式(文)の途中で終り, 次の行に続くことが明白な場合以外は文の +区切りとしても認識される. ** 予約語 予約語は以下の通りである - break elsif module self when - case end nil super while - class ensure protect then yield - continue for redo undef __END__ - def if resque unless __FILE__ - do in retry until __LINE__ - else include return using + break end module self while + case ensure nil super yield + class fail protect then __END__ + continue for redo undef __FILE__ + def if resque unless __LINE__ + else in retry until + elsif include return when 予約語はクラス名, メソッド名, 変数名などに用いることはできない. -** グルーピング - -式は括弧によってグルーピングすることができる. 更に括弧内には式の並びも -書ける. 式の並びを記述する場合, 式と式の区切りには改行か ';' を用いる. -式の並びの値は最後に評価した式の値である. つまり - - (式; 式; ...) - -の値は最後に評価した式の値になる. - -** リテラル - -以下のリテラルがある これらは式である. +** 式 - 文字列リテラル +Rubyプログラムを構成する要素は式と文である. まず, 式から解説する. - "..." # バックスラッシュの解釈と変数展開あり - '...' # バックスラッシュの解釈なし(\\と\'は解釈する) +*** リテラル - バックスラッシュ記法 +プログラム中に直接記述できるオブジェクトをリテラルと呼ぶ. Rubyのリテラ +ルには文字列, 正規表現, 数値というリテラルがある. - \t タブ(0x09) - \n 改行文字(0x0a) - \r 復帰文字(0x0d) - \f 改ページ文字(0x0c) - \b バックスペース(0x08) - \a ベル(0x07) - \e エスケープ(0x1b) - \# 文字`#'そのもの - \nnn 8進数表記(nは0-7) - \xnn 16進数表記(nは0-9,a-f) - \^c コントロール文字(cはASCII文字) - \C-c コントロール文字(同上) - \M-c メタ文字(c|0x80) +**** 文字列リテラル - 正規表現リテラル + "..." # バックスラッシュの解釈と変数展開あり + '...' # バックスラッシュの解釈なし(\\と\'は解釈する) - /.../ +**** バックスラッシュ記法 - 正規表現 + \t タブ(0x09) + \n 改行文字(0x0a) + \r 復帰文字(0x0d) + \f 改ページ文字(0x0c) + \b バックスペース(0x08) + \a ベル(0x07) + \e エスケープ(0x1b) + \# 文字`#'そのもの + \nnn 8進数表記(nは0-7) + \xnn 16進数表記(nは0-9,a-f) + \^c コントロール文字(cはASCII文字) + \C-c コントロール文字(同上) + \M-c メタ文字(c|0x80) - ^ 行頭 - $ 行末 - . 任意の1文字 - \w 英数字. [0-9A-Za-z_]と同じ - \W 非英数字 - \s 空白文字. [ \t\n\r\f]と同じ - \S 非空白文字 - \d 数字. [0-9] と同じ - \D 非数字 - \b 語境界文字(文字クラス外) - \B 非語境界文字 - \b 後退(0x08)(文字クラス内) - [ ] 文字クラス指定 - * 直前の表現の0回以上の繰り返し - + 直前の表現の1回以上の繰り返し - {m,n} m回からn回の繰り返し - ? 0または1回 - | 選択 - ( ) 正規表現をまとめる - - その他に文字列と同じバックスラッシュ記法も有効である. - - 数値リテラル - - 123 整数 - -123 整数(符合つき数) - 1_234 整数(10進数は`_'を含むことができる) - 123.45 浮動小数点数 - 1.2e-3 浮動小数点数 - 0xffff 16進整数 - 0377 8進整数 - ?a 文字`a'のコード(97) - ?\C-a コントロールaのコード(1) - ?\M-a メタaのコード(225) - ?\M-\C-a メタ-コントロールaのコード(129) - - ?表現では全てのバックスラッシュ記法が有効である. - -*** 変数展開 +**** 変数展開 ダブルクォート(`"')で囲まれた文字列と正規表現の中では `#{変数名}'とい う形式で変数の内容を展開することができる. 変数が変数記号(`$',`@',`%') を持つ場合には`#変数名'という形式でも展開できる. 文字`#'に続く文字が -`{'でないか, 変数でなければ, そのまま`#'として解釈される. - -** コマンドの出力 - -``で囲まれた文字列は, ダブルクォートと同様に展開された後, シェルと同じ -ようにコマンドとして実行され, その実行結果が文字列として与えられる. コ -マンドは評価されるたびに実行される. +`{',`$',`@',`%'でなければ, そのまま`#'として解釈される. -** 配列式 +**** 正規表現リテラル -配列式は以下の形式である. + /.../ - [ 式, ... ] + ^ 行頭 + $ 行末 + . 任意の1文字 + \w 英数字. [0-9A-Za-z_]と同じ + \W 非英数字 + \s 空白文字. [ \t\n\r\f]と同じ + \S 非空白文字 + \d 数字. [0-9] と同じ + \D 非数字 + \b 語境界文字(文字クラス外) + \B 非語境界文字 + \b 後退(0x08)(文字クラス内) + [ ] 文字クラス指定 + * 直前の表現の0回以上の繰り返し + + 直前の表現の1回以上の繰り返し + {m,n} m回からn回の繰り返し + ? 0または1回 + | 選択 + ( ) 正規表現をまとめる -それぞれの式を評価した結果を含む配列を返す. 要素が0の配列を生成するた -めには空の配列式 +その他に文字列と同じバックスラッシュ記法も有効である. - [] +**** ワイルドカードリテラル -を用いる. + <...> -** 連想配列式 + * 任意の文字列(空文字列を含む)と一致 + ? 任意の1文字と一致 + [ ] []内のいずれか1文字と一致 + {..} {}内のいずれかの文字列と一致 -連想配列とは任意のオブジェクトをキー(添字)として持てる配列である. Ruby -では連想配列はSmalltalkの用語を借りてDict(辞書)とも呼ばれる. 詳細はク -ラスDictの項を参照されたい. 連想配列を生成する連想配列式は以下の形式で -ある. +**** 数値リテラル - { 式=>式, ... } + 123 整数 + -123 整数(符合つき数) + 1_234 整数(10進数は`_'を含むことができる) + 123.45 浮動小数点数 + 1.2e-3 浮動小数点数 + 0xffff 16進整数 + 0377 8進整数 + ?a 文字`a'のコード(97) + ?\C-a コントロールaのコード(1) + ?\M-a メタaのコード(225) + ?\M-\C-a メタ-コントロールaのコード(129) -それぞれの式を評価した結果をキーと値とする連想配列オブジェクトを返す. -要素が0の連想配列を生成するためには空の連想配列式 + \シンボル 識別子/変数名と一対一対応する整数. applyなどでメソッ + ドを指定するのに使う. - {} +?表現では全てのバックスラッシュ記法が有効である. -を用いる. +*** コマンドの出力 -** 変数参照 +Rubyではshのようにコマンドの実行結果を文字列リテラルのように使うことが +できる. ``で囲まれた文字列は, ダブルクォートと同様にバックスラッシュ記 +法の解釈と変数展開が行なわれた後, コマンドとして実行され, その実行結果 +が文字列として与えられる. コマンドは評価されるたびに実行される. -変数には4種類あって, その種類は変数名の最初の一文字で決定される. 代入 -されていない変数を参照した時の値はnilである. +*** 変数参照 - クラス変数(定数) +Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, +その種類は変数名の最初の一文字で決定される. 通常の変数の2文字目以降は +英数時または`_'であるが, システム変数の一部は「`$'+1文字の記号」という +変数がある. 変数名の長さに関して特別な制限はない. - `%'で始まる変数はクラス変数であり, そのクラスと全てのサブクラスの - インスタンスから参照できる. この変数への代入はトップレベル, すなわ - ちメソッドが定義できるレベルでのみ可能である. この変数はクラス間で - 値が共有され, 一度代入するとメソッドからは値を変更することができな - いので,定数として用いられる. +変数のスコープに関わらず, 初期化されていない変数を参照した時の値はnil +である. - インスタンス変数 +**** グローバル変数 - `@'で始まる変数はインスタンス変数であり, そのクラスまたはサブクラ - スのメソッドから参照できる. その寿命はオブジェクトの寿命に等しい. +`$'で始まる変数のスコープはグローバルであり, プログラムのどこからでも +参照できる. その寿命はプログラムの寿命と等しい. - グローバル変数 +**** インスタンス変数 - `$'で始まる変数のスコープはグローバルであり, その寿命はプログラム - の寿命と等しい. +`@'で始まる変数はインスタンス変数であり, そのクラスまたはサブクラスの +メソッドから参照できる. スコープはメソッド内であり, その寿命はオブジェ +クトの寿命に等しい. - クラス名/モジュール名/ローカル変数 +**** クラス名/モジュール名/ローカル変数 - アルファベットまたは`_'で始まる変数は識別子とも呼ばれ, ローカ - ル変数, クラス名またはモジュール名である. +アルファベットまたは`_'で始まる変数は識別子とも呼ばれ, ローカル変数, +クラス名またはモジュール名である. - 初期状態では識別子はクラス/モジュール名とみなされるが(該当するクラ - スが存在しない場合の値はnil), 代入式の左辺に現れた識別子は,そのス - コープ内ではローカル変数として見なされ, 同名のクラスやモジュールは - 隠される. この意味で識別子への代入は宣言としての働きも持つ. +初期状態では識別子はクラス/モジュール名とみなされるが(該当するクラスが +存在しない場合の値はnil), 代入式の左辺に現れた識別子は,そのスコープ内 +ではローカル変数として見なされ, 同名のクラスやモジュールは隠される. こ +の意味で識別子への代入は宣言としての働きも持つ. Array # 配列クラス Array Array = 15 # 代入. 以後Arrayはローカル変数 - print(Array, "\n") # `15'が出力される + print Array, "\n" # `15'が出力される - この宣言はコンパイル時に解釈されるため, 識別子への代入式が実際に実 - 行されても, されなくても, 以降のスコープ内ではその識別子はローカル - 変数とみなされる. +この宣言としての代入の解釈はコンパイル時に行なわれるため, 識別子への代 +入式が実際に実行されてもされなくても, 以降のスコープ内ではその識別子は +ローカル変数とみなされる. Array # 配列クラス Array if %FALSE Array = 15 # このコードは実行されないが, # 以降Arrayはローカル変数とみなされる. end - print(Array, "\n") # `nil'が出力される + print Array, "\n" # `nil'が出力される + +このルールは一見複雑だが, クラス/モジュール名とローカル変数名が重複し +ない限り, 未初期化のローカル変数の値はnilであると考えても差し支えはな +い. Rubyの組み込みクラスは大文字のアルファベットで始まる名前がついて +おり, ユーザもクラス/モジュール名には大文字で始まる識別子を, ローカル +変数名には小文字または`_'で始まる識別子を使うことを強く推奨する. - このルールは一見複雑だが, クラス/モジュール名とローカル変数名が重 - 複しない限り, 未初期化のローカル変数の値はnilであると考えても差し - 支えはない. +ローカル変数のスコープも寿命もそのブロックの終りまで(トップレベルのロー +カル変数はプログラムの終了まで)である. - Rubyの組み込みクラスは大文字のアルファベットで始まる名前がついてお - り, ユーザもクラス/モジュール名には大文字で始まる識別子を, ローカ - ル変数名には小文字または`_'で始まる識別子を使うことを強く推奨する. +**** クラス変数(定数) - ローカル変数の寿命はそのメソッドが終了するまで(トップレベルのロー - カル変数はプログラムの終了まで)である. +`%'で始まる変数はクラス変数であり, そのクラスと全てのサブクラスのイン +スタンスから参照できる. この変数への代入はトップレベル, すなわちメソッ +ドが定義できるレベルでのみ可能である. この変数はクラス間で値が共有され, +一度代入するとメソッドからは値を変更することができないので,定数として +用いられる. -更に疑似変数と呼ばれる特殊な変数が4つある. +**** 疑似変数 + +通常の変数以外に疑似変数と呼ばれる特殊な変数が4つある. self | 現在のメソッドの実行主体 nil | Nilクラスの唯一のインスタンス(偽を表す) @@ -271,52 +250,99 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは これらの疑似変数は代入によってその値を変更することはできない. これらの 変数への代入は例外を発生させる. -** メッセージ式 +*** メッセージ式 オブジェクトにメッセージを送る基本的な構文がメッセージ式であり, その基 本形式は以下の通りである. - 式1.メソッド名(引数...) + 式1 '.' メソッド名 '(' 引数1... [',' '*' 引数n ]')' - 式1を評価して得られるオブジェクトの, 識別子で指定されるメソッ - ドを呼び出す. 一番最後の引数が'*'に続く(単一の)式である場合, - その式を評価した結果(配列である必要がある)を展開して, 引数とし - て追加する. +式1を評価して得られるオブジェクトの, 識別子で指定されるメソッドを呼び +出す. 一番最後の引数が'*'に続く(単一の)式である場合, その式を評価した +結果(配列である必要がある)を展開して, 引数として追加する. - 引数が一つもない時には括弧を省略できる. +引数が一つもない時には括弧を省略できる. メソッド名としては任意の識別子を用いることができる. 変数名とは識別子の 名前空間が違うので重複しても構わない. -** 関数式 - メッセージ式で, レシーバがselfの場合, レシーバを省略して通常のプログラ ミング言語における関数のような形式でメソッドを呼び出すことができる. こ の場合引数が1つもない時でも括弧の省略はできない. 関数形式では`@'で始まる名前を持つメソッドを呼び出すことができる. `@'で 始まるメソッドは関数形式でしか呼び出すことができないため, 該当するクラ -スまたは, そのサブクラスからしか呼ばれないので, プライベートメソッドと -呼ばれる. プライベートメソッドはC++におけるprotected member functionに -該当する. +スまたはそのサブクラスからしか呼ばれないので, プライベートメソッドと呼 +ばれる. プライベートメソッドはC++におけるprotected member functionに該 +当する. -** スーパークラスのメソッド呼び出し +*** スーパークラスのメソッド呼び出し メッセージ式の特殊なケースとしてスーパークラスのメソッドの呼び出しがあ る. この形式はメソッドを再定義した時にスーパークラスの定義を利用するた めに使う. - super + super + +現在のメソッドに与えられた引数のままスーパクラスの同名のメソッドを呼び +出す. + + super'(' 引数... ')' + +引数とともにスーパークラスの同名のメソッドを呼び出す. 一番最後の引数が +`*'に続く場合は通常のメソッド呼び出しと同様に渡される. - 現在のメソッドに与えられた引数のままスーパクラスの同名のメソッ - ドを呼び出す. +*** 配列式/連想配列式 - super(引数...) +配列のオブジェクトを生成する式の形式は以下の形式である. - 引数とともにスーパークラスの同名のメソッドを呼び出す. 一番最後 - の引数が`*'に続く場合は通常のメソッド呼び出しと同様に渡される. + '[' 式, ... ']' -** 演算式 +それぞれの式を評価した結果を含む配列を返す. 要素数が0の空配列を生成す +るためには空の配列式 + + '[' ']' + +を用いる. + +** 連想配列式 + +連想配列とは任意のオブジェクトをキー(添字)として持てる配列である. Ruby +では連想配列はSmalltalkの用語を借りてDict(辞書)とも呼ばれる. 詳細はク +ラスDictの項を参照されたい. 連想配列を生成する連想配列式は以下の形式で +ある. + + '{' 式 '=>' 式... '}' + +それぞれの式を評価した結果をキーと値とする連想配列オブジェクトを返す. +要素数が0の連想配列を生成するためには空の連想配列式 + + '{' '}' + +を用いる. + +*** 配列参照, 配列代入 + +配列(連想配列を含む)の要素の参照は以下の形式で行なう. + + 式1 '[' 式2... ']' + +この形式は内部的に, 式1に"[]"というメッセージを送ると解釈される. この +動作を疑似的なコードで記述すれば以下のようになる. + + 式1"[]="(式2) + +一方, 配列要素の代入は + + 式1 '[' 式2... ']' '=' 式n + +という形式で行なわれ, + + 式1."[]="(式2..) + +という形式として解釈される. + +*** 演算子形式 プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形 式をとる. Rubyには以下にあげる演算子がある. 上のものほど結合順位が強く, @@ -335,68 +361,33 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは || .. ... :: - =(代入) 自己代入(+=, -=, ..) - 弱 yield + 弱 =(代入) 自己代入(+=, -=, ..) ほとんどの演算式にはメソッド呼び出しとして解釈される(クラス毎に再定義 できる)が, 一部再定義できない特殊なものがある. 再定義できない特殊演算 子は &&(論理積), ||(論理和), =(代入), ...(範囲指定), - yield(ブロック呼び出し) -の5つである. +の4つである. 上であげた特殊演算子以外の演算子形式はメソッド呼び出しと見なされる. 単項演算子(+, -, !, ~)は - 式1."演算子"() - -という形式に, 2項演算子は + 式1."演算子"() - 式1."演算子"(式2) +という形式に, それ以外の2項演算子は -に解釈される. 多項演算子(配列の参照の[])は演算子形式の特別な形として + 式1."演算子"(式2) - recv[arg..] - -が, - - recv."[]"(arg..) - -と解釈される. 配列要素への代入も同様に - - recv[arg0..] = argn - -が, - - recv."[]="(arg0.., argn) - -と解釈される. - -** 条件式 - -if, unless, while, untilの条件判断部の式, および特殊演算子`&&', `||', -`...'の両辺の式, 通常演算子`!'の右辺は条件式と呼ばれる. 条件式では文字 -列と正規表現リテラルは式「$_=~リテラル」の省略であるとみなされる. 更に -演算子`...'の両辺では整数定数が「$.==定数」の省略と解釈される. - -注意: 演算子`!'は特殊演算子ではないので, 再定義を行なう場合に気をつけ -ること. - - ! 文字列リテラル - ! 正規表現リテラル - -の形で呼び出されるメソッドの引数は, リテラルの表すオブジェクトではなく, -上記の比較の結果が与えられる. このため, 原則的に`!'メソッドは再定義し -ない方が良いと思う. +に解釈される. ** 代入 代入には変数に対する代入(真の代入)と, プログラムを簡単にするためのシン タックスシュガーとしての代入がある. 真の代入は以下の形式である. - 変数 = 式 + 変数 '=' 式 これは式を評価し, 変数の値として代入する. クラスやモジュールや疑似変数 には代入できない. クラスやモジュールの定義を変更するためにはclass文, @@ -405,171 +396,207 @@ module文を用いる. 代入式は演算子形式をとっているが, メソッドではないの シンタックスシュガーとしての代入式は以下のものがある. - 配列要素への代入 +配列要素への代入 - 式1[式2,..] = 式n + 式1'[' 式2... ' ]' '=' 式n - 式1を評価して得られるオブジェクトに, 式2から式nまでを引数とし - て, "[]="というメソッドを呼び出す. +式1を評価して得られるオブジェクトに, 式2から式nまでを引数として, "[]=" +というメソッドを呼び出す. - 属性代入 +属性代入 - 式1.識別子 = 式2 + 式1 '.' 識別子 '=' 式2 - 式1を評価して得られるオブジェクトに対して"識別子="というメソッ - ドを, 式2を引数として呼び出す. +式1を評価して得られるオブジェクトに対して"識別子="というメソッドを, 式 +2を引数として呼び出す. - 自己代入 +自己代入 - 式1 op= 式2 # 式1は代入可能でなければならない. + 式1 op= 式2 # 式1は代入可能でなければならない. - この形式は内部的に「式1 = 式1 op 式2」と展開され, 実行される. その - ため式1は2回評価されるので, 副作用がある場合は予想しない結果を呼ぶ - 可能性がある. 自己代入形式はプログラマのタイプ数を減らす目的のため - に存在する形式である. opとして使える演算子は +この形式は内部的に「式1 = 式1 op 式2」と展開され, 実行される. そのため +式1は2回評価されるので, 副作用がある場合は予想しない結果を呼ぶ可能性が +ある. 自己代入形式はプログラマのタイプ数を減らす目的のために存在する形 +式である. opとして使える演算子は +, -, *, /, %, **, &, |, ^, <<, >> - の11種類である. 演算子と`='の間にスペースを空けてはいけない. - -*** 多重代入 - -同時に複数の変数に代入を行なうことができる. その形式は以下の通りである. +の11種類である. 演算子と`='の間にスペースを空けてはいけない. - 変数, [変数,...] = 式 [, 式] +*** 条件分岐式 -右辺の式が一つしかない場合は, その値を配列として(必要ならばto_aメソッ -ドで配列に変換して), 要素をそれぞれ変数に代入する. それ以外の場合には, -それぞれの式の値が変数に代入される. 左辺の変数の数と右辺の要素の数が合 -わない時には足りない変数には nilが代入され, 余った要素は無視される. +式の値によって分岐する式は以下に示すif式, unless式, case式の複合文型が +3種類と演算子型が3種類ある. Rubyではnilが偽, それ以外が真と評価される. +CやPerlなどとは異なり, 0や ""(空文字列)は偽とは評価されないので気をつ +けること. - foo, bar = [1, 2] # foo = 1; bar = 2 - foo, bar = 1, 2 # foo = 1; bar = 2 - foo, bar = 1 # foo = 1; bar = nil - - foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil - foo, bar = 1, 2, 3 # foo = 1; bar = 2 - -** 条件分岐 +if式 if 式1 [then] 文1 - [ elsif 式2 [then] + [elsif 式2 [then] 文2 ]... - [ else + [else 文n ] - end [ if ] + end - 条件判断文. else if でもelifでもなくelsifでifの連続を行なうことに - 注意すること. +条件判断式. 式1が真の場合に文1を評価する. それ以外の場合は文2を評価す +る. Rubyのif式はelse ifでもelifでもなくelsifでifの連続を行なうことに注 +意すること. + +unless式 unless 式1 [then] - 文1 - [ else + 文1 + [else 文2 ] - end [ unless ] - - 式1が偽(nil)を返すか, 式2の評価中に例外が発生した場合に文1を評価 - する. - - 式1 && 式2 - - 式1を評価し, その値が真(nil以外)であれば, 式2を評価する. - - 式1 || 式2 - - 式1を評価し, その値が偽であれば, 式2を評価する. + end - 式1 ... 式2 +式1が偽(nil)を返すか, 式2の評価中に例外が発生した場合に文1を評価する. +それ以外の場合は文2を評価する. - 式1が真になるまでは偽を返し, その後は式2が真を返すまでは真を返す. - 式2が真になれば状態は偽に戻る +case式 case 式0 - [ when 式1 [, 式2]... + [when 式1 [, 式2]... 文1 ]... - [ else + [else 文n ] - end [ case ] + end - 条件分岐, CのswitchよりもPascalのcaseに似ている. breakで脱出するこ - とも後ろの文に継続することもないので注意. +条件分岐, CのswitchよりもPascalのcaseに似ている. breakで脱出することも +後ろの文に継続することもないので注意. - 条件の一致は「式n =~ 式0]で行なわれる. つまり, +条件の一致は「式n =~ 式0]で行なわれる. つまり, - case expr0 - when expr1, expr2 - stmt1 - when expr3, expr4 + case expr0 + when expr1, expr2 + stmt1 + when expr3, expr4 + stmt2 + else + stmt3 + end + +は以下のif文と等価である. + + _tmp = expr0 + if expr1 =~ _tmp || expr2 =~ _tmp + stmt1 + elsif expr3 =~ _tmp || expr4 =~ _tmp stmt2 - else + else stmt3 - end + end + +演算子型 + + 式1 '&&' 式2 + +式1を評価し, その値が真(nil以外)であれば, 式2を評価する. + + 式1 '||' 式2 - は以下のif文と等価である. +式1を評価し, その値が偽であれば, 式2を評価する. - _tmp = expr0 - if expr1 =~ _tmp || expr2 =~ _tmp - stmt1 - elsif expr3 =~ _tmp || expr4 =~ _tmp - stmt2 - else - stmt3 - end + 式1 '...' 式2 -** 繰り返し +式1が真になるまでは偽を返し, その後は式2が真を返すまでは真を返す. 式2 +が真になれば状態は偽に戻る + +*** 繰り返し式(単純型) + +ループを構成する式. これらの式の値は常にnilである. オブジェクトに合わ +せたループを行なうためには次に述べるイテレータを用いる. + +while式 while 式 文 - end [ while ] + end + +条件が真の間, 文を繰り返し実行する. - 条件が真の間, 文を繰り返し実行する. +until式 until 式 文 - end [ until ] + end 式1 until 式2 - 式が偽(nil)を返すか, 式の評価中に例外が発生する間, 文を繰り返し実 - 行する. +式が偽(nil)を返すか, 式の評価中に例外が発生する間, 文を繰り返し実行す +る. + +*** 条件式について + +if, unless, while, untilの条件判断部の式, および特殊演算子`...'の両辺 +の式は条件式と呼ばれる. 条件式では文字列と正規表現リテラルは式「$_=~リ +テラル」の省略であるとみなされる. 更に演算子`...'の両辺では整数定数が +「$.==定数」の省略と解釈される. 条件式に現れる演算子 `&&', `||', `!'の +右辺の式も条件式とみなされる. + +注意: 演算子`!'は特殊演算子ではないので, 再定義を行なう場合に気をつけ +ること. 条件式の中で + + ! 文字列リテラル + ! 正規表現リテラル + +の形で呼び出されるメソッドの引数は, リテラルの表すオブジェクトではなく, +上記の比較の結果が与えられる. このため, 原則的に`!'メソッドは再定義し +ない方が良い. + +*** イテレータ(繰り返し子) ** イテレータ イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの +一種である. コードの断片(ブロックと呼ばれる)を指定してイテレータを呼び +出すと, イテレータは適当な値をセットしてブロックを評価する(おそらくは +複数回). イテレータからのブロックの呼び出しはyield式を用いる(後述). + +イテレータの呼び出しは以下の構文で行なわれる. + +イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの 一種である. イテレータの呼び出しは以下の構文で行なわれる. - do - 文1 - using 変数 - 文2 - end [ do ] - - 「文2」をブロックとして設定し, 文1のメソッドをイテレータとして評価 - する. 文1のトップレベルのメソッドだけがイテレータとして呼び出され, - レシーバを表す式や, 引数の式はイテレータとしては呼び出されない. 文 - 1に複数の式があれば各々がイテレータとして順に呼ばれる. - -イテレータ内でyield valueが実行されると, その値がdo文で指定された変数 -に代入されブロックが実行される. ブロックの実行が終了するとその値は -yield式の値として返される. あるメソッドがイテレータとして呼び出された -かどうかは関数iterator_p()で知ることができる. 中にはEnumerableモジュー -ルのgrepメソッドのようにイテレータとして呼ばれた時と普通のメソッドとし -て呼ばれた時とで動作が異なるメソッドもある. - - for 変数 in 式 + 式 '{' 変数... '|' 文 '}' + +「文」をブロックとして設定し, 「式」のメソッドをイテレータとして評価す +る. 「式」のトップレベルのメソッドだけがイテレータとして呼び出され, +レシーバを表す式や, 引数の式はイテレータとしては呼び出されない. 「式」 +が複数の式を含む時, 各々がイテレータとして順に呼ばれる. + +イテレータ内でyield文が実行されると, そこで指定された値がdo文で指定さ +れた変数に代入され, ブロックが実行される. ブロックの実行が終了するとそ +の値は yield文の値として返される. あるメソッドがイテレータとして呼び出 +されたかどうかはメソッドiterator_p()の戻り値で知ることができる. 中には +Enumerableモジュールのgrepメソッドのようにイテレータとして呼ばれた時と +普通のメソッドとして呼ばれた時とで動作が異なるメソッドもある. + +オブジェクトの各要素に対して操作を行なうための形式も提供されている. 形 +式は以下の通り. + + for 変数.. in 式 文 - end [ for ] + end - 式の各要素に対し文を実行する. これは以下のdo文と等価である. +式の各要素に対し文を実行する. これは以下の式と等価である. - do (式).each using 変数 - 文 - end + 式 '{' 変数 '|' 文 '}' + +よって式の値のオブジェクトがメソッドeachを持たない場合, forを実行する +と例外が発生する. + +*** イテレータの中でのブロック呼び出し + + yield '(' [式 [',' 式...]]) + yield - よって式の値のオブジェクトがメソッドeachを持たない場合, forを実行 - すると例外が発生する. +イテレータの中でブロックの呼び出しを行なう. yieldを実行したメソッドが +イテレータとして呼び出されていない時には例外が発生する. yield の値はブ +ロックの戻り値である. -** 例外処理 +*** 例外処理 処理中に予期しない事態が発生した時には例外が発生する. Rubyでは例外を途 中で捕捉して, 再試行したり, 後処理を行なったりすることができる. @@ -580,116 +607,212 @@ yield式の値として返される. あるメソッドがイテレータとして呼び出された 文2 ] [ ensure 文3 ] - end [ protect ] + end + +文1を実行し, その実行中に例外が発生すればresque節で指定された文2を実行 +する. 更にensure節が存在する時はprotect文を終了する前に必ず(正常終了時 +だけでなく, 例外, return, break, continue, redoなどによる脱出でも)文3 +を実行する. + +unless文, until文は条件を評価する時に例外が発生した場合, 評価結果が偽 +であると見なすので, 暗黙の例外処理を行なっていることになる. + +*** グルーピング + +式は括弧によってグルーピングすることができる. + + '(' 式 ')' + +更に括弧を用いて, 文(または文の並び)を式にすることもできる. + + '(' 文 ';' 文... ')' + +文の並びの値は最後に評価した式の値である. つまりの値は最後に評価した文 +の値になる. + +** 文 + +Rubyプログラムを構成するもう一つの要素は文である. 文には単純文, 制御文, +宣言文がある. 一般に文の値を用いることはないが, 式として用いられる場合 +もあるので, 値を持つ. 通常は文の値はnilである. + +*** 式 + +式は単純文である. + +*** 多重代入 + +同時に複数の変数に代入を行なうことができる. その形式は以下の通りである. + + 変数 ',' [変数 ',' ...] ['*' 変数]= 式 [, 式...] + +右辺の式が一つしかない場合は, その値を配列として(必要ならばto_aメソッ +ドで配列に変換して), 要素をそれぞれ変数に代入する. それ以外の場合には, +それぞれの式の値が変数に代入される. 左辺の変数の数と右辺の要素の数が合 +わない時には足りない変数には nilが代入され, 余った要素は無視される. 多 +重代入の最後の要素の前に`*'がある場合, 残りの全て引数が配列として代入 +される. + + foo, bar = [1, 2] # foo = 1; bar = 2 + foo, bar = 1, 2 # foo = 1; bar = 2 + foo, bar = 1 # foo = 1; bar = nil + + foo, bar, baz = 1, 2 # foo = 1; bar = 2; baz = nil + foo, bar = 1, 2, 3 # foo = 1; bar = 2 + foo,*bar = 1, 2, 3 # foo = 1; bar = [2, 3] + +多重代入は単純文である. その値は(配列に変換された)右辺である. - 文1を実行し, その実行中に例外が発生すればresque節で指定された文2を - 実行する. 更にensure節が存在する時はprotect文を終了する前に必ず(正 - 常終了時だけでなく, 例外, return, break, continue, redoなどによる - 脱出でも)文3を実行する. +*** 制御文 -protect以外に, unless演算子, until演算子は右辺の値を求める時に例外が発 -生した場合, 右辺の値として偽を与えられたと見なすので, 暗黙の例外処理を -行なっていることになる. +制御の流れを変更する以下の文がある. これらは単純文である. -** 大域脱出 +return文 - return [式] + return [式[, 式...]] - メソッドの実行を終了する. +式の値を戻り値としてメソッドの実行を終了する. 式が2つ以上与えられた時 +には, それらを要素とする配列をメソッドの戻り値とする. 式が一つもない場 +合には nil が戻り値となる. + +ループ制御文 continue redo break - 上記3つはループ中で使う. +上記3つはループ中で使う. + +continueはもっとも内側のループの次の繰り返しを始める. redoはループ条件 +のチェックを行なわず, 現在の繰り返しをやり直す. break はループを脱出す +る. Cと違い, breakはもっとも内側のループを脱出する作用だけを持ち, case +を抜ける作用は持たない. - continueはもっとも内側のループの次の繰り返しを始める. redoはループ - のループ条件のチェックを行なわず, 現在の繰り返しをやり直す. break - はループを脱出する. Cと違い, breakはもっとも内側のループを脱出する - 作用だけを持ち, caseを抜ける作用は持たない. +retry文 retry - protect文のresque節で使い, protect文を始めから実行する. 例外処理を - 行なってから再試行するのに使う. +protect文のresque節で使い, protect文を始めから実行する. 例外処理を行なっ +てから再試行するのに使う. resque節以外でretryが用いられた場合例外が発 +生する. + +fail文 + + fail '(' [メッセージ] ')' + fail [メッセージ] + +例外を発生させる. メッセージが与えられた場合には発生したソースファイル +名, 行番号をシステム変数`$@'に, メッセージを`$!'にセットする. + +yield文 + + yield 式 [',' 式...] + +文としてyieldを用いることもできる. この場合は式を括弧で括る必要はない. + +*** メソッド呼び出し文 + +1つ以上引数を持つメソッドを文として呼び出す場合には引数を括弧で括る必 +要はない. その形式は以下の通りである. + + 式 '.' メソッド名 引数1 ',' [ 引数2... ][ '*' 引数n ] + メソッド名 引数1 ',' [ 引数2... ][ '*' 引数n ] + super 引数1 ',' [ 引数2... ][ '*' 引数n ] + +構文解析時に, 式のように解釈できる場合は式としての解釈が優先される. + + foo bar+baz # メソッド呼び出しfoo(bar+baz) + foo (bar)+baz # メソッド呼び出しfoo(bar) + bar + foo 1 # メソッド呼び出しfoo(1) + foo -1 # ローカル変数foo - 1 + +メソッド呼び出し文は単純文である. - fail([メッセージ]) * これはKernelクラスのメソッドである. +*** 制御修飾子 - 例外を発生させる. メッセージが与えられた場合には発生したソースファ - イル名, 行番号を$@にメッセージを$!にセットする. +単純文に制御修飾子を付加したものは文である(単純文ではない). 修飾子は以 +下の4種類である. -** イテレータの中でのブロック呼び出し + 単純文 if 式 + 単純文 unless 式 + 単純文 while 式 + 単純文 until 式 - yield 式 +条件修飾子(if/unless)の式は先行する文に先だって評価される. 動作も対応 +する条件分岐式と同様である. - イテレータの中でブロックの呼び出しを行なう. yieldを実行したメソッ - ドがイテレータとして呼び出されていない時には例外が発生する. +繰り返し修飾子(while/until)はまず先行する文を評価してから条件式を評価 +するので, 最低一度は文を実行することになる. -** クラス定義 +*** クラス宣言文 クラスを定義する構文は以下の通りである. - class クラス名 [ : スーパークラス名 ] + class クラス名 [':' スーパークラス名 ] 定義実体 - end [ class ] + end -値はnil. クラス名は大文字で始まる識別子である. クラス定義のネストはで -きないので他の定義文内ではクラスを定義できない. +クラス名は任意の識別子である(大文字で始めることを推奨する). クラス定義 +のネストはできないので他の定義文内ではクラスを定義できない. -** モジュール定義 +*** モジュール定義文 モジュールを定義する構文は以下の通りである. module クラス名 定義実体 - end [ module ] + end モジュール名は大文字で始まる識別子である. クラス同様, モジュール定義も ネストできない. -** インクルード +*** インクルード文 -クラスにモジュールをインクルードする構文は以下の通りである. +モジュールをインクルードすることによって, クラスまたはモジュールに機能 +を追加できる. モジュールをインクルードした場合, そのモジュール(および +そのモジュールが更にインクルードしているモジュール)の全てのメソッドを +受け継ぐ. 別のいい方をすればインクルードは限定された多重継承といえる. - include モジュール名 [, モジュール名...] +他のモジュールをインクルードする構文は以下の通りである. -現在の定義中のクラスまたはモジュール(トップレベルではObject)に指定した -モジュールをインクルードする. これによって多重継承をエミュレートできる. + include モジュール名 [',' モジュール名...] -** メソッド定義 +現在の定義中のクラスまたはモジュール(トップレベルではObjectクラス)に指 +定したモジュールをインクルードする. + +*** メソッド定義文 通常(特異メソッドでない)メソッド定義の形式は以下の通りである. 通常メソッ ド定義はネストできないので, メソッド定義文中ではメソッド定義文を再び呼 び出せない. - def メソッド名 [ ( 引数 [, 引数...][, *引数 ] ) ] + def メソッド名 [ '(' 引数 [',' 引数...][',' '*'引数 ] ')' ] 定義実体 - end [ def ] + end メソッド名は識別子または文字列である. 演算子の再定義をする時には文字列 で指定する. 仮引数並びの最後に`*'がある場合, 仮引数より多く与えられた 実引数は, 最後の引数に配列として与えられる(足りない時にはエラー). -** 特異メソッド定義 +** 特異メソッド定義文 -メソッド定義にはもう一つ特異メソッドの定義がある. 形式は以下の通りであ -る. +メソッド定義にはもう一つ特異メソッドの定義がある. 特異メソッドとはある +特定のオブジェクトに固有のメソッドである. 形式は以下の通りである. - def 式.メソッド名 [ ( 引数 [, 引数...][, *引数 ] ) ] + def 式 '.' メソッド名 [ '(' 引数 [',' 引数...][',' '*'引数 ] ')' ] 定義実体 - end [ def ] + end -この形式は式の値であるオブジェクトに特異メソッドを定義する. 式の値は +この形式は式の値であるオブジェクトに特異メソッドを定義する. 式の値は (ビルトインクラスでない)通常オブジェクトか, クラスまたはモジュールであ -る必要がある. 通常メソッド定義とは異なり, こちらはメソッド本体内でもネ -ストして呼び出すことができる. +る必要がある. 通常メソッド定義とは異なり, 特異メソッドはメソッド本体内 +でもネストして定義することができる. -特異メソッドは特定のオブジェクトにだけ属するメソッドである. よって通常 -は継承しえないが, 例外としてクラスの特異メソッドはそのサブクラスにも継 -承される. 言い替えればクラスの特異メソッドは他のオブジェクト指向システ -ムにおけるクラスメソッドの働きをする. +特異メソッドは通常は継承しえないが, 例外としてクラスの特異メソッドはそ +のサブクラスにも継承される. 言い替えればクラスの特異メソッドは他のオブ +ジェクト指向システムにおけるクラスメソッドの働きをする. -** メソッドの別名定義 +*** メソッドの別名定義文 以下の形式でメソッドに別名をつけることができる. @@ -699,7 +822,7 @@ protect以外に, unless演算子, until演算子は右辺の値を求める時に例外が発 ソッドが再定義されても, 古いメソッドが呼び出されたのと全く同じ働きをす る. -** メソッド定義取り消し +*** メソッド定義取り消し文 メソッドの定義を取り消すためにはundefを用いる. @@ -708,10 +831,11 @@ protect以外に, unless演算子, until演算子は右辺の値を求める時に例外が発 識別子または文字列で指定したメソッドの定義を取り消す. defによる別名定義とundefによる定義取り消しを使うとクラスのインタフェー -スをスーパクラスと独立に変更することができる. ただし, 自分自身にメッセー -ジを送っている場合に注意しないと既存のメソッドが動作しなくなる可能性が -ある. - +スをスーパークラスと独立に変更することができる. ただし, メソッドがself +にメッセージを送っている場合にはよく注意しないと既存のメソッドが動作し +なくなる可能性がある. + +------------------------------------------------------- * Rubyの組み込み機能 Rubyプログラミングの基本はクラス, モジュールとそのメソッドの習得である. @@ -719,8 +843,6 @@ Rubyには処理系そのものに以下の機能が組み込まれている. ライブラリをロー ドすることによって機能は増えるが, それらに関してはそれぞれのライブラリ のドキュメントを参照してもらいたい. -右端に`+'記号のついたメソッドは関数メソッドである. - ** 関数 Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク @@ -728,50 +850,38 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク れるメソッドを以下にあげる. これらのメソッドを再定義する際には互換性を 考えて行なうべきである. - _exit(status) + + _exit(status) プログラムの実行を終了する. 整数statusを終了ステータスとする. exit()とは違って, 例外処理などは一切行なわない. fork()の後, 子 プロセスを終了させる時などに用いる. - caller + - caller(level) + - - スタックフレームから情報を得て, メソッドの呼び出し元のファイル - 名, 行番号, 引数を要素とする配列を返す. levelが与えられた場合 - は現在のスタックフレームよりlevel段上の情報を返す. - - eof() + + eof() コマンドラインからの入力がEOFに到達している場合, 真を返す. - eval(expr) + + eval(expr) exprとして与えられた文字列をrubyプログラムとして解釈,実行する. - exec(command) + + exec(command) 現在実行しているプロセスを終了して, command文字列で指定される 別プロセスを起動する. - exit([status]) + + exit([status]) プログラムの実行を終了する. statusとして整数が与えられた場合, その値をRubyコマンドの終了ステータスとする. デフォルトは0. - fail([message]) + - - 例外を発生させる. メッセージが与えられた場合にはそれをシステム - 変数`$!'にセットし, 発生した位置をシステム変数`$@'にセットする. - - fork() + + fork() forkシステムコールを実行し, 子プロセスを生成する. 詳細は fork(2)を参照のこと. 親プロセス側では子プロセスのプロセスidを 返し, 子プロセス側ではnilを返す. 何らかの原因で子プロセスの生 成に失敗した時には例外が発生する. - format(format, ...) + + format(format, ...) フォーマットとして与えられた文字列をC言語のsprintfと同じように 解釈し, 引数を展開した文字列を返す. メソッドsprintf()の別名. @@ -779,46 +889,47 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク Rubyにおけるformat指定子の拡張についてはsprintf()の項を参照の こと. - getc() + + getc() 標準入力から一文字取り出す. 戻り値は読み込んだ文字の文字コード (ASCII)を表すFixnumである. - getenv(name) + + getenv(name) - nameに該当する環境変数を取り出す. + nameに該当する環境変数を取り出す. $ENV[name]と同義. - gets(pattern, replace) + + gets() - 引数として与えられたファイル(なければ標準入力)から一行読み込ん - で, 読み込みに成功した時にはその文字列を返す. ファイルの終りに - 到達した時にはnilを返す. 行の区切りはシステム変数`$/'によって - 変更できる. 読み込んだ文字列はシステム変数`$_'にもセットされる. + 引数として与えられたファイル(なければ標準入力)で構成される仮想 + 的なファイル($ARGFでアクセスできる)から一行読み込んで, 読み込 + みに成功した時にはその文字列を返す. ファイルの終りに到達した時 + にはnilを返す. 行の区切りはシステム変数`$/'によって変更できる. + 読み込んだ文字列はシステム変数`$_'にもセットされる. - gsub() + + gsub(pattern, replace) システム変数`$_'の指す文字列に対して置換を行なう. 文字列内で patternにマッチする部分を全てreplaceに置き換える. Stringクラス のgsubメソッドの解説を参照のこと. - iterator_p() + + iterator_p() メソッドがイテレータとして呼び出された時に真, そうでない時に偽 を返す述語. - kill(signal, pid...) + + kill(signal, pid...) pidで指定されたプロセスにシグナルを送る. シグナルはシグナル番 号か名前で指定する. 負の値を持つシグナル(あるいはシグナル名の 前に`-')を与えるとプロセスではなくプロセスグループにシグナルを 送る. - load(file) + + load(file) fileをロードする. fileをロードするパスはシステム変数$LOAD_PATH で決定される. - open(file[, mode]) + + open(file[, mode]) fileをオープンして, Fileオブジェクトを返す. ファイル名はオープ ンするファイルを示す. ファイル名が`|'で始まる時には続く文字列 @@ -860,7 +971,7 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク 変数`$\'(出力フィールドセパレータ)にnil でない値がセットされて いる時には, 最後にそれを出力する. - printf([port, ]format, arg1, ..., argn) + + printf([port, ]format, arg1, ..., argn) C言語のprintf()と同じformatに従い引数を文字列に変換し, 出力す る. 第1引数がIOのサブクラスのインスタンスであった場合はそのオ @@ -869,7 +980,7 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク Rubyにおけるformat指定子の拡張についてはsprintf()の項を参照の こと. - rand(max) + + rand(max) 0からmaxを越えない範囲の整数の乱数を発生する. 戻り値はFixnum. @@ -880,7 +991,7 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク イルは再ロードしない点である. 実際にロードした時には%TRUE, 既 にロードされている時には%FALSEを返す. - select(reads[, writes[, execpts[, timeout]]]) + + select(reads[, writes[, execpts[, timeout]]]) select(2)を実行する. reads/writes/execptsにはIO(またはそのサブ クラス)のインスタンスの配列を与える. timeoutはFixnum / Float @@ -888,17 +999,18 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク nil, そうでないときは3要素の配列を返し, その各要素が入力/出力/ 例外待ちのオブジェクトを要素として持つ. - setenv(name, value) + + setenv(name, value) - nameで指定される環境変数をvalueにセットする. + nameで指定される環境変数をvalueにセットする. $ENV[name]=value + と同じ働きをする. - sleep([sec]) + + sleep([sec]) sec秒だけプログラムの実行を停止する. secが省略された場合, プロ セスにSIGALRMが送られない限り, 永久にスリープする. 実際にスリー プした秒数を返す. - sprintf(format, ...) + + sprintf(format, ...) format文字列をC言語のsprintfと同じように解釈し, 引数を展開した 文字列を返す. メソッドformat()の別名. @@ -910,40 +1022,40 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク 8 進, 16進数の表示を行なうが, 負の数の処理の際に2の補数表現で はなく, その絶対値表記の先頭に`-'をつけたものを表示する. - srand([初期値]) + + srand([初期値]) 乱数の初期値を設定し, 古い初期値を返す. 初期値が省略された時に はtime(3)の返す値をデフォルトとする. - sub() + + sub(pattern, replace) システム変数`$_'の指す文字列に対して置換を行なう. 文字列内で最 初にpatternにマッチする部分をreplaceに置き換える. Stringクラス のsubメソッドの解説を参照のこと. - syscall(num, arg...) + + syscall(num, arg...) numで指定された番号のシステムコールを実行する. 第2引数以降をシ ステムコールの引数として渡す. 引数は文字列または整数でなければ ならない. - system(command) + + system(command) コマンドを実行し, その終了ステータスを返す. - trap(command, signal...) + + trap(command, signal...) signalの割り込みがかかった時にcommandを実行する. signalはシグ - ナル名かシグナルの番号. commandとしてSIG_IGNまたはIGNOREを指定 - した時にはそのシグナルを無視する(可能ならば). SIG_DFLまたは - DEFAULTを指定した時はデフォルトの動作を行なう. + ナル名かシグナルの番号. commandとして"SIG_IGN"または"IGNORE"を + 指定した時にはそのシグナルを無視する(可能ならば). "SIG_DFL"ま + たは"DEFAULT"を指定した時はデフォルトの動作を行なう. - wait() + + wait() 子プロセスが終了するのを待ち, 終了した子プロセスのpidを返す. 子プロセスが一つもなければnilを返す. - waitpid(pid, flags) + + waitpid(pid, flags) 特定の子プロセスの終了を待ち, そのプロセスが終了した時に真を返 す. 子プロセスが存在しないか, ノンブロッキングモードで子プロセ @@ -953,7 +1065,7 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク ** システム変数 - $! エラーメッセージ. fail()で設定する. + $! エラーメッセージ. failで設定する. $@ エラーが発生した時点のファイル名と行番号が @@ -1007,7 +1119,8 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク $ENV 環境変数にアクセスする連想配列(EnvDict). この変数に対 して `for'を行なうと変数名と値のペアを与える. - $FILENAME 関数gets()で現在読み込み中のファイル名. + $FILENAME 仮想ファイル$ARGFで現在読み込み中のファイル名. メソッ + ドgets()が今読んでいるファイル名. $DEBUG `-d'フラグの状態(真偽値) @@ -1020,28 +1133,97 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク $stdout 標準出力 $stderr 標準エラー出力 + $ARGF 引数(なければ標準入力)で構成される仮想ファイル. つまり + gets()は$ARGF.gets()と同じ意味である. + $VERBOSE `-v'フラグの状態(真偽値) $VERSION rubyのバージョンを示す文字列 ** システム定数 - %TRUE 1(Fixnum) + %TRUE t %FALSE nil それぞれ真偽値を表す. 条件判断はnilを偽, それ以外の全ての値を - 真として判断するため, 真偽値を返すメソッドで%TRUE以外の値を返 - すものが存在するので, 比較に用いるのは適切でないことに注意すべ - きである. 例えば次の式は真にならない. + 真として判断するため, %TRUEの値は代表的な真の値という以上の意 + 味を持たない. よって, あるメソッドの返値が真であるということと, + それが%TRUEを返すということは厳密には同じではない(述語的に用い + られるメソッドは大抵真の値として%TRUEを返すようにはなっている + が). つまり + + if some.method() then .. else .. end - (2 < 3) == %TRUE + と - メソッド"<"は真の時右辺値を返すので, この場合の値は3であり, 定 - 数%TRUEの値1とは異なる. %FALSEに関しては, このような問題は生じ + if some.method() == %TRUE then .. else .. end + + は完全には同義ではない. %FALSEに関しては, このような問題は生じ ない. ** クラス/モジュール +*** ARGFILE(クラス) + +引数で指定されたファイル(引数が与えられていない時には標準入力)で構成さ +れる仮想ファイルをアクセスするためのクラス. ただしこのクラスは特異メソッ +ドしか持たず, モジュール的な使い方をされる. クラス名だけでなくシステム +変数$ARGFでも参照できる. + + while gets() + ... + end + +と + + for $_ in $ARGF + ... + end + +は全く同じ意味だが, 後者の方がより美しく, 理解しやすく, そしてブロック +生成のコストのため若干遅い. + +SuperClass: Object + +Included Modules: Enumerable + +Methods: + + each + + 各行毎に繰り返すイテレータ + + each_byte + + 各文字毎に繰り返すイテレータ + + eof + + 現在読み込んでいるファイル(仮想ファイル全体ではない)が終りに到 + 達した時に真を返す. + + getc + + 仮想ファイルから1文字読み込む. 戻り値は文字コードを表す整数で + ある. ファイルの終りに到達した時にはnilを返す. このメソッドで + 読み込んだ場合, システム変数`$.'は変化しない. + + gets + readline + + 仮想ファイルから一行読み込んで, 読み込みに成功した時にはその文 + 字列を返す. ファイルの終りに到達した時にはnilを返す. 行の区切 + りはシステム変数`$/'によって変更できる. 読み込んだ文字列はシス + テム変数`$_'にもセットされる. + + read + + 仮想ファイルの内容を全て文字列として読み込む. + + readlines + + 仮想ファイルを全て読み込んで, 各行を要素として持つ配列を返す. + *** Array(クラス) 数字を添字とした配列のクラスである. 生成は一般的には配列式``[...]''で @@ -1101,9 +1283,9 @@ Methods: 配列の大きさを0にする. - delete(item) + delete(val) - itemと一致する要素を削除する. + valと一致する要素を削除する. delete_if @@ -1122,6 +1304,18 @@ Methods: lengthが省略された時は配列の終りまでの長さをとる. 指定された部 分配列が元の配列の範囲を越える時は自動的に拡張される. + index(val) + + valと等しい最初の要素のインデックスを返す. 該当する要素が存在 + しない場合はnilを返す. + + indexes(ary) + indexes(index-1, ..., index-n) + + 1番目の形式では整数の配列を引数として受けて, その要素をインデッ + クスとする要素を含む配列を返す. 2番目の形式では各引数の値をイ + ンデックスとする要素を含む配列を返す. + join([sep]) 配列の要素を連結した文字列を返す. 各要素は文字列に変換され, 間 @@ -1129,6 +1323,7 @@ Methods: の値が用いられる. length + size 配列の長さ(要素数)を返す. @@ -1241,7 +1436,9 @@ Methods: クラスのクラス. より厳密に説明するとクラスは特異メソッドを継承するため に, それぞれメタクラスと呼ばれる名前のないクラスをクラスとして持ち, Classはそのメタクラスのクラスである(分かったかな?). が, この解説が理解 -できなくても, Rubyを使うことに何の支障もない. +できなくても, Rubyを使うことに何の支障もない. クラスには特異メソッドを +定義できる事と, スーパークラスで定義された特異メソッドはそのサブクラス +でも有効である事を知れば十分である. SuperClass: Module @@ -1260,12 +1457,16 @@ Methods: *** Comparable(モジュール) - 比較演算を許すクラスのためのMixin. このモジュールをインクルードするこ - とによって, `<=>'を定義するだけで他の演算子はその定義を利用して派生で - きる. +比較演算を許すクラスのためのMixin. このモジュールをインクルードするこ +とによって, `<=>'演算子を定義するだけで他の演算子はその定義を利用して +派生できる. Methods: + self == other + + selfがotherと等しい時真を返す. + self > other selfがotherより大きい時真を返す. @@ -1291,7 +1492,7 @@ Methods: NDBMファイルをアクセスするクラス. キー, データともに文字列でなければな らないという制限と, データがファイルに保存されるという点を除いては Dictクラスと全く同様に扱うことができる. NDBMを備えていないシステムでは -このクラスへのアクセスは例外を発生させる. +このクラスは定義されない. SuperClass: Object @@ -1326,6 +1527,10 @@ Methods: クを評価した値が真の時, 該当する項目を削除する. each + each_pair + + [key, value]なる配列を与えるイテレータ. + each_value 全てのvalueに対して繰り返すイテレータ. @@ -1334,12 +1539,8 @@ Methods: 全てのkeyに対して繰り返すイテレータ. - each_pair - - [key, value]なる配列を与えるイテレータ. - - includes(key) has_key(key) + includes(key) keyがデータベース中に存在する時, 真を返す @@ -1348,11 +1549,19 @@ Methods: valueを値とする組がデータベース中に存在する時, 真を 返す + indexes(ary) + indexes(key-1, ..., key-n) + + 1番目の形式では文字列の配列を引数として受けて, その要素をキー + とする要素を含む配列を返す. 2番目の形式では各引数の値をキーと + する要素を含む配列を返す. + keys データベース中に存在するキー全てを含む配列を返す. length + size データベース中の要素の数を返す. (注意:現在の実現では要素数を数 えるためにデータベースを全部検索するので, 結構コストが高い. 気 @@ -1422,8 +1631,8 @@ Methods: [key, value]なる配列を与えるイテレータ. - includes(key) has_key(key) + includes(key) keyが辞書中に存在する時, 真を返す @@ -1431,11 +1640,19 @@ Methods: valueを値とする組が辞書中に存在する時, 真を返す + indexes(ary) + indexes(key-1, ..., key-n) + + 1番目の形式では配列を引数として受けて, その要素をキーとする要 + 素を含む配列を返す. 2番目の形式では各引数の値をキーとする要素 + を含む配列を返す. + keys 辞書中に存在するキー全てを含む配列を返す. length + size 辞書中の要素の数を返す. @@ -1539,7 +1756,7 @@ Methods: grep(pattern) - 「pattern =~ 要素」が成立する全ての要素を含む配列を返す. イテ + 「要素 =~ pattern」が成立する全ての要素を含む配列を返す. イテ レータとして用いられた時は上記の条件の成立した要素に対してブロッ クを実行する. @@ -1555,13 +1772,13 @@ Methods: min - 最小の要素を返す. 各要素が`<=>'メソッドを持つことを暗黙のうち - に仮定している. + 最小の要素を返す. 全ての要素がお互いに`<=>'メソッドで比較でき + ることを仮定している. max - 最大の要素を返す. 各要素が`<=>'メソッドを持つことを暗黙のうち - に仮定している. + 最大の要素を返す. 各要素が`<=>'メソッドで比較できることを仮定 + している. reverse @@ -1626,7 +1843,7 @@ Single Methods: gecos # gecosフィールド(文字列) dir # ホームディレクトリ(文字列) shell # ログインシェル(文字列) - # 以降のメンバはシステムによってはないものもある + # 以降のメンバはシステムによっては提供されない. change # パスワード変更時間(整数) quota # クォータ(整数) age # エージ(整数) @@ -1673,9 +1890,9 @@ Single Methods: *** File(クラス) -ファイルアクセスのためのクラス. 関数メソッドopen()で生成される. また, -このクラスの特異メソッドとしてtestのファイルテスト演算子相当のメソッド -が定義されている. +ファイルアクセスのためのクラス. メソッドopen()で生成される. また, この +クラスの特異メソッドとしてtestのファイルテスト演算子相当のメソッドが定 +義されている(FileTestモジュールのメソッド郡). SuperClass: IO @@ -1693,7 +1910,7 @@ Methods: ファイルのパーミッションを変更する(cf chmod(2)). - chmod(owner, group) + chown(owner, group) ファイルの所有者とグループを変更する(cf chown(2)). nilか-1を 指定することによって所有者やグループを現在のまま変えないでおく @@ -1707,7 +1924,7 @@ Methods: ファイルに関するStat構造体を返す. lstatはファイルがシンボリッ クリンクであればリンクそのものに関するStat構造体を返す. 構造体 - の内容についてはstat を参照のこと. + の内容についてはstatを参照のこと. mtime @@ -1727,7 +1944,7 @@ Methods: 0, 1, 2のいずれかであって, それぞれファイルの先頭, 現在位置, ファイルの終端のうちのいずれかからの相対を示す. - stat() + stat ファイルに関するStat構造体を返す(Struct を参照). @@ -1765,29 +1982,85 @@ Single Methods: filenameの最終アクセス時刻を返す. - b(filename) - - filenameのファイルがブロックスペシャルファイルである時, 真を返 - す. - - c(filename) - - filenameのファイルがキャラクタスペシャルファイルである時, 真を - 返す. - ctime(filename) filenameの最終ステータス変更時刻を返す. chmod(mode, path, file...) - ファイルのパーミッションを変更する(cf chmod(2)). + ファイルのパーミッションを変更する(cf chmod(2)). 変更したファ + イル数を返す. chown(owner, group, file...) ファイルの所有者とグループを変更する(cf chown(2)). nilか-1を指 定することによって所有者やグループを現在のまま変えないでおくこ - とができる. + とができる. 変更したファイル数を返す. + + link(old, new) + + oldへのハードリンクnewを生成する. link(2)と同じ制限がある. + + mtime(filename) + + filenameの最終修正時刻を返す. + + readlink(path) + + シンボリックリンクpathの内容を文字列として返す. + + rename(from, to) + + ファイル名fromをtoに変更する. rename(2)参照. 既にtoという名前 + のファイルが存在する時にはまずそのファイルが削除される. + + stat(filename) + + filenameのファイルのStat構造体を返す. + + symlink(old, new) + + oldへのシンボリックリンクnewを生成する. + + truncate(path, length) + + pathで指定されたファイルを切り捨てて最大lengthバイトにする. + + type(filename) + + filenameのファイルのタイプを表す文字列を返す. 文字列は"file", + "directory", "characterSpecial", "blockSpecial", "fifo", + "link", "socket"のうちのいずれか一つである. + + unlink(file...) + + ファイルを削除する. ディレクトリの削除にはDir.rmdirを使うこと. + + utime(atime, mtime, file...) + + ファイルのアクセス時刻をatimeに, 修正時刻をmtimeに設定する. + atime, mtimeは数またはTimeクラスのインスタンスでなければならな + い. + + これ以外にFileTestモジュールのメソッドも特異メソッドとして持つ. + +*** FileTest(モジュール) + +ファイルテスト用メソッドを集めたモジュール. インクルードして用いること +もできる. + +Methods: +Single Methods: + + b(filename) + + filenameのファイルがブロックスペシャルファイルである時, 真を返 + す. + + c(filename) + + filenameのファイルがキャラクタスペシャルファイルである時, 真を + 返す. executable(filename) x(filename) @@ -1829,14 +2102,6 @@ Single Methods: filenameのファイルがソケットである時, 真を返す. - link(old, new) - - oldへのハードリンクnewを生成する. link(2)と同じ制限がある. - - mtime(filename) - - filenameの最終修正時刻を返す. - owned(filename) O(filename) @@ -1847,15 +2112,6 @@ Single Methods: filenameのファイルを読みとり可能の時, 真を返す. - readlink(path) - - シンボリックリンクpathの内容を文字列として返す. - - rename(from, to) - - ファイル名fromをtoに変更する. rename(2)参照. 既にtoという名前 - のファイルが存在する時にはまずそのファイルが削除される. - R(filename) filenameのファイルを実uid/gidで読みとり可能の時, 真を返す. @@ -1881,24 +2137,6 @@ Single Methods: filenameのファイルのstickyビットがセットされている時, 真を返す. - symlink(old, new) - - oldへのシンボリックリンクnewを生成する. - - truncate(path, length) - - pathで指定されたファイルを切り捨てて最大lengthバイトにする. - - unlink(file...) - - ファイルを削除する. ディレクトリの削除にはDir.rmdirを使うこと. - - utime(atime, mtime, file...) - - ファイルのアクセス時刻をatimeに, 修正時刻をmtimeに設定する. - atime, mtimeは数またはTimeクラスのインスタンスでなければならな - い. - writable(filename) w(filename) @@ -2002,7 +2240,7 @@ Methods: coerce(num) numをfloatに変換する. ただし現時点でFloatが理解できる他の数は - Fixnumだけである. + FixnumとBignumだけである. to_f @@ -2010,7 +2248,7 @@ Methods: to_i - floatを整数に変換した結果を返す. + selfを整数に変換した結果を返す. Single Methods: @@ -2024,13 +2262,9 @@ Ruby組み込みのgarbage collectorの制御を行なうためのモジュール. このモ ジュールのメソッドをを用いることによって, 一時的にGCを止めたり, GCの起 きるタイミングを制御したりできる. -更にgcは始まる時にこのモジュールのstart_hookメソッドを, 終った時には -end_hookメソッドを呼び出すため, これらメソッドを定義することによって -hookをかけることができる. - Methods: - garbage_collect + + garbage_collect GCを開始する. 「GC.start」と同義. @@ -2048,6 +2282,33 @@ Single Methods: GCを開始する. +*** Glob(クラス) + +ワイルドカードのクラス. ワイルドカードのリテラルは<...>という形式であ +る. 正規表現とほぼ同じように使えるが, こちらは機能が少ない. ただし, ワ +イルドカードの展開機能がある. + +SuperClass: Object + +Included Modules: Enumerable + +Methods: + + self =~ string + + ワイルドカードが文字列にマッチした場合には真を, しない場合は + nilを返す. + + each + + ワイルドカードにマッチするファイル名を返すイテレータ. + +Single Methods: + + new(string) + + 文字列をワイルドカードに変換したオブジェクトを返す. + *** Integer(クラス) 整数クラス. 実際はその大きさによってFixnumとBignumいう二つのサブクラス @@ -2096,7 +2357,7 @@ Methods: 例: - $stdout << 1 << " is a " << Fixnum + $stdout << 1 << " is a " << Fixnum << "\n" close @@ -2115,6 +2376,7 @@ Methods: すFixnumである. fileno + to_i IOオブジェクトが使っているファイルディスクリプタ(Fixnum)を返す. @@ -2125,7 +2387,7 @@ Methods: getc 一行読み込んで, 読み込みに成功した時にはその文字列を返す. ファ - イルの終りに到達した時にはnilを返す. 関数的メソッドのgetc()は + イルの終りに到達した時にはnilを返す. カーネルメソッドgetc()は $stdin.getcと同じ意味である. gets @@ -2146,6 +2408,10 @@ Methods: lengthバイト読み込んで, その文字列を返す. lengthが省略された時 には, 全てのデータを読み込む. + readlines + + ファイルを全て読み込んで各行を要素としてもつ配列を返す. + sync 現在の出力同期モードを真偽値で返す. 同期モードが真の時は出力関 @@ -2158,16 +2424,17 @@ Methods: sysread(length) stdioを経由せずにread(2)を用いて入力を行なう. 入力されたデータ - を含む文字列を返す. ファイルの終りに到達した時にはnilを返す. + を含む文字列を返す. ファイルの終りに到達した時にはnilを返す. read(2)の性質により必ずlengthバイトの文字列が読み込まれるわけ ではない. gets()やgetc()などstdioを経由するメソッドと混用する - ことはバッファリングの不整合などで, 思わぬ動作をすることがある. + ことはバッファリングの不整合などで思わぬ動作をすることがある. syswrite(str) - stdioを経由せずに, wirte(2)を用いて出力を行なう. このメソッド - はバッファリングなどstdioがしてくれることは一切行なわない. - print()やprintf()とsyswrite()を混用するのは推奨できない. + stdioを経由せずに, write(2)を用いて出力を行なう. このメソッド + はバッファリングなどstdioがしてくれることは一切行なわない. + syswriteは実際に書き込んだバイト数を返す. print()やprintf()と + syswrite()を混用するのは推奨できない. write(str) @@ -2179,14 +2446,14 @@ Single Methods: printやprintfのデフォルトの出力先を返す. 初期値は$stdout. - default= + default=(io) デフォルトの出力先を指定する. *** Kernel(クラス) -全てのクラスの基底クラス. Ruby組み込みの全ての関数的メソッドはこのク -ラスで定義されている. +全てのクラスの基底クラス. Ruby組み込みの全ての関数的に呼ばれるメソッド +はこのクラスで定義されている. SuperClass: なし @@ -2197,8 +2464,8 @@ Methods: 否定. Non-nilのオブジェクトの場合常に偽(nil)を返す. このメソッ ドはNilクラスでは再定義され真を返す. - equal(other) self == other + equal(other) オブジェクトの一致判定. レシーバと引数の引数が一致する時, 真を 返す. Kernelクラスの定義では双方のオブジェクトが同一の時真を返 @@ -2217,13 +2484,13 @@ Methods: self =~ other - マッチ. デフォルトは"=="と同じである. "=~"はcaseの比較にも用い - られる. + マッチ. デフォルトの動作は"=="と同じである. "=~"はcaseの比較に + も用いられる. !~ - "=~"の否定. 内部で"=~"メソッドを呼び出しているので, 再定義する - 必要はない. + "=~"の否定. 内部で"=~"メソッドを呼び出しているので, こちらは再 + 定義する必要はない. self :: other @@ -2254,7 +2521,7 @@ Methods: オブジェクトのハッシュ値(Fixnum)を返す. Dictクラスでキーとなる オブジェクトを格納するのに用いられている.「A == B」が成立する 時は必ず「A.hash == B.hash」が成立する必要があるので, "=="を再 - 定義した時にはこちらもそれに合わせて再定義すること. + 定義した時には必ずこちらもそれに合わせて再定義すること. *** Math(モジュール) @@ -2309,7 +2576,7 @@ SuperClass: Object Methods: - attr(name[, public]) + + attr(name[, public]) そのモジュールをインクルードしたクラスのインスタンスに対して nameで指定される属性を付加し, 属性に対するアクセスメソッドを定 @@ -2390,6 +2657,10 @@ Methods: 商と剰余の2要素の配列を返す. + next + + 次の数を返す. 次の数とはその数を越える最小の整数である. + *** Object(クラス) 全ての通常クラスのスーパクラス. このクラスのサブクラスでないクラスは @@ -2410,9 +2681,9 @@ Methods: clone - オブジェクトの複製を作る. Fixnum以外のクラスの場合, 恐らくは - 「obj.eqaul(obj.clone)」は偽であるが, 多くの場合「obj == - obj.clone」は真である. + オブジェクトの複製を作る. インスタンスが即値であるFixnumクラス + 以外のクラスの場合,「obj.equal(obj.clone)」は偽であるが, 多く + の場合「obj == obj.clone」は真である. to_s @@ -2587,7 +2858,7 @@ Single Methods: 正規表現のクラス. 正規表現のリテラルは/.../という形式で表すが, 動的に 生成するためには - Regexp.compile(文字列) + Regexp.new(文字列) とする. ただし, Stringクラスの`=~'を始めとして多くのメソッドは正規表現 の替わりに文字列が与えられた時には内部的に正規表現を生成するので, 生成 @@ -2598,7 +2869,6 @@ SuperClass: Object Methods: - self =~ string 正規表現が文字列にマッチした場合, マッチした位置を返す. マッチ @@ -2611,6 +2881,7 @@ Methods: Single Methods: complie(string) + new(string) 文字列を正規表現に変換したオブジェクトを返す. @@ -2646,7 +2917,7 @@ Methods: ソケットの以降の接続を終了させる. howが0である時, 以降の受信が, howが1である時は, 以降の送信が拒否される. howが2の時には, それ - 以降の送信, 受信ともに拒否される. + 以降の送信, 受信ともに拒否される. shutdown(2)を参照. *** String(クラス) @@ -2758,47 +3029,28 @@ Methods: 変換する. length + size 文字列の長さ(バイト数)を返す. next - 「次の」文字列を返す. 次の文字列とは数字は数字として,英文字は - 英文字として増加し, 桁上がりの処理が行なわれた者である. - - "aa".next == "ab" - "99".next == "100" - "a9".next == "b0" - - このメソッドはRange:eachで用いられているので, 以下のような処理 - が可能である. - - for i in "a" .. "ba" - print(i, "\n"); - end - - これはa, b, c, .. aa, .. az, baまでを各行に出力する. - - - 気を付けなければいけないのは, この終了判定は大小関係ではなく - `=='で判定されているため, `..'演算子の左辺の値に続く文字列に右 - 辺の文字列が含まれていない, 以下の例のような場合は無限ループに - 陥ってしまう. - - for i in "0" .. "1a" - print(i, "\n"); - end + selfからendまで「次の」文字列を返す. 次の文字列とは数字は数字 + として,英文字は英文字として増加し, 桁上がりの処理が行なわれた + ものである. - 作者はこう書くことによって責任を逃れてようとしていると考える人 - もいるかもしれない. その推測は正しい. + "aa".next => "ab" + "99".next => "100" + "a9".next => "b0" oct 文字列を8進数を表す文字列と解釈して, 整数に変換する. 8進数の - 定義は/[0-7]+/であり, この定義に当てはまらない文字列に対しては - 0を返す. perlとは違って文字列が0xから始まっているからといって - 16進数だと見なしてくれたりはしない. それらは8進数ではないので0 - を返す. + 定義は/[0-7]+/であり, 文字列の先頭からこのパターンにマッチする + 部分を整数に変換する. この定義に全く当てはまらない文字列に対し + ては0を返す. perlとは違って文字列が0xから始まっているからといっ + て 16進数だと見なしてくれたりはしない. それらは先頭の0が8進数 + と認識され, 0を返す. reverse @@ -2844,6 +3096,16 @@ Methods: の内容に置き換えられる. sub()はgsub()と異なり, 最初のマッチだ けを置換する. + sum([bits]) + + 文字列のbitsビットのチェックサムを得る. 省略値は16である. ruby + では以下のコードでSystem Vの`sum'プログラムと同じ値を得られる. + + while gets() + sum += $_.sum + end + sum %= 65536 + to_f 文字列をFloatに変換する. @@ -2918,6 +3180,36 @@ Methods: X 1バイト後退 @ 絶対位置への移動 + rubyのunpackはperlと違ってチェックサムの計算機能がないことに注 + 意すること. + + upto(end) + + selfから始まって, endまで「次の」文字列を順に与えるイテレータ. + 次の文字列とはstr.nextで与えられる文字列である. + + このメソッドはRange:eachで用いられているので, 以下のような処理 + が可能である. + + for i in "a" .. "ba" + print(i, "\n"); + end + + これはa, b, c, .. aa, .. az, baまでを各行に出力する. + + + 気を付けなければいけないのは, この終了判定は大小関係ではなく + `=='で判定されているため, `..'演算子の左辺の値に続く文字列に右 + 辺の文字列が含まれていない, 以下の例のような場合は無限ループに + 陥ってしまう. + + for i in "0" .. "1a" + print(i, "\n"); + end + + 作者はこう書くことによって責任を逃れてようとしていると考える人 + もいるかもしれない. その推測は正しい. + Single Methods: new(string) @@ -2930,20 +3222,24 @@ Single Methods: データをまとめる時には配列クラスが用いられることもあるが(例: select), 構造体を使うべき時は以下のような場合である. - (1) 要素の数が多い + (1) 要素の数が固定 + + 要素の数が変動するものは構造体を使うのには向かない. + + (2) 要素の数が多い 人間が一度に容易に扱える概念の数は7つまでであるという仮説がある. - この仮説に従えば, データが4つ以上の場合は配列を用いた場合, 要素 - 数*2(つまりオフセットとその意味)が7を越える. よって, そのような - 場合には構造体を使った方が理解しやすいと思われる. + この仮説に従えば, 要素が4つ以上あるデータの場合は配列を用いた場 + 合, 要素数*2(つまりオフセットとその意味)が7を越える. よって, そ + のような場合には構造体を使った方が理解しやすいと思われる. - (2) 同時に大量に生成されない + (3) 同時に大量に生成されない - 構造体は配列よりも若干生成コストが高いので, 速度が問題になる場合 - には, (同時に大量に生成される場合など)は構造体の使用が適切でない + 構造体は配列よりも若干生成コストが高いので, 速度が問題になる場合 + (例えば同時に大量に生成される場合など)は構造体の使用が適切でない 可能性がある. -各構造体にはメンバ名と同名の引数のないメソッドが定義されている. +各構造体にはメンバ名と同名の引数のないメソッドが定義される. 本ドキュメント内で, 構造体を表現するためには以下の形式を使う. @@ -3079,8 +3375,7 @@ Included Modules: Comparable Methods: - self == other - self > other + self <=> other otherはTimeのインスタンスか整数. 整数が与えられた場 合には1970年 1月 1日 00:00:00 GMTからの秒数であると @@ -3107,7 +3402,7 @@ Methods: localtime タイムゾーンの修正を行なった時刻を得る(デフォルト). localtime - も自分自身を返す. + は自分自身を返す. to_i tv_sec |