summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
Diffstat (limited to 'spec')
-rw-r--r--spec218
1 files changed, 94 insertions, 124 deletions
diff --git a/spec b/spec
index fb5d046..42849d5 100644
--- a/spec
+++ b/spec
@@ -54,9 +54,10 @@ tab), CR(carriage return),改頁(form feed)である.改行(newline)は明ら
識別子の長さに制限はない.現在の実装は識別子としてマルチバイトコード
(EUC,SJIS)も通すが勧められない.
-グローバル変数名は"$"に続く識別子または記号1文字,インスタンス変数は
-"@"に続く識別子,クラス定数は"%"に続く識別子である.メソッド名,ローカ
-ル変数名とクラス名は単なる識別子を用いる.
+グローバル変数名は"$"に続く識別子または記号1文字,インスタンス変数は
+"@"に続く識別子,定数には大文字で始まる識別子,ローカル変数名は小文字
+で始まる識別子である.メソッド名には単なる識別子を用いる(メソッド名は
+大文字でも小文字でも始められる).
** コメント
@@ -126,12 +127,15 @@ Rubyではnilが偽,それ以外が真と評価される.CやPerl などとは異なり,0や
\M-c メタ文字(c|0x80)
\それ以外 文字そのもの
+文字列式は毎回新しい文字列オブジェクトを生成するので,文字列の内容を変
+更してももともとの文字列は変わらない.
+
変数展開
ダブルクォート(`"')で囲まれた文字列と正規表現の中では `#{変数名}'とい
-う形式で変数の内容を展開することができる.変数が変数記号(`$',`@',`%')
- で始まる場合には`#変数名'という形式でも展開できる.文字`#'に続く文字
-が `{',`$',`@',`%'でなければ,そのまま`#'として解釈される.
+う形式で変数の内容を展開することができる.変数が変数記号(`$',`@')で始
+まる場合には`#変数名'という形式でも展開できる.文字`#'に続く文字が
+`{',`$',`@'でなければ,そのまま`#'として解釈される.
** コマンド出力
@@ -142,7 +146,7 @@ Rubyではshのようにコマンドの実行結果を文字列リテラルのように使うことが
** 正規表現式
- /.../
+ /.../[i]
^ 行頭
$ 行末
@@ -164,7 +168,8 @@ Rubyではshのようにコマンドの実行結果を文字列リテラルのように使うことが
| 選択
( ) 正規表現をまとめる
-その他に文字列と同じバックスラッシュ記法や変数展開も有効である.
+その他に文字列と同じバックスラッシュ記法や変数展開も有効である.正規表
+現の後ろにiがついた時には大文字小文字の違いを無視する.
** ワイルドカード式
@@ -226,57 +231,32 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
メソッドから参照できる.スコープはメソッド内であり,その寿命はオブジェ
クトの寿命に等しい.
-*** クラス名/モジュール名/ローカル変数
+*** クラス定数
例:
- Array
- Math
- foobar
+ FOOBAR
-アルファベットまたは`_'で始まる変数は識別子とも呼ばれ,ローカル変数,
-クラス名またはモジュール名である.
+大文字で始まる識別子ははクラス定数へのアクセスであり,そのクラスと全て
+のサブクラスのインスタンスから参照できる.この定数へはトップレベル,す
+なわちメソッドが定義できるレベルでのみ代入可能である.この変数はクラス
+間で値が共有され,一度代入すると値を変更することができない.クラス定数
+の寿命はクラスの寿命と等しい.
-初期状態では識別子はクラス/モジュール名とみなされるが(該当するクラスが
-存在しない場合の値はnil),代入式の左辺に現れた識別子は,そのスコープ内
-ではローカル変数として見なされ,同名のクラスやモジュールは隠される.こ
-の意味で識別子への代入は宣言としての働きも持つ.
+クラス定義は自動的に定数を定義するので,クラス名は定数である.
- Array # 配列クラス Array
- Array = 15 # 代入.以後Arrayはローカル変数
- print Array, "\n" # `15'が出力される
+*** ローカル変数
-この宣言としての代入の解釈はコンパイル時に行なわれるため,識別子への代
-入式が実際に実行されてもされなくても,以降のスコープ内ではその識別子は
-ローカル変数とみなされる.
+例:
- Array # 配列クラス Array
- if %FALSE
- Array = 15 # このコードは実行されないが,
- # 以降Arrayはローカル変数とみなされる.
- end
- print Array, "\n" # `nil'が出力される
+ foobar
-このルールは一見複雑だが,クラス/モジュール名とローカル変数名が重複し
-ない限り,未初期化のローカル変数の値はnilであると考えても差し支えはな
-い.Rubyの組み込みクラスは大文字のアルファベットで始まる名前がついて
-おり,ユーザもクラス/モジュール名には大文字で始まる識別子を,ローカル
-変数名には小文字または`_'で始まる識別子を使うことを強く推奨する.
+小文字または`_'で始まる識別子はローカル変数へのアクセスである.初期化
+されないローカル変数の値はnilである
-ローカル変数のスコープも寿命もそのブロックの終りまで(トップレベルのロー
+ローカル変数のスコープは寿命もそのブロックの終りまで(トップレベルのロー
カル変数はプログラムの終了まで)である.
-*** クラス定数
-
-例:
-
- %foobar
-
-`%'で始まる変数はクラス定数であり,そのクラスと全てのサブクラスのイン
-スタンスから参照できる.この定数へはトップレベル,すなわちメソッドが定
-義できるレベルでのみ代入可能である.この変数はクラス間で値が共有され,
-一度代入すると値を変更することができない.
-
*** 疑似変数
通常の変数以外に疑似変数と呼ばれる特殊な変数が4つある.
@@ -300,14 +280,6 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
`(' 式 `)'
-括弧の中には単なる式だけではなく,式の並び(=プログラム)を置くことが出
-来る.
-
- `(' 式 `;' 式.. `)'
-
-式の並びの値は最後に評価した式の値である.つまりの値は最後に評価した式
-の値になる.
-
** 配列式
例:
@@ -365,10 +337,13 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
メッセージ式で,レシーバがselfの場合,レシーバを省略して通常のプログラ
ミング言語における関数のような形式でメソッドを呼び出すことができる.
-メソッド呼び出しでは曖昧さがない時には括弧を省略できる.曖昧さがある時
-とは第一引数が以下の文字または予約語で始まる場合である.
+メソッド呼び出しの引数の周りの括弧を省略できるが,第一引数となる式が以
+下の文字または予約語で始まる場合は,優先順位の関係で予想通りの結果が得
+られない場合がある.
- (, [, {, <, /, %, +, -, if, while
+ (, [, {, <, /, +, -, if, while
+
+どのように評価されるか曖昧な場合には括弧をつける事.
例:
foo bar+baz # メソッド呼び出しfoo(bar+baz)
@@ -416,31 +391,31 @@ Rubyの変数はスコープ(有効範囲)と寿命(有効期限)によって4種類に分類され,
foo[0] = bar
foo.bar = baz
-代入には変数に対する代入(真の代入)と,プログラムを簡単にするためのシン
-タックスシュガーとしての代入がある.真の代入は以下の形式である.
+代入式は変数などに値を設定するために用いられる.代入式は演算子形式をとっ
+ているが,メソッドではないので再定義することはできない.左辺になること
+が出来るのは以下の3種類の式である.
- 変数 `=' 式
+変数(`$'識別子 | `@'識別子 | 識別子)
-これは式を評価し,変数の値として代入する.クラスやモジュールや疑似変数
-には代入できない.クラスやモジュールの定義を変更するためにはclass式,
-module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
-で再定義することはできない.
+ 変数 `=' 式
-シンタックスシュガーとしての代入式は以下のものがある.
+変数への代入は右辺の式を評価して得られた値を左辺で指定された変数に代入
+する.
-配列要素への代入
+配列参照(式[式..])
式1`[' 式2.. `]' `=' 式n
-式1を評価して得られるオブジェクトに,式2から式nまでを引数として,"[]="
-というメソッドを呼び出す.
+配列参照式への代入は,式1を評価して得られるオブジェクトに,式2から式n
+までを引数として,"[]=" というメソッドを呼び出す.
-属性代入
+属性参照(式`.'識別子)
式1 `.' 識別子 `=' 式2
-式1を評価して得られるオブジェクト(レシーバが省略された場合は`self')に
-対して,"識別子="というメソッドを式 2を引数として呼び出す.
+属性参照(引数なしのメソッド呼び出し)への代入は,式1を評価して得られる
+オブジェクト(レシーバが省略された場合は`self')に対して,"識別子="とい
+うメソッドを式 2を引数として呼び出す.
** 自己代入
@@ -472,11 +447,12 @@ module式を用いる.代入式は演算子形式をとっているが,メソッドではないの
左辺 `,' [左辺 `,'..] [`*' 左辺]= 式 [, 式..]
-右辺の式が一つしかない場合は,その値を配列として(必要ならばto_aメソッ
-ドで配列に変換して),要素をそれぞれ左辺に代入する.それ以外の場合には,
-それぞれの式の値が左辺に代入される.左辺の数と右辺の要素の数が合わない
-時には足りない変数には nilが代入され,余った要素は無視される.多重代入
-の最後の要素の前に`*'がある場合,残りの全て引数が配列として代入される.
+左辺には代入式の3種類の式が来る.右辺の式が一つしかない場合は,その値
+を配列として(必要ならばto_aメソッドで配列に変換して),要素をそれぞれ左
+辺に代入する.それ以外の場合には,それぞれの式の値が左辺に代入される.
+左辺の数と右辺の要素の数が合わない時には足りない変数には nilが代入され,
+余った要素は無視される.多重代入の最後の要素の前に`*'がある場合,残り
+の全て引数が配列として代入される.
foo, bar = [1, 2] # foo = 1; bar = 2
foo, bar = 1, 2 # foo = 1; bar = 2
@@ -690,7 +666,7 @@ whileの条件判断部の式では文字列と正規表現リテラルは式「$_=~ リテラル」
イテレータとは制御構造(特にループ)の抽象化のために用いられるメソッドの
一種である.イテレータの呼び出しは以下の構文で行なわれる.
- 式 `{' 変数.. `|' 式.. `}'
+ 式 `{' 左辺式.. `|' 式.. `}'
「式」をブロックとして設定し,「式」のメソッドをイテレータとして評価す
る.「式」のトップレベルのメソッドだけがイテレータとして呼び出され,
@@ -709,13 +685,13 @@ Enumerableモジュールのgrepメソッドのようにイテレータとして呼ばれた時と
オブジェクトの各要素に対して操作を行なうための形式も提供されている.形
式は以下の通り.
- for 変数.. in 式
+ for 左辺式.. in 式
end
式の各要素に対し式を実行する.これは以下の式と等価である.
- (式).each `{' 変数.. `|' 式 `}'
+ (式).each `{' 左辺式.. `|' 式 `}'
よって式の値のオブジェクトがメソッドeachを持たない場合,forを実行する
と例外が発生する.
@@ -908,13 +884,6 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
exit()とは違って,例外処理などは一切行なわない.fork()の後,子
プロセスを終了させる時などに用いる.
- do()
-
- ブロックを1度だけ実行するイテレータ.ブロックをまとめるためだ
- けに存在する.使い方の例:
-
- do { foobar() } while (baz())
-
eof()
コマンドラインからの入力がEOFに到達している場合,真を返す.
@@ -1048,8 +1017,8 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
fileをロードする.loadとの動作の違いはrequireはロードしたファ
イルのフルパスを変数`$"'に覚えていて,既にロードしたファイルは
- 再ロードしない点である.実際にロードした時には%TRUE,既にロー
- ドされている時には%FALSEを返す.
+ 再ロードしない点である.実際にロードした時にはTRUE,既にロード
+ されている時にはFALSEを返す.
select(reads[, writes[, execpts[, timeout]]])
@@ -1224,23 +1193,23 @@ Rubyには厳密な意味では関数はないがKernelクラスの関数メソッドは(全ての
$VERSION rubyのバージョンを示す文字列
- %TRUE t
- %FALSE nil
+ TRUE t
+ FALSE nil
それぞれ真偽値を表す.条件判断はnilを偽,それ以外の全ての値を
- 真として判断するため,%TRUEの値は代表的な真の値という以上の意
- 味を持たない.よって,あるメソッドの返値が真であるということと,
- それが%TRUEを返すということは厳密には同じではない(述語的に用い
- られるメソッドは大抵真の値として%TRUEを返すようにはなっている
- が).つまり
+ 真として判断するため,TRUEの値は代表的な真の値という以上の意味
+ を持たない.よって,あるメソッドの返値が真であるということと,
+ それがTRUEを返すということは厳密には同じではない(述語的に用い
+ られるメソッドは大抵真の値としてTRUEを返すようにはなっているが).
+ つまり
if some.method() then ... else ... end
- if some.method() == %TRUE then ... else ... end
+ if some.method() == TRUE then ... else ... end
- は完全には同義ではない.%FALSEに関しては,このような問題は生じ
+ は完全には同義ではない.FALSEに関しては,このような問題は生じ
ない.
* 組み込みクラスとモジュール
@@ -1708,8 +1677,8 @@ Single Methods:
** Dict(クラス)
辞書あるいは連想配列.任意のオブジェクトを添字とできる配列のクラスであ
-る.Hashという名前でもアクセスできる.連想配列オブジェクトの生成は一般
-的には連想配列式``{a=>b,..}'' で行なわれる.
+る.連想配列オブジェクトの生成は一般的には連想配列式``{a=>b,..}'' で行
+なわれる.
SuperClass: Object
@@ -1796,10 +1765,9 @@ Single Methods:
新しい(空の)辞書オブジェクトを返す.
-** Directory(クラス)
+** Dir(クラス)
ディレクトリ内の要素を順に返すディレクトリストリーム操作のためのクラス.
-Dirという名前でもアクセスできる.
SuperClass: Object
@@ -2681,7 +2649,7 @@ Private Methods:
省略可能な第2引数publicが与えられて,かつその値がnilでない時に
はその属性には属性設定メソッドも用意され,外部から代入可能にな
- る.attr("attr", %TRUE)はクラス定義に以下のコードを追加するの
+ る.attr("attr", TRUE)はクラス定義に以下のコードを追加するの
とほぼ同義である.
def attr; @attr; end
@@ -2690,7 +2658,7 @@ Private Methods:
属性を構成するメソッドを再定義することによって,アクセス時の動
作を変更できる.例えば
- attr("test", %TRUE)
+ attr("test", TRUE)
def test=(val)
print("test was ", @test, "\n")
print("and now is ", @test = val, "\n")
@@ -2843,8 +2811,8 @@ Single Methods:
whichとwhoで指定されるプロセス,プロセスグループ,ユーザの現在
の優先順位を返す.詳細はgetpriority(2)を参照.Processモジュー
- ルではwhichとして指定できる定数%PRIO_PROCESS,%PRIO_PGRP,
- %PRIO_USERが定義されている.
+ ルではwhichとして指定できる定数PRIO_PROCESS,PRIO_PGRP,
+ PRIO_USERが定義されている.
gid
@@ -2893,9 +2861,9 @@ Single Methods:
しかし,この場合は以下の方が速い.
- do 1.upto(5)
+ 1.upto(5) {
...
- end
+ }
範囲オブジェクトを生成する`..'演算子の両辺はComparableを含むクラスのイ
ンスタンスであれば何でも構わない.範囲は始点と終点を含むことに注意する
@@ -3025,10 +2993,9 @@ Single Methods:
new(string[, casefold])
文字列を正規表現に変換したオブジェクトを返す.省略可能な第2引
- 数が与えられた時には,生成される正規表現オブジェクトはシステム
- 変数`$='の値に関わらず,真の時は大文字小文字を無視し,偽の時は
- 区別する.設定されない場合はマッチを行なった時点のシステム変数
- `$='の値によって区別するかしないかが決定される.
+ 数が与えられ,その値がnilでない時には,生成された正規表現オブ
+ ジェクトはシステム変数`$='の値に関わらず,マッチする時に大文字
+ 小文字の違いを無視する.
quote(str)
@@ -3456,7 +3423,7 @@ TCP/IPストリーム型接続のサーバ側のソケットのクラス.このクラスによって
gs = TCPserver.open(4444)
socks = [gs]
- while %TRUE
+ while TRUE
nsock = select(socks);
if nsock == nil; continue end
for s in nsock[0]
@@ -3766,7 +3733,8 @@ ARG : LHS `=' ARG
| ARG `||' ARG
| PRIMARY
-PRIMARY : LITERAL
+PRIMARY : `(' EXPR `)'
+ | LITERAL
| VARIABLE
| super `(' [CALL_ARGS] `)'
| super
@@ -3807,7 +3775,6 @@ PRIMARY : LITERAL
[resque COMPEXPR]
[ensure COMPEXPR]
end
- | `(' COMPEXPR `)'
| class identifier `:' identifier
COMPEXPR
end
@@ -3852,8 +3819,7 @@ ASSOCS : ASSOC (`,' ASSOC)*
ASSOC : ARG `=>' ARG
-VARIABLE : identifier
- | VARNAME
+VARIABLE : VARNAME
| nil
| self
| `__FILE__'
@@ -3880,7 +3846,7 @@ FNAME : identifier | `::' | `..' | `|' | `^' | `&'
VARNAME : GLOBAL
| `@'identifier
- | `%'identifier
+ | identifier
GLOBAL : `$'identifier
| `$'any_char
@@ -3889,18 +3855,22 @@ STRING : `"' any_char* `"'
| `'' any_char* `''
| ``' any_char* ``'
-REGEXP : `/' any_char* `/'
+REGEXP : `/' any_char* `/'[i]
GLOB : `<' any_char* `>'
* 謝辞
-Rubyの言語仕様はC, Perl, Eiffelの各言語にこの順に影響を受けている. そ
-の他に影響を受けた言語としてはtcl, AWK, bourne shell, CLU, Sather,
-Icon, Smalltalk, Emacs Lispなどがある. またrubyの言語仕様を決定するた
-めに協力して下さった方々を以下にあげる(敬称略): 石塚圭樹,大庭康生,伊
-藤純一郎,中村@NEC.関根@日本DEC,たなか@赤坂.富士通.
+Rubyの言語仕様は数多くの言語の影響を受けている. 以下にあげるのはその主
+な言語である.
+
+ C, Perl, CLU, Sather, CLOS, Eiffel, Icon, tcl, AWK, bourne shell,
+ Smalltalk, Emacs Lisp.
+
+またrubyの言語仕様を決定するために協力して下さった方々を以下にあげる
+ 石塚圭樹,大庭康生,伊藤純一郎,中村@NEC.関根@日本DEC,
+ たなか@赤坂.富士通(敬称略).
-------------------------------------------------------
Local variables:
fill-column: 70