diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec | 1109 |
1 files changed, 687 insertions, 422 deletions
@@ -1,6 +1,6 @@ .\" spec - -*- Indented-Text -*- created at: Tue May 25 15:18:26 JST 1993 -* はじめに(なぜRubyか?) +* はじめに Rubyは「UNIXで手軽にオブジェクト指向プログラミング」をしたいという望み を実現するために生まれた.そのために必要だと思われた性質は: @@ -41,57 +41,75 @@ Rubyのオブジェクト指向機能について学べば,より強力なこともできるように イルをリンクできるし,そうでなくてもRubyを再コンパイルして組み込みクラ スを追加するのは容易である(Perlなどよりもはるかに容易である). -* Rubyの文法 +* Lexical structure -ここではRuby言語の文法を解説する.Rubyの基本的な部分は小さく,文法に例 -外が少ないので身につけるのはさほど難しくないだろう. +現在のrubyの実装はキャラクタセットとしてASCIIを用いる.rubyは大文字と +小文字を区別する.識別子の途中でなければ任意のところに空白文字をおくこ +とが出来る.空白文字はスペース(space),タブ(tab),垂直タブ(vertical +tab), CR(carriage return),改頁(form feed)である.改行(newline)は明ら +かに式が継続する場合には空白文字として,それ以外では文の区切りとして解 +釈される. + +識別子は英文字("_"を含む)から始まり,英数字が続いたものである.rubyの +識別子の長さに制限はない.現在の実装は識別子としてマルチバイトコード +(EUC,SJIS)も通すが勧められない. + +グローバル変数名は"$"に続く識別子または記号1文字,インスタンス変数は +"@"に続く識別子,クラス定数は"%"に続く識別子である.メソッド名,ローカ +ル変数名とクラス名は単なる識別子を用いる. ** コメント -スクリプト言語の習慣にならい,文字列中以外の'#'から行末まではコメント -と見なす. +スクリプト言語の習慣にならい,文字列中や文字表現(?#)以外の`#'から行末 +まではコメントと見なす. + +** 予約語 + +予約語は以下の通りである + + alias else in resque when + and elsif include retry while + break end module return yield + case ensure nil self __END__ + class fail or super __FILE__ + continue for protect then __LINE__ + def if redo undef -** 区切り記号 +予約語はクラス名,メソッド名,変数名などに用いることはできない. -空白文字(タブとスペース)および改行(\n)が区切り記号となる.更に -改行は +** 区切り文字 + +文字列などのリテラルの内部以外の場所の空白文字(タブとスペース)および改 +行(\n)が区切り記号となる.更に改行は a + b -のように行が式(文)の途中で終り,次の行に続くことが明白な場合以外は文の -区切りとしても認識される. +のように行が式の途中で終り,次の行に続くことが明白な場合を除き,式の区 +切りとしても認識される. -** 予約語 +* プログラム -予約語は以下の通りである +例: - alias elsif module self yield - and end nil super __END__ - break ensure or then __FILE__ - case fail protect undef __LINE__ - class for redo unless - continue if resque until - def in retry when - else include return while + print "hello world!\n" -予約語はクラス名,メソッド名,変数名などに用いることはできない. +プログラムは式を並べたものである.式と式の間はセミコロン(`;')または改 +行で区切られる(※). -** 式 +※ 式が次の行に継続することが明白な時には改行は式の区切りにならない. -Rubyプログラムを構成する要素は式と文である.まず,式から解説する. +* 式 -*** リテラル +Rubyではnilが偽,それ以外が真と評価される.CやPerl などとは異なり,0や +""(空文字列)は偽とは評価されないので気をつけること. -プログラム中に直接記述できるオブジェクトをリテラルと呼ぶ.Rubyのリテラ -ルには文字列,正規表現,数値というリテラルがある. - -**** 文字列リテラル +** 文字列式 "..." # バックスラッシュの解釈と変数展開あり '...' # バックスラッシュの解釈なし(\\と\'は解釈する) -**** バックスラッシュ記法 +バックスラッシュ記法 \t タブ(0x09) \n 改行文字(0x0a) @@ -108,14 +126,21 @@ Rubyプログラムを構成する要素は式と文である.まず,式から解説する. \M-c メタ文字(c|0x80) \それ以外 文字そのもの -**** 変数展開 +変数展開 ダブルクォート(`"')で囲まれた文字列と正規表現の中では `#{変数名}'とい う形式で変数の内容を展開することができる.変数が変数記号(`$',`@',`%') で始まる場合には`#変数名'という形式でも展開できる.文字`#'に続く文字 が `{',`$',`@',`%'でなければ,そのまま`#'として解釈される. -**** 正規表現リテラル +** コマンド出力 + +Rubyではshのようにコマンドの実行結果を文字列リテラルのように使うことが +できる.``で囲まれた文字列は,ダブルクォートと同様にバックスラッシュ記 +法の解釈と変数展開が行なわれた後,コマンドとして実行され,その実行結果 +が文字列として与えられる.コマンドは評価されるたびに実行される. + +** 正規表現式 /.../ @@ -139,18 +164,20 @@ Rubyプログラムを構成する要素は式と文である.まず,式から解説する. | 選択 ( ) 正規表現をまとめる -その他に文字列と同じバックスラッシュ記法も有効である. +その他に文字列と同じバックスラッシュ記法や変数展開も有効である. -**** ワイルドカードリテラル +** ワイルドカード式 <...> * 任意の文字列(空文字列を含む)と一致 ? 任意の1文字と一致 [ ] []内のいずれか1文字と一致 - {..} {}内のいずれかの文字列と一致 + {..} {}内の(コンマで区切られた)いずれかの文字列と一致 + +その他に文字列と同じバックスラッシュ記法や変数展開も有効である. -**** 数値リテラル +** 数値リテラル 123 整数 -123 整数(符合つき数) @@ -164,19 +191,12 @@ Rubyプログラムを構成する要素は式と文である.まず,式から解説する. ?\M-a メタaのコード(225) ?\M-\C-a メタ-コントロールaのコード(129) - \シンボル 識別子/変数名と一対一対応する整数.applyなどでメソッ - ドを指定するのに使う. + :シンボル 識別子/変数名/演算子と一対一対応する整数.applyなど + でメソッドを指定する時などに使う. ?表現では全てのバックスラッシュ記法が有効である. -*** コマンドの出力 - -Rubyではshのようにコマンドの実行結果を文字列リテラルのように使うことが -できる.``で囲まれた文字列は,ダブルクォートと同様にバックスラッシュ記 -法の解釈と変数展開が行なわれた後,コマンドとして実行され,その実行結果 -が文字列として与えられる.コマンドは評価されるたびに実行される. - -*** 変数参照 +** 変数と定数 Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, その種類は変数名の最初の一文字で決定される.通常の変数の2文字目以降は @@ -184,20 +204,35 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, 変数がある.変数名の長さに関して特別な制限はない. 変数のスコープに関わらず,初期化されていない変数を参照した時の値はnil -である. +である.いずれの種類の変数も宣言は必要ない. -**** グローバル変数 +*** グローバル変数 + +例: + + $foobar + $/ `$'で始まる変数のスコープはグローバルであり,プログラムのどこからでも 参照できる.その寿命はプログラムの寿命と等しい. -**** インスタンス変数 +*** インスタンス変数 + +例: + + @foobar `@'で始まる変数はインスタンス変数であり,そのクラスまたはサブクラスの メソッドから参照できる.スコープはメソッド内であり,その寿命はオブジェ クトの寿命に等しい. -**** クラス名/モジュール名/ローカル変数 +*** クラス名/モジュール名/ローカル変数 + +例: + + Array + Math + foobar アルファベットまたは`_'で始まる変数は識別子とも呼ばれ,ローカル変数, クラス名またはモジュール名である. @@ -231,15 +266,18 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, ローカル変数のスコープも寿命もそのブロックの終りまで(トップレベルのロー カル変数はプログラムの終了まで)である. -**** クラス変数(定数) +*** クラス定数 -`%'で始まる変数はクラス変数であり,そのクラスと全てのサブクラスのイン -スタンスから参照できる.この変数への代入はトップレベル,すなわちメソッ -ドが定義できるレベルでのみ可能である.この変数はクラス間で値が共有され, -一度代入するとメソッドからは値を変更することができないので,定数として -用いられる. +例: + + %foobar + +`%'で始まる変数はクラス定数であり,そのクラスと全てのサブクラスのイン +スタンスから参照できる.この定数へはトップレベル,すなわちメソッドが定 +義できるレベルでのみ代入可能である.この変数はクラス間で値が共有され, +一度代入すると値を変更することができない. -**** 疑似変数 +*** 疑似変数 通常の変数以外に疑似変数と呼ばれる特殊な変数が4つある. @@ -251,31 +289,109 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, これらの疑似変数は代入によってその値を変更することはできない.これらの 変数への代入は例外を発生させる. -*** メッセージ式 +** 括弧によるグルーピング + +例: + + (1+2)*3 + (foo();bar()) + +式は括弧によってグルーピングすることができる. + + `(' 式 `)' + +括弧の中には単なる式だけではなく,式の並び(=プログラム)を置くことが出 +来る. + + `(' 式 `;' 式... `)' + +式の並びの値は最後に評価した式の値である.つまりの値は最後に評価した式 +の値になる. + +** 配列式 + +例: + + [1, 2, 3] + +配列はArrayクラスのインスタンスである.配列を生成する式は以下の形式で +ある. + + `[' 式, ... `]' + +それぞれの式を評価した結果を含む配列を返す.要素数が0の空配列を生成す +るためには空の配列式 + + `[' `]' + +を用いる. + +** 連想配列式 + +例: + + {1=>2, 2=>4, 3=>6} + +連想配列とは任意のオブジェクトをキー(添字)として持つ配列である.Ruby +の連想配列はDict(辞書)クラスのインスタンスである.詳細はクラスDictの項 +を参照されたい.連想配列を生成する連想配列式は以下の形式である. + + `{' 式 `=>' 式... `}' + +それぞれの式を評価した結果をキーと値とする連想配列オブジェクトを返す. +要素数が0の連想配列を生成するためには空の連想配列式 + + `{' `}' + +を用いる.要素が1つ以上ある場合,曖昧でなければ`{', `}'は省略できる. + +** メソッド呼出式 + +例: + + foo.bar() + foo.bar + bar() オブジェクトにメッセージを送る基本的な構文がメッセージ式であり,その基 本形式は以下の通りである. - 式1 '.' メソッド名 '(' 引数1... [',' '*' 引数n ]')' + 式1 `.' メソッド名 `(' 引数1... [`,' `*' 引数n ]`)' 式1を評価して得られるオブジェクトの,識別子で指定されるメソッドを呼び -出す.一番最後の引数が'*'に続く(単一の)式である場合,その式を評価した -結果(配列である必要がある)を展開して,引数として追加する. +出す.一番最後の引数が`*'に続く(単一の)式である場合,その式を評価した +結果(配列でなければ変換される)を展開して,引数として追加する. + +メッセージ式で,レシーバがselfの場合,レシーバを省略して通常のプログラ +ミング言語における関数のような形式でメソッドを呼び出すことができる. -引数が一つもない時には括弧を省略できる. +メソッド呼び出しでは曖昧さがない時には括弧を省略できる.曖昧さがある時 +とは第一引数が以下の文字または予約語で始まる場合である. + + (, [, {, <, /, %, +, -, if, while + +例: + foo bar+baz # メソッド呼び出しfoo(bar+baz) + foo (1+2)*5 # メソッド呼び出し(foo(1+2)) * 5 + foo 1 # メソッド呼び出しfoo(1) + foo -1 # ローカル変数foo - 1 + +レシーバを指定したメソッド呼び出しではの場合引数が1つもない時にも括弧 +を省略できる. メソッド名としては任意の識別子を用いることができる.変数名とは識別子の 名前空間が違うので重複しても構わない. -メッセージ式で,レシーバがselfの場合,レシーバを省略して通常のプログラ -ミング言語における関数のような形式でメソッドを呼び出すことができる.こ -の場合引数が1つもない時でも括弧の省略はできない. - -クラス定義文の外で指定されたメソッドとクラスModuleのnoexportメソッドで +クラス定義文の外で指定されたメソッドとクラスModuleのunexportメソッドで 指定されたメソッドは関数的メソッドと呼ばれ,関数形式でしか呼び出すこと -ができない. +ができない(DEF参照). + +** SUPER -*** スーパークラスのメソッド呼び出し +例: + + super + super(1,2,3) メッセージ式の特殊なケースとしてスーパークラスのメソッドの呼び出しがあ る.この形式はメソッドを再定義した時にスーパークラスの定義を利用するた @@ -284,70 +400,106 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, super 現在のメソッドに与えられた引数のままスーパクラスの同名のメソッドを呼び -出す. +出す.引数として与えられた変数の値を変更しても,渡されるのは元の引数の +値である. - super'(' 引数... ')' + super`(' 引数... `)' 引数とともにスーパークラスの同名のメソッドを呼び出す.一番最後の引数が -`*'に続く場合は通常のメソッド呼び出しと同様に渡される. +`*'に続く場合は通常のメソッド呼び出しと同様に展開して渡される. -*** 配列式/連想配列式 +** 代入 -配列のオブジェクトを生成する式の形式は以下の形式である. +例: - '[' 式, ... ']' + foo = bar + foo[0] = bar + foo.bar = baz -それぞれの式を評価した結果を含む配列を返す.要素数が0の空配列を生成す -るためには空の配列式 +代入には変数に対する代入(真の代入)と,プログラムを簡単にするためのシン +タックスシュガーとしての代入がある.真の代入は以下の形式である. - '[' ']' + 変数 `=' 式 -を用いる. +これは式を評価し,変数の値として代入する.クラスやモジュールや疑似変数 +には代入できない.クラスやモジュールの定義を変更するためにはclass式, +module式を用いる.代入式は演算子形式をとっているが,メソッドではないの +で再定義することはできない. -** 連想配列式 +シンタックスシュガーとしての代入式は以下のものがある. -連想配列とは任意のオブジェクトをキー(添字)として持てる配列である.Ruby -では連想配列はSmalltalkの用語を借りてDict(辞書)とも呼ばれる.詳細はク -ラスDictの項を参照されたい.連想配列を生成する連想配列式は以下の形式で -ある. +配列要素への代入 - '{' 式 '=>' 式... '}' + 式1`[' 式2... `]' `=' 式n -それぞれの式を評価した結果をキーと値とする連想配列オブジェクトを返す. -要素数が0の連想配列を生成するためには空の連想配列式 +式1を評価して得られるオブジェクトに,式2から式nまでを引数として,"[]=" +というメソッドを呼び出す. - '{' '}' +属性代入 -を用いる. + 式1 `.' 識別子 `=' 式2 + +式1を評価して得られるオブジェクト(レシーバが省略された場合は`self')に +対して,"識別子="というメソッドを式 2を引数として呼び出す. + +** 自己代入 + +例: + + foo += 12 + +式の値そのものに演算を加えるために自己代入形式がある. + + 式1 op= 式2 # 式1は代入可能でなければならない. + +この形式は内部的に「式1 = 式1 op 式2」と同様に評価される.ただし,式1 +は1回しか評価されないので,式1に副作用がある場合は,「式1 = 式1 op 式2」 +とは動作が異なる結果となる.opとして使える演算子は + + +, -, *, /, %, **, &, |, ^, <<, >> + +の11種類である.演算子と`='の間にスペースを空けてはいけない. -*** 配列参照,配列代入 +** 多重代入 -配列(連想配列を含む)の要素の参照は以下の形式で行なう. +例: - 式1 '[' 式2... ']' + foo, bar, baz = 1, 2, 3 + foo, = list() + foo, *rest = list2() -この形式は内部的に,式1に"[]"というメッセージを送ると解釈される.この -動作を疑似的なコードで記述すれば以下のようになる. +同時に複数の変数に代入を行なうことができる.その形式は以下の通りである. - 式1"[]"(式2...) + 左辺 `,' [左辺 `,' ...] [`*' 左辺]= 式 [, 式...] -一方,配列要素の代入は +右辺の式が一つしかない場合は,その値を配列として(必要ならばto_aメソッ +ドで配列に変換して),要素をそれぞれ左辺に代入する.それ以外の場合には, +それぞれの式の値が左辺に代入される.左辺の数と右辺の要素の数が合わない +時には足りない変数には nilが代入され,余った要素は無視される.多重代入 +の最後の要素の前に`*'がある場合,残りの全て引数が配列として代入される. - 式1 '[' 式2... ']' '=' 式n + 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."[]="(式2...) +** 演算子式 -という形式として解釈される. +例: -*** 演算子形式 + 1+2*3/4 プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形 式をとる.Rubyには以下にあげる演算子がある.上のものほど結合順位が強く, 同じ列の演算子の結合順位は同じである. - 強 -(unary) +(unary) ! ~ + 強 [](配列参照), []=(配列代入) + -(unary) +(unary) ! ~ ** * / % + - @@ -362,110 +514,77 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され, :: =(代入) 自己代入(+=, -=, ..) and - 弱 or + or + 弱 if修飾子 while修飾子 ほとんどの演算式にはメソッド呼び出しとして解釈される(クラス毎に再定義 できる)が,一部再定義できない特殊なものがある.再定義できない特殊演算 子は - &&(論理積), ||(論理和), =(代入), ...(範囲指定), and, or + =(代入), ...(範囲), !(否定), &&(論理積), and, |(論理和), or, + if修飾子, while修飾子 -の6つである. +の9つの演算子とこれらとの組み合わせになる !=, !~ および自己代入演算子 +である. -上であげた特殊演算子以外の演算子形式はメソッド呼び出しと見なされる. -単項演算子(+, -, !, ~)は - - 式1."演算子"() - -という形式に,それ以外の2項演算子は - - 式1."演算子"(式2) - -に解釈される. - -** 代入 +上であげた特殊演算子以外の演算子形式は以下のようなメソッド呼び出しと見 +なされる. -代入には変数に対する代入(真の代入)と,プログラムを簡単にするためのシン -タックスシュガーとしての代入がある.真の代入は以下の形式である. - - 変数 '=' 式 +単項演算子(+, -, ~) -これは式を評価し,変数の値として代入する.クラスやモジュールや疑似変数 -には代入できない.クラスやモジュールの定義を変更するためにはclass文, -module文を用いる.代入式は演算子形式をとっているが,メソッドではないの -で再定義することはできない. + 式1. 演算子 () -シンタックスシュガーとしての代入式は以下のものがある. +配列(連想配列を含む)の要素の参照(式1 `[' 式2... `]') -配列要素への代入 + 式1. `[]' (式2...) - 式1'[' 式2... ' ]' '=' 式n +配列要素の代入( 式1 `[' 式2... `]' `=' 式n) -式1を評価して得られるオブジェクトに,式2から式nまでを引数として,"[]=" -というメソッドを呼び出す. + 式1. `[]=' (式2...) -属性代入 +それ以外の2項演算子(式 演算子 式) - 式1 '.' 識別子 '=' 式2 + 式1. 演算子 (式2) -式1を評価して得られるオブジェクトに対して"識別子="というメソッドを,式 -2を引数として呼び出す. +これはあくまでもそういう形式のメソッド呼び出しとして解釈されるというだ +けで,rubyプログラムでこういう記述が許されるというわけではない. -自己代入 - - 式1 op= 式2 # 式1は代入可能でなければならない. - -この形式は内部的に「式1 = 式1 op 式2」と同様に評価される.ただし,式1 -は1回しか評価されないので,式1に副作用がある場合は,「式1 = 式1 op 式2」 -とは動作が異なる結果となる.opとして使える演算子は - - +, -, *, /, %, **, &, |, ^, <<, >> - -の11種類である.演算子と`='の間にスペースを空けてはいけない. - -*** 条件分岐式 - -式の値によって分岐する式は以下に示すif式,unless式,case式の複合文型が -3種類と演算子型が3種類ある.Rubyではnilが偽,それ以外が真と評価される. -CやPerlなどとは異なり,0や ""(空文字列)は偽とは評価されないので気をつ -けること. - -if式 +** IF if 式1 [then] - 文1 + 式1 [elsif 式2 [then] - 文2 ]... + 式2 ]... [else - 文n ] + 式n ] end -条件判断式.式1が真の場合に文1を評価する.それ以外の場合は文2を評価す +条件判断式.式1が真の場合に式1を評価する.それ以外の場合は式2を評価す る.Rubyのif式はelse ifでもelifでもなくelsifでifの連続を行なうことに注 意すること. -unless式 +ifの条件判断部の式では文字列と正規表現リテラルは式「$_=~ リテラル」の +省略であるとみなされる. - unless 式1 [then] - 文1 - [else - 文2 ] - end +** IF修飾子 + + 式 if 式 -式1が偽(nil)を返すか,式2の評価中に例外が発生した場合に文1を評価する. -それ以外の場合は文2を評価する. +条件修飾子(if)の式は先行する式に先だって評価される.動作も対応するif式 +と同様である.if修飾子のついた式の値は条件が成立した場合には式の値,不 +成立の場合にはnilである. -case式 +** CASE case 式0 [when 式1 [, 式2]... [then] - 文1 ]... + 式1 ]... [else - 文n ] + 式n ] end 条件分岐,CのswitchよりもPascalのcaseに似ている.breakで脱出することも -後ろの文に継続することもないので注意. +後ろの式に継続することもないので注意. 条件の一致は「式n =~ 式0]で行なわれる.つまり, @@ -478,7 +597,7 @@ case式 stmt3 end -は以下のif文とほぼ等価である. +は以下のif式とほぼ等価である. _tmp = expr0 if expr1 =~ _tmp || expr2 =~ _tmp @@ -489,67 +608,77 @@ case式 stmt3 end -演算子型 +** AND 式 - 式1 '&&' 式2 - 式1 'and' 式2 + 式1 `&&' 式2 + 式1 `and' 式2 式1を評価し,その値が真(nil以外)であれば,式2を評価する.`and'は優先順 位が低い別名である. - 式1 '||' 式2 +andの両辺の式では文字列と正規表現リテラルは式「$_=~ リテラル」の省略で +あるとみなされる. + +** OR 式 + + 式1 `||' 式2 式1 'or 式2 式1を評価し,その値が偽であれば,式2を評価する.`or'は優先順位が低い別 名である. - 式1 '...' 式2 +orの両辺の式では文字列と正規表現リテラルは式「$_=~ リテラル」の省略で +あるとみなされる. -式1が真になるまでは偽を返し,その後は式2が真を返すまでは真を返す.式2 -が真になれば状態は偽に戻る +** 範囲指定式 -*** 繰り返し式(単純型) + 式1 `...' 式2 -ループを構成する式.これらの式の値は常にnilである.オブジェクトに合わ -せたループを行なうためには次に述べるイテレータを用いる. +式1が真になるまでは偽を返し,その後は式2が真を返すまでは真を返す.式2 +が真になれば状態は偽に戻る. -while式 +演算子`...'の両辺は条件式であり,更に `...'の両辺の式では文字列と正規 +表現リテラルは式「$_=~ リテラル」の省略,整数定数が「$.==定数」の省略 +と解釈される. - while 式 - 文 - end +** NOT 式 -条件が真の間,文を繰り返し実行する. + `!' 式 -until式 +式が真であれば偽,偽であれば真を返す. - until 式 - 文 - end - 式1 until 式2 +`!'式では文字列と正規表現リテラルは式「$_=~ リテラル」の省略であるとみ +なされる. -式が偽(nil)を返すか,式の評価中に例外が発生する間,文を繰り返し実行す -る. -*** 条件式について + 式1 `!=' 式2 + +「!(式1 == 式2)」の省略形 -if,unless,while,untilの条件判断部の式,および特殊演算子`&&', `||', -`...'の両辺の式は条件式と呼ばれる.条件式では文字列と正規表現リテラル -は式「$_=~リテラル」の省略であるとみなされる.更に演算子`...'の両辺で -は整数定数が「$.==定数」の省略と解釈される.条件式に現れる`!'演算子の -オペランドも条件式とみなされる. + 式1 `!~' 式2 -注意: 演算子`!'は特殊演算子ではないので,再定義を行なう場合に気をつけ -ること.条件式の中で +「!(式1 ~= 式2)」の省略形 + +** WHILE + + while 式 + 式 + end - ! 文字列リテラル - ! 正規表現リテラル +式を評価した値が真の間,式を繰り返し実行する.while式の値はnilである. -の形で呼び出されるメソッドの引数は,リテラルの表すオブジェクトではなく, -上記の比較の結果が与えられる.このため,原則的に`!'メソッドは再定義し -ない方が良い. +whileの条件判断部の式では文字列と正規表現リテラルは式「$_=~ リテラル」 +の省略であるとみなされる. -*** イテレータ(繰り返し子) +** WHILE 修飾子 + + 単純式 while 式 + +繰り返し修飾子(while)はまず先行する式を評価してから条件式を評価するの +で,最低一度は式を実行することになる.while修飾子のついた式の値はnilで +ある. + +** イテレータ(繰り返し子) イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの 一種である.コードの断片(ブロックと呼ばれる)を指定してイテレータを呼び @@ -561,205 +690,122 @@ if,unless,while,untilの条件判断部の式,および特殊演算子`&&', `||', イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの 一種である.イテレータの呼び出しは以下の構文で行なわれる. - 式 '{' 変数... '|' 文... '}' + 式 `{' 変数... `|' 式... `}' -「文」をブロックとして設定し,「式」のメソッドをイテレータとして評価す +「式」をブロックとして設定し,「式」のメソッドをイテレータとして評価す る.「式」のトップレベルのメソッドだけがイテレータとして呼び出され, レシーバを表す式や,引数の式はイテレータとしては呼び出されない.「式」 が複数の式を含む時,各々がイテレータとして順に呼ばれる. -イテレータ内でyield文が実行されると,そこで指定された値がdo文で指定さ +イテレータ内でyield式が実行されると,そこで指定された値がdo式で指定さ れた変数に代入され,ブロックが実行される.ブロックの実行が終了するとそ -の値は yield文の値として返される.あるメソッドがイテレータとして呼び出 +の値は yield式の値として返される.あるメソッドがイテレータとして呼び出 されたかどうかはメソッドiterator_p()の戻り値で知ることができる.中には Enumerableモジュールのgrepメソッドのようにイテレータとして呼ばれた時と 普通のメソッドとして呼ばれた時とで動作が異なるメソッドもある. +** FOR + オブジェクトの各要素に対して操作を行なうための形式も提供されている.形 式は以下の通り. for 変数.. in 式 - 文 + 式 end -式の各要素に対し文を実行する.これは以下の式と等価である. +式の各要素に対し式を実行する.これは以下の式と等価である. - (式).each '{' 変数.. '|' 文 '}' + (式).each `{' 変数.. `|' 式 `}' よって式の値のオブジェクトがメソッドeachを持たない場合,forを実行する と例外が発生する. -*** イテレータの中でのブロック呼び出し +** YIELD - yield '(' [式 [',' 式...]]) + yield `(' [式 [`,' 式...]]) yield イテレータの中でブロックの呼び出しを行なう.yieldを実行したメソッドが イテレータとして呼び出されていない時には例外が発生する.yield の値はブ ロックの戻り値である. -*** 例外処理 +yieldの引数の括弧は曖昧でない限り省略できる. + +** FAIL + + fail `(' [メッセージ] `)' + +例外を発生させる.メッセージが与えられた場合には発生したソースファイル +名,行番号をシステム変数`$@'に,メッセージを`$!'にセットする. + +failの引数の括弧は曖昧でない限り省略できる. + +** PROTECT 処理中に予期しない事態が発生した時には例外が発生する.Rubyでは例外を途 中で捕捉して,再試行したり,後処理を行なったりすることができる. protect - 文1 + 式1 [resque - 文2 ] + 式2 ] [ensure - 文3] + 式3] end -文1を実行し,その実行中に例外が発生すればresque節で指定された文2を実行 -する.更にensure節が存在する時はprotect文を終了する前に必ず(正常終了時 -だけでなく,例外, return, break, continue, redoなどによる脱出でも)文3 +式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] - -多重代入は単純文である.その値は(配列に変換された)右辺である. - -*** 制御文 - -制御の流れを変更する以下の文がある.これらは単純文である. +** RETURN -return文 - - return [式[',' 式...]] + return [式[`,' 式...]] 式の値を戻り値としてメソッドの実行を終了する.式が2つ以上与えられた時 には,それらを要素とする配列をメソッドの戻り値とする.式が一つもない場 合には nil が戻り値となる. -ループ制御文 +** BREAK - continue - redo break -上記3つはループ中で使う. - -continueはもっとも内側のループの次の繰り返しを始める.redoはループ条件 -のチェックを行なわず,現在の繰り返しをやり直す.break はループを脱出す -る.Cと違い,breakはもっとも内側のループを脱出する作用だけを持ち,case -を抜ける作用は持たない. - -retry文 +break はループを脱出する.Cと違い,breakはもっとも内側のループを脱出す +る作用だけを持ち,case を抜ける作用は持たない. - retry - -protect文のresque節で使い,protect文を始めから実行する.例外処理を行なっ -てから再試行するのに使う.resque節以外でretryが用いられた場合例外が発 -生する. - -fail文 - - fail '(' [メッセージ] ')' - fail [メッセージ] - -例外を発生させる.メッセージが与えられた場合には発生したソースファイル -名,行番号をシステム変数`$@'に,メッセージを`$!'にセットする. - -yield文 - - yield 式 [',' 式...] - -文としてyieldを用いることもできる.この場合は式を括弧で括る必要はない. - -*** メソッド呼び出し文 - -1つ以上の引数を持つメソッド呼び出す場合には曖昧さがなければ,引数を括 -弧で括る必要はない.その形式は以下の通りである. - - 式 '.' メソッド名 引数1 ',' [引数2...]['*' 引数n] - メソッド名 引数1 ',' [引数2...]['*' 引数n] - super 引数1 ',' [引数2... ]['*' 引数n] - -構文解析時に,式のように解釈できる場合は式としての解釈が優先される. +** CONTINUE + continue - foo bar+baz # メソッド呼び出しfoo(bar+baz) - foo (bar)+baz # メソッド呼び出しfoo(bar) + bar - foo 1 # メソッド呼び出しfoo(1) - foo -1 # ローカル変数foo - 1 +continueはもっとも内側のループの次の繰り返しを始める. -括弧のないメソッド呼び出し文は単純文である. +** REDO -*** 制御修飾子 + redo -単純文に制御修飾子を付加したものは文である(単純文ではない).修飾子は以 -下の4種類である. +redoはループ条件のチェックを行なわず,現在の繰り返しをやり直す. - 単純文 if 式 - 単純文 unless 式 - 単純文 while 式 - 単純文 until 式 +** RETRY -条件修飾子(if/unless)の式は先行する文に先だって評価される.動作も対応 -する条件分岐式と同様である. + retry -繰り返し修飾子(while/until)はまず先行する文を評価してから条件式を評価 -するので,最低一度は文を実行することになる. +protect式のresque節で使い,protect式を始めから実行する.例外処理を行なっ +てから再試行するのに使う.resque節以外でretryが用いられた場合例外が発 +生する. -*** クラス宣言文 +** クラス定義 -クラスを定義する構文は以下の通りである. +クラスを定義する構式は以下の通りである. - class クラス名 [':' スーパークラス名 ] + class クラス名 [`:' スーパークラス名 ] 定義実体 end クラス名は任意の識別子である(大文字で始めることを推奨する).クラス定義 -のネストはできないので他の定義文内ではクラスを定義できない. +のネストはできないので他の定義式内ではクラスを定義できない. -*** モジュール定義文 +** モジュール定義 -モジュールを定義する構文は以下の通りである. +モジュールを定義する構式は以下の通りである. module クラス名 定義実体 @@ -768,27 +814,13 @@ yield文 モジュール名は大文字で始まる識別子である.クラス同様,モジュール定義も ネストできない. -*** インクルード文 - -モジュールをインクルードすることによって,クラスまたはモジュールに機能 -を追加できる.モジュールをインクルードした場合,そのモジュール(および -そのモジュールが更にインクルードしているモジュール)の全てのメソッドを -受け継ぐ.別のいい方をすればインクルードは限定された多重継承といえる. - -他のモジュールをインクルードする構文は以下の通りである. - - include モジュール名 [',' モジュール名...] - -現在の定義中のクラスまたはモジュール(トップレベルではObjectクラス)に指 -定したモジュールをインクルードする. - -*** メソッド定義文 +** メソッド定義 通常(特異メソッドでない)メソッド定義の形式は以下の通りである.通常メソッ -ド定義はネストできないので,メソッド定義文中ではメソッド定義文を再び呼 +ド定義はネストできないので,メソッド定義式中ではメソッド定義式を再び呼 び出せない. - def メソッド名 ['(' 引数 [',' 引数...][',' '*'引数 ] ')'] + def メソッド名 [`(' 引数 [`,' 引数...][`,' `*'引数 ] `)'] 定義実体 end @@ -798,17 +830,22 @@ yield文 メソッドには関数的メソッドと通常メソッドがある.関数的メソッドは関数形 式でしか呼び出すことができず,よって該当するクラスとそのサブクラスのメ -ソッドからしか呼び出すことができない.クラス定義文の外にあるdef文は関 -数的メソッドを定義し,クラス定義文の中にあるdef文は通常のメソッドを定 -義する.メソッドの可視性はModuleクラスのexport/noexportメソッドを使っ -て変更する. +ソッドからしか呼び出すことができない. + +新規にメソッドを定義する場合,クラス定義式の外にあるdef式は関数的メソッ +ドを定義し,クラス定義式の中にあるdef式は通常のメソッドを定義する.スー +パークラスのメソッドを再定義する場合には定義されるメソッドの可視性はスー +パークラスのメソッドのものを受け継ぐ. -** 特異メソッド定義文 +メソッドの可視性を変更する場合にはModuleクラスのexport/unexportメソッ +ドを用いる. + +** 特異メソッド定義 メソッド定義にはもう一つ特異メソッドの定義がある.特異メソッドとはある 特定のオブジェクトに固有のメソッドである.形式は以下の通りである. - def 式 '.' メソッド名 ['(' 引数 [',' 引数...][',' '*'引数 ] ')'] + def 式 `.' メソッド名 [`(' 引数 [`,' 引数...][`,' `*'引数 ] `)'] 定義実体 end @@ -821,7 +858,21 @@ yield文 のサブクラスにも継承される.言い替えればクラスの特異メソッドは他のオブ ジェクト指向システムにおけるクラスメソッドの働きをする. -*** メソッドの別名定義文 +** INCLUDE + +モジュールをインクルードすることによって,クラスまたはモジュールに機能 +を追加できる.モジュールをインクルードした場合,そのモジュール(および +そのモジュールが更にインクルードしているモジュール)の全てのメソッドを +受け継ぐ.別のいい方をすればインクルードは限定された多重継承といえる. + +他のモジュールをインクルードする構式は以下の通りである. + + include モジュール名 [`,' モジュール名...] + +現在の定義中のクラスまたはモジュール(トップレベルではObjectクラス)に指 +定したモジュールをインクルードする. + +** ALIAS 以下の形式でメソッドに別名をつけることができる. @@ -831,28 +882,20 @@ yield文 ソッドが再定義されても,古いメソッドが呼び出されたのと全く同じ働きをす る. -*** メソッド定義取り消し文 +** UNDEF メソッドの定義を取り消すためにはundefを用いる. undef メソッド名 -識別子または文字列で指定したメソッドの定義を取り消す. +指定したメソッドの定義を取り消す. defによる別名定義とundefによる定義取り消しを使うとクラスのインタフェー -スをスーパークラスと独立に変更することができる.ただし,メソッドがself -にメッセージを送っている場合にはよく注意しないと既存のメソッドが動作し -なくなる可能性がある. - -------------------------------------------------------- -* Rubyの組み込み機能 +スをスーパークラスと独立に変更することができる.ただし,メソッドがself +にメッセージを送っている場合もあるので,よく注意しないと既存のメソッド +が動作しなくなる可能性がある. -Rubyプログラミングの基本はクラス,モジュールとそのメソッドの習得である. -Rubyには処理系そのものに以下の機能が組み込まれている.ライブラリをロー -ドすることによって機能は増えるが,それらに関してはそれぞれのライブラリ -のドキュメントを参照してもらいたい. - -** 関数 +* 組み込み関数 Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての 通常クラスから関数形式で呼び出せるので),関数的に用いられる.関数的に @@ -1081,7 +1124,7 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての 実装されていないマシンではflagsはいつもnilまたは0でなければな らない. -** システム変数 +* 組み込み変数と定数 $! エラーメッセージ.failで設定する. @@ -1180,7 +1223,6 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての $VERSION rubyのバージョンを示す文字列 -** システム定数 %TRUE t %FALSE nil @@ -1201,9 +1243,9 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての は完全には同義ではない.%FALSEに関しては,このような問題は生じ ない. -** クラス/モジュール +* 組み込みクラスとモジュール -*** Array(クラス) +** Array(クラス) 数字を添字とした配列のクラスである.生成は一般的には配列式``[...]''で 行なわれる. @@ -1385,7 +1427,13 @@ Methods: objを配列の先頭に追加する. -*** Bignum(クラス) +Single Methods: + + Array[item...] + + 引数を要素とする配列を生成する. + +** Bignum(クラス) 無限多倍長整数のクラス.演算の結果がこのFixnumの範囲内である場合には自 動的にクラスはFixnumに変換される.一般的にRubyプログラムではFixnumと @@ -1425,7 +1473,7 @@ Methods: 商と剰余の2要素の配列を返す. -*** Block(クラス) +** Block(クラス) イテレータに渡される手続きをまとめたオブジェクト.実行するコードだけで なくコンテキスト(ローカル変数)なども保存する. @@ -1434,7 +1482,7 @@ SuperClass: Object Methods: - do(arg[, ...]) + call(arg[, ...]) ブロックを実行する. @@ -1446,7 +1494,7 @@ Single Methods: が呼ばれると,その時点で実行されるべきコードを包み込んだオブジェ クト(Block)を生成する. -*** Class(クラス) +** Class(クラス) クラスのクラス.より厳密に説明するとクラスは特異メソッドを継承するため に,それぞれメタクラスと呼ばれる名前のないクラスをクラスとして持ち, @@ -1472,7 +1520,7 @@ Methods: ラスの特異メソッドによってオーバーライドされ,クラスによって引 数が異なる. -*** Comparable(モジュール) +** Comparable(モジュール) 比較演算を許すクラスのためのMixin.このモジュールをインクルードするこ とによって,`<=>'演算子を定義するだけで他の演算子はその定義を利用して @@ -1504,7 +1552,7 @@ Methods: selfがminとmaxの範囲内にある時真を返す. -*** Cons(クラス) +** Cons(クラス) データの組(ペア)を表現するクラス.通常,生成は`::'演算子を用いて行なわ れる.LispのCONSペアと同様にListを構成する形で用いられることもある. @@ -1561,7 +1609,7 @@ Methods: CONSペアからなるリストの各要素を与えるイテレータ. -*** DBM(クラス) +** DBM(クラス) NDBMファイルをアクセスするクラス.キー,データともに文字列でなければな らないという制限と,データがファイルに保存されるという点を除いては @@ -1657,7 +1705,7 @@ Single Methods: る.modeの省略値は0666である.modeとしてnilを指定するとデータ ベースが既に存在しない時には新たにオープンせず,nilを返す. -*** Dict(クラス) +** Dict(クラス) 辞書あるいは連想配列.任意のオブジェクトを添字とできる配列のクラスであ る.Hashという名前でもアクセスできる.連想配列オブジェクトの生成は一般 @@ -1740,11 +1788,15 @@ Methods: Single Methods: + Dict[key, value...] + + 奇数番目の引数をkey,偶数番目の引数をvalueとする辞書を生成する. + new 新しい(空の)辞書オブジェクトを返す. -*** Directory(クラス) +** Directory(クラス) ディレクトリ内の要素を順に返すディレクトリストリーム操作のためのクラス. Dirという名前でもアクセスできる. @@ -1808,7 +1860,7 @@ Single Methods: pathで指定されたディレクトリを削除する.ディレクトリは空である 必要がある. -*** Enumerable(モジュール) +** Enumerable(モジュール) 要素に対する繰り返しを行なうクラスのためのMixin.このモジュールをイン クルードするためには,メソッド`each'を定義する必要がある. @@ -1866,7 +1918,7 @@ Methods: 全ての要素をソートした配列を返す. -*** Etc(モジュール) +** Etc(モジュール) /etcディレクトリ以下の情報を得るためのモジュール.クラスにインクルード して使うこともできる. @@ -1938,7 +1990,7 @@ Single Methods: 全てのpasswdエントリを順にアクセスするためのイテレータ. -*** File(クラス) +** File(クラス) ファイルアクセスのためのクラス.メソッドopen()で生成される.また,この クラスの特異メソッドとしてtestのファイルテスト演算子相当のメソッドが定 @@ -2097,7 +2149,7 @@ Single Methods: これ以外にFileTestモジュールのメソッドも特異メソッドとして持つ. -*** FileTest(モジュール) +** FileTest(モジュール) ファイルテスト用メソッドを集めたモジュール.インクルードして用いること もできる. @@ -2203,7 +2255,7 @@ Single Methods: filenameのファイルが存在し,大きさが0である時,真を返す. -*** Fixnum(クラス) +** Fixnum(クラス) 31bit(マシンのlongの長さ-1 bit)整数のクラス.builtin classである.この クラスはpointer内の即値であるためcall by valueで呼び出される点が特徴的 @@ -2268,7 +2320,7 @@ Methods: イテレータ.selfからmaxまで繰り返す. -*** Float(クラス) +** Float(クラス) 浮動小数点数のクラス. @@ -2309,7 +2361,7 @@ Single Methods: floatと同じ値を持つ新しいFloatオブジェクトを返す. -*** GC(モジュール) +** GC(モジュール) Ruby組み込みのgarbage collectorの制御を行なうためのモジュール.このモ ジュールのメソッドをを用いることによって,一時的にGCを止めたり,GCの起 @@ -2335,7 +2387,7 @@ Single Methods: GCを開始する. -*** Glob(クラス) +** Glob(クラス) ワイルドカードのクラス.ワイルドカードのリテラルは<...>という形式であ る.正規表現とほぼ同じように使えるが,こちらは機能が少ない.ただし,ワ @@ -2362,7 +2414,7 @@ Single Methods: 文字列をワイルドカードに変換したオブジェクトを返す. -*** Integer(クラス) +** Integer(クラス) 整数クラス.実際はその大きさによってFixnumとBignumいう二つのサブクラス で実現されている.Integerはそれらのスーパークラスとなる抽象クラスであ @@ -2392,7 +2444,7 @@ Methods: いつも真を返す. -*** IO(クラス) +** IO(クラス) 入出力のための基本クラス. @@ -2493,7 +2545,7 @@ Methods: strを出力する.出力したバイト数を返す. -*** Kernel(クラス) +** Kernel(クラス) 全てのクラスの基底クラス.Ruby組み込みの全ての関数メソッドはこのクラス で定義されている.関数メソッドについては「関数」の項目を参照のこと. @@ -2565,7 +2617,7 @@ Methods: 定義した時には必ずこちらもそれに合わせて再定義すること. -*** Math(モジュール) +** Math(モジュール) 浮動小数点演算をサポートするクラス.Mathモジュールは同じ定義のメソッド と特異メソッドとの両方が定義されているので,特異メソッドを呼び出して使 @@ -2610,7 +2662,7 @@ Single Methods: xの立方根を返す. -*** Module(クラス) +** Module(クラス) モジュールのクラス. @@ -2665,7 +2717,7 @@ Methods: nameで指定されたメソッドを関数形式でだけ呼び出し可能にする.す でに関数メソッドである場合には何もしない. -*** Nil(クラス) +** Nil(クラス) 偽を表すオブジェクトnilのクラス.偽変数(の値)nilはNilクラスの唯一のイ ンスタンスである. @@ -2686,7 +2738,7 @@ Methods: 常に真を返す. -*** Numeric(クラス) +** Numeric(クラス) 数一般の性質を表す抽象クラス. @@ -2717,7 +2769,7 @@ Methods: 次の数を返す.次の数とはその数を越える最小の整数である. -*** Object(クラス) +** Object(クラス) 全ての通常クラスのスーパクラス.通常クラスのインスタンスの一般的な振舞 いを定義している.このクラスのサブクラスでないクラスはKernelとNilと, @@ -2727,6 +2779,9 @@ SuperClass: Builtin Methods: + init_object + + is_member_of(class) オブジェクトselfがクラスclassのインスタンスである時,真を返す. @@ -2752,7 +2807,7 @@ Methods: オブジェクトを配列に変換する.カーネルクラスで定義されているデ フォルトは,そのオブジェクト自身を含む1要素の配列を返す. -*** Process(モジュール) +** Process(モジュール) プロセスに関する操作を行なうためのモジュール.Mathモジュールと同様に全 てのメソッドは特異メソッドとしても通常のメソッドとしても使える. @@ -2827,7 +2882,7 @@ Single Methods: プロセスの現在の実UIDをuidにセットする. -*** Range(クラス) +** Range(クラス) 範囲オブジェクトのクラス.範囲オブジェクトは`..'演算子によって生成され, 一般的には以下のような使い方をする @@ -2855,7 +2910,7 @@ Methods: self =~ other selfがotherと同じクラスに対する範囲オブジェクトで,その範囲内 - にotherがある時(start <= other <= end),真を返す.これはcase文 + にotherがある時(start <= other <= end),真を返す.これはcase式 で範囲指定する時に便利である.例えば case i @@ -2867,7 +2922,7 @@ Methods: each - 範囲内に存在するオブジェクトを与えるイテレータ.主にfor文のた + 範囲内に存在するオブジェクトを与えるイテレータ.主にfor式のた めに用いられる. end @@ -2878,7 +2933,7 @@ Methods: 範囲の始点を返す. -*** Socket(クラス) +** Socket(クラス) SuperClass: BasicSocket @@ -2938,7 +2993,8 @@ Single Methods: ソケットのペアを返す.引数の指定は openと同じである. -*** Regexp(クラス) + +** Regexp(クラス) 正規表現のクラス.正規表現のリテラルは/.../という形式で表すが,動的に 生成するためには @@ -2974,7 +3030,12 @@ Single Methods: 区別する.設定されない場合はマッチを行なった時点のシステム変数 `$='の値によって区別するかしないかが決定される. -*** BasicSocket(クラス) + quote(str) + + 文字列の中の正規表現で意味を持つ文字をエスケープする.新しい文 + 字列を返す. + +** BasicSocket(クラス) ソケットを表す抽象クラス.具体的なソケット操作はサブクラスで定義される. 例えばインターネットドメインの場合はTCPsocketを用いる. @@ -3008,7 +3069,7 @@ Methods: howが1である時は,以降の送信が拒否される.howが2の時には,それ 以降の送信,受信ともに拒否される.shutdown(2)を参照. -*** String(クラス) +** String(クラス) 文字列クラス.Rubyの文字列はヌルターミネートではないので,バイナリデー タも扱える.従ってどちらかというと単なる文字列というよりバイト列である. @@ -3323,7 +3384,7 @@ Single Methods: stringと同じ内容を持つ新しい文字列を返す. -*** Struct(クラス) +** Struct(クラス) 構造体クラス.複数のデータをまとめる時に用いられる(例: Time::times). データをまとめる時には配列クラスが用いられることもあるが(例: select), @@ -3386,7 +3447,7 @@ Single Methods: バで指定された名前の特異メソッドが定義されていて,そのメソッド によってメンバの内容を得ることができる. -*** TCPserver(クラス) +** TCPserver(クラス) TCP/IPストリーム型接続のサーバ側のソケットのクラス.このクラスによって 簡単にソケットを利用したサーバのプログラミングができる.例えばechoサー @@ -3432,7 +3493,7 @@ Single Methods: 続だけを受け付ける.省略時は全てのホストからの接続要求を受け付 ける. -*** TCPsocket +** TCPsocket インターネットドメインのストリーム型ソケットのクラス.通常のIOクラスの サブクラスと同様の入出力ができる.このクラスによってソケットを用いたク @@ -3470,7 +3531,7 @@ Single Methods: 字列,serviceは/etc/services(またはNIS)に登録されているサービ ス名かポート番号である. -*** Time(クラス) +** Time(クラス) 時間を表すクラス.大小比較などができる.Time.nowで現在の時間を得ること ができる.またファイルのタイムスタンプを得るメソッドの戻り値もこのクラ @@ -3593,7 +3654,7 @@ Single Methods: 時間の単位は秒であり,浮動小数点数で与えられる.詳細は times(3)を参照のこと. -*** UNIXserver +** UNIXserver UNIXストリーム型接続のサーバ側のソケットのクラス. @@ -3606,7 +3667,7 @@ Methods: クライアントからの接続要求を受け付け,接続したUNIXsocketのイン スタンスを返す. -*** UNIXsocket +** UNIXsocket UNIXドメインのストリーム型ソケットのクラス.通常のIOクラスのサブクラス と同様の入出力ができる. @@ -3636,6 +3697,210 @@ Single Methods: pathで指定したパス名を用いて接続したソケットを返す. +* C言語とのインタフェース + +rubyはC言語とのインターフェースを提供し,C言語からのクラス,モジュール +の定義,C言語で記述したメソッドの定義,rubyのメソッドの呼び出し,イテ +レータの呼び出し,例外処理などを行なうことが出来る.また,OSが許せば実 +行時にCで書かれたモジュールをロードすることも出来る. + +具体的なインタフェースに関しては,別ドキュメント(添付ファイル C-IF)を +参照のこと. + +* 文法 + +以下は疑似BNFで記述したrubyの文法である.より正確な記述はparse.yを参照 +されたい. + +PROGRAM : COMPEXPR + +COMPEXPR : EXPR (TERM EXPR)* [TERM] + +EXPR : MLHS `=' ARGS + | ASSOCS + | return ARGS + | fail ARGS + | yield ARGS + | identifier CALL_ARGS + | PRIMARY `.' identifier CALL_ARGS + | super CALL_ARGS + | undef FNAME + | alias FNAME FNAME + | include identifier (`,' identifier)* + | EXPR if EXPR + | EXPR while EXPR + | EXPR and EXPR + | EXPR or EXPR + | ARG + +ARG : LHS `=' ARG + | LHS OP_ASGN ARG + | ARG `..' ARG + | ARG `...' ARG + | ARG `+' ARG + | ARG `-' ARG + | ARG `*' ARG + | ARG `/' ARG + | ARG `%' ARG + | ARG `**' ARG + | `+' ARG + | `-' ARG + | ARG `|' ARG + | ARG `^' ARG + | ARG `&' ARG + | ARG `<=>' ARG + | ARG `>' ARG + | ARG `>=' ARG + | ARG `<' ARG + | ARG `<=' ARG + | ARG `==' ARG + | ARG `!=' ARG + | ARG `=~' ARG + | ARG `!~' ARG + | `!' ARG + | `~' ARG + | ARG `<<' ARG + | ARG `>>' ARG + | ARG `::' ARG + | ARG `&&' ARG + | ARG `||' ARG + | PRIMARY + +PRIMARY : LITERAL + | VARIABLE + | super `(' [CALL_ARGS] `)' + | super + | PRIMARY `[' [ARGS] `]' + | `[' [ARGS] `]' + | `{' ARGS `}' + | `{' ASSOCS `}' + | redo + | break + | continue + | retry + | return + | fail `(' ARGS `)' + | fail `(' `)' + | fail + | yield `(' ARGS `)' + | yield `(' `)' + | yield + | PRIMARY `{' [ITER_VAR] `|' COMPEXPR `}' + | identifier `(' [CALL_ARGS] `)' + | PRIMARY `.' identifier `(' [CALL_ARGS] `)' + | PRIMARY `.' identifier + | if EXPR THEN + COMPEXPR + (elsif EXPR THEN COMPEXPR)* + [else COMPEXPR] + end + | while EXPR TERM COMPEXPR end + | case COMPEXPR + (when ARGS THEN)+ + [else COMPEXPR] + end + | for ITER_VAR in EXPR TERM + COMPEXPR + end + | protect + COMPEXPR + [resque COMPEXPR] + [ensure COMPEXPR] + end + | `(' COMPEXPR `)' + | class identifier `:' identifier + COMPEXPR + end + | module identifier + COMPEXPR + end + | def FNAME ARGLIST + COMPEXPR + end + | def SINGLETON `.' FNAME ARGLIST + COMPEXPR + end + +THEN : TERM + | then + | TERM then + +ITER_VAR : LHS + | MLHS + +MLHS : LHS `,' [LHS (`,' LHS)*] [`*' LHS] + +LHS : VARIABLE + | PRIMARY `[' [ARGS] `]' + | PRIMARY `.' identifier + +CALL_ARGS : ARGS + | ASSOCS + | ARGS `,' ASSOCS + | ARGS `,' `*' ARG + +ARGS : ARG + | ARGS `,' ARG + +ARGLIST : `('[identifier(`,'identifier)*][`*'identifier]`)' + | TERM + +SINGLETON : VARIABLE + | `(' COMPEXPR `)' + +ASSOCS : ASSOC (`,' ASSOC)* + +ASSOC : ARG `=>' ARG + +VARIABLE : identifier + | VARNAME + | nil + | self + | `__FILE__' + | `__LINE__' + +LITERAL : numeric + | SYMBOL + | STRING + | REGEXP + | GLOB + +TERM : `;' + | `\n' + +ここより下は字句解析部で認識される. + +SYMBOL : `:'FNAME + | `:'VARNAME + +FNAME : identifier | `::' | `..' | `|' | `^' | `&' + | `<=>' | `==' | `=~' | `>' | `>=' | `<' | `<=' + | `<<' | `>>' | `+' | `-' | `*' | `/' | `%' | `**' + | `~' | `+@' | `-@' | `[]' | `[]=' + +VARNAME : GLOBAL + | `@'identifier + | `%'identifier + +GLOBAL : `$'identifier + | `$'any_char + +STRING : `"' any_char* `"' + | `'' any_char* `'' + | ``' any_char* ``' + +REGEXP : `/' any_char* `/' + +GLOB : `<' any_char* `>' + +* 謝辞 + +Rubyの言語仕様はC, Perl, Eiffelの各言語にこの順に影響を受けている. そ +の他に影響を受けた言語としてはtcl, AWK, bourne shell, CLU, Sather, +Icon, Smalltalk, Emacs Lispなどがある. またrubyの言語仕様を決定するた +めに協力して下さった方々を以下にあげる(敬称略): 石塚圭樹,大庭康生,伊 +藤純一郎,中村@NEC.関根@日本DEC,たなか@赤坂.富士通. + ------------------------------------------------------- Local variables: fill-column: 70 |