diff options
Diffstat (limited to 'spec')
-rw-r--r-- | spec | 192 |
1 files changed, 94 insertions, 98 deletions
@@ -15,11 +15,12 @@ Rubyは「UNIXで手軽にオブジェクト指向プログラミング」をしたいという望み などである. オブジェクト指向言語として一般的であるSmalltalkやC++などは 上の条件の一部を満たしてはいるが, 特に手軽なプログラミングという点に欠 -けており, 全てを満たすものではなかった. 一方スクリプト言語であるPerlや -Tclにオブジェクト指向機能を追加したシステムも存在するが, これらは「手 -軽にプログラミング」という性質は満たしてはいても, 逆にオブジェクト指向 -機能に不備や不満があった. よって, これらの条件を満たす言語を新たに設計 -する必要があると考えられた. これらを踏まえて設計されたRubyの特徴は: +けており, 以上の条件の全てを満たすものではなかった. 一方スクリプト言語 +であるPerlや Tclにオブジェクト指向機能を追加したシステムも存在するが, +これらは「手軽にプログラミング」という性質は満たしてはいても, 逆にオブ +ジェクト指向機能に不備や不満があった. よって, これらの条件を満たす言語 +を新たに設計する必要があると考えられた. これらを踏まえて設計されたRuby +の特徴は: * インタプリタである. * 単純で例外の少ない文法. @@ -31,14 +32,15 @@ Tclにオブジェクト指向機能を追加したシステムも存在するが, これらは「手 * OSをアクセスする機能が提供される. * 拡張しやすい. -などがある. Rubyはshやperlを知っている人にとっての常識になるたけ従った +などがある. RubyはshやPerlを知っている人にとっての常識になるたけ従った ので, それらの言語からの自然な移行が可能であると思われる. プログラマが Rubyのオブジェクト指向機能について学べば, より強力なこともできるように なるだろう. -更にC言語でクラスを記述することでRubyを更に強力にすることができる. 一 -部のOSではRubyは動的にオブジェクトファイルをリンクできるし, そうでなく -てもRubyを再コンパイルして組み込みクラスを追加するのは容易である. +更にC言語でクラスやメソッドを記述し, 追加することでRubyを更に強力にす +ることができる. 一部のプラットフォームではRubyは動的にオブジェクトファ +イルをリンクできるし, そうでなくてもRubyを再コンパイルして組み込みクラ +スを追加するのは容易である(Perlなどよりもはるかに容易である). * Rubyの基本 @@ -69,21 +71,33 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは 予約語は以下の通りである - break, case, class, continue, def, do, else, - elsif, end, ensure, for, func, if, in, - include, module, nil, protect, redo, resque, retry, - return, self, super, then, undef, unless, until, - using, when, while, yield, __END__ + 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 予約語はクラス名, メソッド名, 変数名などに用いることはできない. +** グルーピング + +式は括弧によってグルーピングすることができる. 更に括弧内には式の並びも +書ける. 式の並びを記述する場合, 式と式の区切りには改行か ';' を用いる. +式の並びの値は最後に評価した式の値である. つまり + + (式; 式; ...) + +の値は最後に評価した式の値になる. + ** リテラル -以下のリテラルがある +以下のリテラルがある これらは式である. 文字列リテラル - "..." # バックスラッシュの解釈あり + "..." # バックスラッシュの解釈と変数展開あり '...' # バックスラッシュの解釈なし(\\と\'は解釈する) バックスラッシュ記法 @@ -95,6 +109,7 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは \b バックスペース(0x08) \a ベル(0x07) \e エスケープ(0x1b) + \# 文字`#'そのもの \nnn 8進数表記(nは0-7) \xnn 16進数表記(nは0-9,a-f) \^c コントロール文字(cはASCII文字) @@ -127,8 +142,8 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは | 選択 ( ) 正規表現をまとめる - その他にバックスラッシュ記法も有効である. - + その他に文字列と同じバックスラッシュ記法も有効である. + 数値リテラル 123 整数 @@ -145,19 +160,18 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは ?表現では全てのバックスラッシュ記法が有効である. -** グルーピング +*** 変数展開 -式は括弧によってグルーピングすることができる. 更に括弧内には式の並びも -書ける. 式の並びを記述する場合, 式と式の区切りには改行か ';' を用いる. -式の並びの値は最後に評価した式の値である. つまり - - (式; 式; ...) - -の値は最後に評価した式の値になる. +ダブルクォート(`"')で囲まれた文字列と正規表現の中では `#{変数名}'とい +う形式で変数の内容を展開することができる. 変数が変数記号(`$',`@',`%') +を持つ場合には`#変数名'という形式でも展開できる. 文字`#'に続く文字が +`{'でないか, 変数でなければ, そのまま`#'として解釈される. -** リテラル +** コマンドの出力 -上述の数値, 文字列, 正規表現の各リテラルは式である. +``で囲まれた文字列は, ダブルクォートと同様に展開された後, シェルと同じ +ようにコマンドとして実行され, その実行結果が文字列として与えられる. コ +マンドは評価されるたびに実行される. ** 配列式 @@ -240,17 +254,22 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは 複しない限り, 未初期化のローカル変数の値はnilであると考えても差し 支えはない. - Rubyの組み込み関数は大文字のアルファベットで始まる名前がついており, - ユーザもクラス/モジュール名には大文字で始まる識別子を, ローカル変 - 数名には小文字または`_'で始まる識別子を使うことを強く推奨する. + Rubyの組み込みクラスは大文字のアルファベットで始まる名前がついてお + り, ユーザもクラス/モジュール名には大文字で始まる識別子を, ローカ + ル変数名には小文字または`_'で始まる識別子を使うことを強く推奨する. ローカル変数の寿命はそのメソッドが終了するまで(トップレベルのロー カル変数はプログラムの終了まで)である. -更に疑似変数と呼ばれる特殊な変数としてselfとnilがある. selfは現在のメ -ソッドの実行主体を指す疑似変数であり, nilはNilクラスの唯一のインスタン -ス(偽を表す)を指す疑似変数である. これらの疑似変数は代入によってその値 -を変更することはできない. これらの変数への代入は例外を発生させる. +更に疑似変数と呼ばれる特殊な変数が4つある. + + self | 現在のメソッドの実行主体 + nil | Nilクラスの唯一のインスタンス(偽を表す) + __FILE__ | スクリプトのファイル名(文字列) + __LINE__ | 現在の行番号 + +これらの疑似変数は代入によってその値を変更することはできない. これらの +変数への代入は例外を発生させる. ** メッセージ式 @@ -269,11 +288,11 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは メソッド名としては任意の識別子を用いることができる. 変数名とは識別子の 名前空間が違うので重複しても構わない. -** 関数形式 +** 関数式 -メッセージ式で, レシーバがselfの場合, レシーバを省略して関数形式でメソッ -ドを呼び出すことができる. この場合引数が1つもない時でも括弧の省略はで -きない. +メッセージ式で, レシーバがselfの場合, レシーバを省略して通常のプログラ +ミング言語における関数のような形式でメソッドを呼び出すことができる. こ +の場合引数が1つもない時でも括弧の省略はできない. 関数形式では`@'で始まる名前を持つメソッドを呼び出すことができる. `@'で 始まるメソッドは関数形式でしか呼び出すことができないため, 該当するクラ @@ -295,7 +314,7 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは super(引数...) 引数とともにスーパークラスの同名のメソッドを呼び出す. 一番最後 - の引数が`*'に続く場合は通常のメソッド呼び出しと同様. + の引数が`*'に続く場合は通常のメソッド呼び出しと同様に渡される. ** 演算式 @@ -308,10 +327,10 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは * / % + - << >> - > >= < <= - <=> == != =~ !~ & | ^ + > >= < <= + <=> == != =~ !~ && || .. ... @@ -337,7 +356,7 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは 式1."演算子"(式2) -と解釈される. 多項演算子(配列の参照の[])は演算子形式の特別な形として +に解釈される. 多項演算子(配列の参照の[])は演算子形式の特別な形として recv[arg..] @@ -345,14 +364,22 @@ Rubyの基本的な部分は非常に小さく, 文法に例外が少ないので身につけるのは recv."[]"(arg..) -と解釈される. 配列要素の代入も同様である. +と解釈される. 配列要素への代入も同様に + + recv[arg0..] = argn + +が, + + recv."[]="(arg0.., argn) + +と解釈される. ** 条件式 if, unless, while, untilの条件判断部の式, および特殊演算子`&&', `||', `...'の両辺の式, 通常演算子`!'の右辺は条件式と呼ばれる. 条件式では文字 列と正規表現リテラルは式「$_=~リテラル」の省略であるとみなされる. 更に -演算子`...'の両辺では整数リテラルが「$.==リテラル」の省略と解釈される. +演算子`...'の両辺では整数定数が「$.==定数」の省略と解釈される. 注意: 演算子`!'は特殊演算子ではないので, 再定義を行なう場合に気をつけ ること. @@ -360,8 +387,9 @@ if, unless, while, untilの条件判断部の式, および特殊演算子`&&', `||', ! 文字列リテラル ! 正規表現リテラル -の形で呼び出されるメソッドの引数は, リテラルの表すオブジェクトではない. -`!'メソッドは再定義しない方が良いと思う. +の形で呼び出されるメソッドの引数は, リテラルの表すオブジェクトではなく, +上記の比較の結果が与えられる. このため, 原則的に`!'メソッドは再定義し +ない方が良いと思う. ** 代入 @@ -395,9 +423,10 @@ module文を用いる. 代入式は演算子形式をとっているが, メソッドではないの 式1 op= 式2 # 式1は代入可能でなければならない. - この形式は内部的に「式1 = 式1 op 式2」と展開され, 実行される. 自己 - 代入形式はプログラマのタイプ数を減らす目的のために存在する形式であ - る. opとして使える演算子は + この形式は内部的に「式1 = 式1 op 式2」と展開され, 実行される. その + ため式1は2回評価されるので, 副作用がある場合は予想しない結果を呼ぶ + 可能性がある. 自己代入形式はプログラマのタイプ数を減らす目的のため + に存在する形式である. opとして使える演算子は +, -, *, /, %, **, &, |, ^, <<, >> @@ -409,10 +438,10 @@ module文を用いる. 代入式は演算子形式をとっているが, メソッドではないの 変数, [変数,...] = 式 [, 式] -右辺の式が一つしかなく, かつ, その値が配列である時には配列の要素がそれ -ぞれ変数に代入される. それ以外の場合には, それぞれの式の値が変数に代入 -される. 左辺の変数の数と右辺の要素の数が合わない時には足りない変数には -nilが代入され, 余った要素は無視される. +右辺の式が一つしかない場合は, その値を配列として(必要ならばto_aメソッ +ドで配列に変換して), 要素をそれぞれ変数に代入する. それ以外の場合には, +それぞれの式の値が変数に代入される. 左辺の変数の数と右辺の要素の数が合 +わない時には足りない変数には nilが代入され, 余った要素は無視される. foo, bar = [1, 2] # foo = 1; bar = 2 foo, bar = 1, 2 # foo = 1; bar = 2 @@ -633,7 +662,7 @@ protect以外に, unless演算子, until演算子は右辺の値を求める時に例外が発 ド定義はネストできないので, メソッド定義文中ではメソッド定義文を再び呼 び出せない. - def [func] メソッド名 [ ( 引数 [, 引数...][, *引数 ] ) ] + def メソッド名 [ ( 引数 [, 引数...][, *引数 ] ) ] 定義実体 end [ def ] @@ -641,9 +670,6 @@ protect以外に, unless演算子, until演算子は右辺の値を求める時に例外が発 で指定する. 仮引数並びの最後に`*'がある場合, 仮引数より多く与えられた 実引数は, 最後の引数に配列として与えられる(足りない時にはエラー). -キーワード`func'が指定された時にはそのメソッドは関数形式でだけ呼び出す -ことができる関数的メソッドになる. - ** 特異メソッド定義 メソッド定義にはもう一つ特異メソッドの定義がある. 形式は以下の通りであ @@ -895,13 +921,15 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク 初にpatternにマッチする部分をreplaceに置き換える. Stringクラス のsubメソッドの解説を参照のこと. - system(command) + + syscall(num, arg...) + - コマンドを実行し, その終了ステータスを返す. + numで指定された番号のシステムコールを実行する. 第2引数以降をシ + ステムコールの引数として渡す. 引数は文字列または整数でなければ + ならない. - system2(command) + + system(command) + - コマンドを実行し, その出力を文字列として返す. + コマンドを実行し, その終了ステータスを返す. trap(command, signal...) + @@ -964,7 +992,8 @@ Rubyには厳密な意味では関数はないがKernelクラスのメソッドの一部は(全ク $_ 最後にgets()などで読み込んだ文字列. - $0 rubyスクリプトの名前 + $0 rubyスクリプトの名前. この変数に代入するとps(1)の出力 + が変化する. $* rubyスクリプトに与えられた引数. ruby自身に対する引数は 取り除かれている. @@ -2019,20 +2048,6 @@ Single Methods: GCを開始する. - threshold - - GCの開始タイミングを決定する閾値の現在の値を返す. - - threshold=(val) - - GCの閾値を設定する. 古い閾値を返す. - - start_hook - end_hook - - GCの開始時, 終了時にそれぞれ呼ばれる. デフォルトでは何もしない - メソッドが定義されている. - *** Integer(クラス) 整数クラス. 実際はその大きさによってFixnumとBignumいう二つのサブクラス @@ -2330,14 +2345,7 @@ Methods: *** Nil(クラス) 偽を表すオブジェクトnilのクラス. 偽変数(の値)nilはNilクラスの唯一のイ -ンスタンスである. nilクラスは比較メソッドを受け付けるが, これは比較の -連鎖を行なうためである. 比較の連鎖とは - - 10 < a < 13 - -のようなものである. 比較演算子メソッドは失敗した時nilを返し, 成功した -時は右辺のオブジェクトを返すので, nilが比較演算子に偽を返すことによっ -て連鎖が成立する. +ンスタンスである. SuperClass: Kernel @@ -2345,19 +2353,7 @@ Methods: self + other - otherが整数, 浮動小数点数, 文字列, 配列のいずれかであった場合, - otherを返す. 未初期化の引数に対する自己代入に便利なように用意 - されたメソッドである. - - foo # 値はnil - foo += 1 # fooは1になる. - - self > other - self >= other - self < other - self <= other - - 比較連鎖のためのメソッド. 全てnilを返す. + otherが整数, 浮動小数点数, 文字列, 配列である時, otherを返す. ! self |