Rubyの現在の実装はASCIIキャラクタセットを用いています.アル ファベットの大文字と小文字は区別されます.識別子と一部のリテ ラルの途中を除いては任意の場所に空白文字やコメントを置くこと ができます.空白文字とはスペース,タブ,垂直タブ,バックスペー ス,キャリッジリターン,改ページです.改行は行が明らかに次の 行に継続する時だけ,空白文字として,それ以外では文の区切りと して解釈されます.
例:
foobar ruby_is_simple
rubyの識別子は英文字またはアンダースコア('_'
)か
ら始まり,英文字,アンダースコア('_'
)または数字
からなります.識別子の長さに制限はありません.
例:
# this is a comment line
スクリプト言語の習慣にならい,文字列中や文字表現
(?#
)以外の#
から行末までをコメント
と見なします.コメント行末のバックスラッシュは次の行へのコメ
ントの継続を意味します.
予約語は以下にあげるものです:
alias else nil undef and elsif not unless begin end or until case ensure rescue when class for return while def if self yield defined? in super __END__ do module then
予約語はクラス名,メソッド名,変数名などに用いることはできま せん.しかし,`$', `@'が先頭につい たものは予約語と見なされません.
例:
print "hello world!\n"
プログラムは式を並べたものです.式と式の間はセミコロン
(;
)または改行で区切られます.
例:
TRUE (1+2)*3 foo() if test then ok else ng end
式は括弧によってグルーピングすることができる.
例:
"this is a string expression\n" "concat#{foobar}" 'concat#{foobar}' %q!I said, "You said, 'She said it.'"! %!I said, "You said, 'She said it.'"! %Q('This is it.'\n)
文字列はダブルクォートまたはシングルクォートで囲まれています.
ダブルクォートで囲まれた文字列ではバックスラッシュによるエス
ケープと式展開(後述)が有効になります.シングルクォートで囲ま
れた文字列では,\\
(バックスラッシュそのもの)と
\'
(シングルクォート)を除いて文字列の中身の解釈
は行われません.
%
で始まる形式の文字列を用いることでバックスラッ
シュの数を減らすことができます.
%q/STRING/ はシングルクォート文字列,
%Q/STRING/ (または
%/STRING/)はダブルクォート文字列と同じ展開を行
います./
の部分には改行を含めた非英数字を使うこ
とができます.始まりの区切り文字が括弧である時には,終りの区
切り文字は対応する括弧になります.
バックスラッシュ記法
- \t
- タブ(0x09)
- \n
- 改行(0x0a)
- \r
- キャリッジリターン(0x0d)
- \f
- 改ページ(0x0c)
- \b
- バックスペース)
- \a
- ベル(0x07)
- \e
- エスケープ(0x1b)
- \nnn
- 8進数表記(nは0-7)
- \xnn
- 16進数表記(nは0-9,a-f)
- \^x
- \cx
- \C-x
- コントロール文字(xはASCII文字)
- \M-x
- メタ x (c | 0x80)
- \M-\C-x
- メタ コントロール x
- \x
- 文字xそのもの
文字列式は評価されるたびに毎回新しい文字列オブジェクトを生成 します.
例:
`date` %x{ date }
バッククォート(`
)で囲まれた文字列は,ダブルクォー
トで囲まれた文字列と同様にバックスラッシュ記法の解釈と式展開
が行なわれた後,コマンドとして実行され,その標準出力が文字列
として与えられます.コマンドは評価されるたびに実行されます.
%x/STRING/形式はコマンド出力式の別の形式です.
例:
/^ruby the OOPL/ /ruby/i /my name is #{myname}/o
/
で囲まれた文字列は正規表現です.終りの
/
の直後の文字は正規表現に対するオプションになり
ます.オプションi
が与えられた場合には,その正規
表現はマッチ時に大文字小文字の区別を行いません.また,オプショ
ンo
が与えられた場合には,一番最初に評価が行われ
た時に一度だけ式展開を行います.
日本語化rubyではその他にn, e,
sのオプションが指定できます.これらは
$KCODE
の値にかかわらず,正規表現がマッチに使用
する文字コードを指定するものです.
%r/STRING/形式は正規表現式の別の形式です.
^
- 行頭
$
- 行末
.
- 改行を除く任意の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回の直前の表現
|
- 選択
( )
- 正規表現をグループ化
正規表現の中では文字列と同じバックスラッシュ記法や変数展開も 有効です.
例:
"my name is #{$ruby}"
ダブルクォート("
)で囲まれた文字列式,コマンド文
字列および正規表現,の中では#{式}
という形式で式
の内容(を文字列化したもの)を埋め込むことができます.式が変数
記号($
,@
)で始まる変数の場合には
{}
を省略して,#変数名
という形式で
も展開できます.文字#
に続く文字が
{
,$
,@
でなければ,その
まま文字#
として解釈されます.明示的に式展開を止
めるには#
の前にバックスラッシュを置きます.
_
を含むことができる)
a
のコード(97)
?表現では全てのバックスラッシュ記法が有効である.
Rubyの変数と定数の種別は変数名の最初の一文字によって,グロー
バル変数,インスタンス変数,ローカル変数,クラス定数のいずれ
かに区別されます.通常の変数の2文字目以降は英数字または
_
であるが,システム変数の一部には
「`$
'+1文字の記号」という変数があります.変数名
の長さに関してメモリのサイズ以外に特別な制限はありません.
例:
$foobar $/
`$
'で始まる変数はグローバル変数で,プログラムの
どこからでも参照できます.グローバル変数には宣言は必要ありま
せん.初期化されていないグローバル変数を参照した時の値は
nil
です.
例:
@foobar
`@
'で始まる変数はインスタンス変数であり,特定の
オブジェクトに所属しています.インスタンス変数はそのクラスま
たはサブクラスのメソッドから参照できます.初期化されていない
インスタンス変数を参照した時の値はnil
です.
例:
foobar
小文字または`_
'で始まる識別子はローカル変数また
はメソッド呼出しです.ローカル変数スコープ(クラス,モジュー
ル,メソッド定義の本体)における小文字で始まる識別子への最初
の代入はそのスコープに属するローカル変数の宣言になります.宣
言されていない識別子の参照は引数の無いメソッド呼び出しとみな
されます.
ローカル変数のスコープは,その変数が宣言されたイテレータブロッ ク,メソッド定義,またはクラス/モジュール定義の終りまでです. 寿命もそのブロックの終りまで(トップレベルのローカル変数はプ ログラムの終了まで)ですが,例外としてイテレータブロックが手 続きオブジェクト化された場合は,そのオブジェクトが消滅するま で存在します.同じスコープを参照する手続きオブジェクト間では ローカル変数は共有されます.
通常の変数以外に疑似変数と呼ばれる特殊な変数が2つあります.
self
- 現在のメソッドの実行主体
nil
- Nilクラスの唯一のインスタンス
疑似変数の値を変更することはできません.変数への代入は例外を 発生させます.
例:
FOOBAR
大文字([A-Z])で始まる識別子は定数です.定数の定義(と初期化) は代入によって行われますが,メソッドの中では定義できません. 一度定義された定数に再び代入を行おうとすると例外が発生します. 定義されていない定数のアクセスは例外を発生させます.
定数はその定数が定義されたクラス/モジュール定義の中(メソッド
本体やネストしたクラス/モジュール定義中を含みます),クラスを
継承しているクラス,モジュールをインクルードしているクラスま
たはモジュールから参照することができます.クラス定義の外で定
義された定数はObject
に所属することになります.
クラス定義は自動的に定数を定義するので,クラス名は定数です.
あるクラスまたはモジュールで定義された定数を外部から参照する
ためには`::
'演算子を用います.
例:
Foo::Bar
ただし,`::
'演算子を用いた代入はできません.
例:
[1, 2, 3]
文法:
`[' 式`,'...`]'
それぞれの式を評価した結果を含む配列を返します.配列はArrayクラスのインスタンスです.
例:
{1=>2, 2=>4, 3=>6}
文法:
`{' 式 `=>' 式...`}' `{' 式 `,' 式...`}'
それぞれの式を評価した結果をキーと値とする連想配列オブジェク トを返す.連想配列とは任意のオブジェクトをキー(添字)として持 つ配列であり,Hashクラスのインスタン スである.
連想配列の要素が1つ以上ある場合,曖昧でなければ
{
, }
は省略できます.
例:
foo.bar() foo.bar bar() print "hello world\n" print
文法:
[式 `.'] 識別子 [`(' 式...[`*' 式] `)']
メソッド呼出し式はレシーバ(`.'
の右側の式の値)の
メソッドを呼び出します.レシーバが指定されない時はself
のメソッドを呼び出します.
メソッド名には通常の識別子の他,識別子に?
または
!
の続いたものが許されます.慣習として,述語(真
偽値を返すメソッド)には?
を,同名の
(!
の無い)メソッドに比べてより破壊的な作用をもつ
メソッド(例:tr
とtr!
)には
!
をつけるようになっています.
最後の引数の直前に*
がついている場合,その引数の
値が展開されて渡されます.つまり:
はfoo(*[1,2,3])
と同じです.foo(1,2,3)
一部のメソッドはprivateなメソッドで,関数形式(レシー バを省略した形式)でしか呼び出すことができません.
super
例:
super super(1,2,3)
文法:
super super(式,...)
super
は現在のメソッドがオーバーライドしているメ
ソッドを呼び出します.引数が省略された場合には現在のメソッド
の引数がそのまま引き渡されます.
例:
foo = bar foo[0] = bar foo.bar = baz
文法:
変数 '=' 式 定数 '=' 式 式`['expr..`]' '=' 式 式`.'識別子 '=' 式
代入式は変数などに値を設定するために用いられます.代入はロー カル変数やクラス定数の宣言にも用いられます.代入式の左辺は以 下のいずれかで無ければなりません.
変数 `=' 式
左辺値が変数の場合,式を評価した値が変数に代入される.
式1`[' 式2...`]' `=' 式n
この形式の代入は,式1を評価して得られるオブジェクトに対して
の式2から式nまでを引数とする []=
というメソッド
呼出しとして評価されます.
式1 `.' 識別子 `=' 式2
上記の形式の属性参照ヘの代入は,式1を評価して得られるオブジェ
クトに対して,識別子=
というメソッドを,式2を引
数として呼び出します.
例:
foo += 12
文法:
式1 op= 式2 # 式1は代入可能でなければならない.
この形式の代入は 式1 = 式1 op 式2
と同様に評価
されます.ただし,式1は1度しか評価されません.op は以下のい
ずれかの演算子で無ければなりません.
+, -, *, /, %, **, &, |, ^, <<, >>
演算子と=
の間にスペースを空けてはいけません.
例:
foo, bar, baz = 1, 2, 3 foo, = list() foo, *rest = list2()
文法:
式 `,' [式 `,'...] [`*' 式] = 式 [, 式...][`*' 式] `*' 式 = 式 [, 式...][`*' expr]
多重代入は複数の式または配列から同時に代入を行います.左辺の
各式はそれぞれ代入可能でなければなりません.右辺の式が一つし
か与えられなかった場合,式を評価した値は配列に変換されて,各
要素が左辺のそれぞれの式に代入されます.左辺の要素の数よりも
配列の要素の数の方が多い場合には,余った要素は無視されます.
配列の要素が足りない場合には対応する要素の無い左辺には
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+2*3/4
プログラミングの利便のために一部のメソッド呼び出しと制御構造は演算子形 式をとります.Rubyには以下にあげる演算子があります.
high :: [], [] ** -(unary) +(unary) ! ~ * / % + - << >> & | ^ > >= < <= <=> == === != =~ !~ && || .. ... =(+=, -=...) not low and or
ほとんどの演算式には特別な形式のメソッド呼び出しですが,一部 のものは制御構造であり,再定義できません.再定義できない演算 子形式の制御構造は以下の通りです.
=, .., ..., !, not, &&, and, |, or, !=, !~
演算子の組合せである自己代入演算子も再定義できません.
Rubyでは(Cなどとは異なり)制御構造は式であって,何らかの値を 持ちます.RubyはC言語やPerlから引き継いだ制御構造を持つが, その他にイテレータというループ抽象化の機 能があります.イテレータは繰り返しを始めとする制御構造をユー ザが定義する事が出来るものです.
if
例:
if age >= 12 then print "adult fee\n" else print "child fee\n" end gender = if foo.gender == "male" then "male" else "female" end
文法:
if 式 [then] 式... [elsif 式 [then] 式...]... [else 式...] end
if
式は条件実行に用いられます.条件式を評価した
値が FALSE
または nil
の時,偽であ
ると見なされ,それら以外の全ての値は真である見なされます.
rubyではifを繋げるのに,elsif
を用い,else
if
(Cのように)でも,elif
(shのように)でも
無いことに注意してください.
if
の条件式の部分が文字列または正規表現のリテラ
ルである時には,
であるかのように評価されます.$_ =~ リテラル
if
修飾子例:
print "debug\n" if $debug
文法:
式 if 式
右辺の条件が成立する時に,左辺の式を評価します.
unless
例:
unless $baby feed_meat else feed_milk end
文法:
unless 式 [then] 式... [else 式...] end
unless
は条件実行を行うが,条件がif
と反対で,条件が偽の時に実行を行います.
unless
修飾子例:
print "stop\n" unless valid($passwd)
文法:
式 unless 式
右辺の条件が成立しない時に,左辺の式を評価します.
case
例:
case $age when 0 .. 2 "baby" when 3 .. 6 "little child" when 7 .. 12 "child" when 12 .. 18 "youth" else "adult" end
文法:
case 式 [when 式 [, 式]...[then] 式..].. [else 式..] end
case
は一つの式に対する一致判定による分岐を行い
ます.最初の式を評価した結果とwhen
節で指定され
た値を比較して,一致する場合にはwhen
節の本体を
実行します.一致の判定は演算子 ===
で行われます.
つまり,
case 式0 when 式1, 式2 stmt1 when 式3, 式4 stmt2 else stmt3 end
は以下のif
式とほぼ等価です.
_tmp = 式0 if 式1 === _tmp || 式2 === _tmp stmt1 elsif 式3 === _tmp || 式4 === _tmp stmt2 else stmt3 end
and
例:
test && set test and set
文法:
式 `&&' 式 式 `and' 式
まず,左辺を評価して,結果が真であった場合には右辺も評価しま
す.and
は同じ働きをする優先順位の低い演算子です.
or
例:
demo || die demo or die
文法:
式 `||' 式 式 or 式
まず,左辺を評価して,結果が偽であった場合には右辺も評価しま
す.or
は同じ働きをする優先順位の低い演算子です.
not
例:
! me not me i != you
文法:
`!' 式 not 式
式の値が真である時偽を,偽である時真を返します.
式 `!=' 式
!(式 == 式)
と同じ.
式 `!~' 式
!(式 ~= 式)
と同じ.
例:
1 .. 20 /first/ ... /second/
文法:
式1 `..' 式2 式1 `...' 式2
条件式以外の場所では式1から式2までの範囲オブジェクトを返しま す.範囲オブジェクトはRangeクラス のインスタンスです.
条件式として範囲指定式が用いられた場合には,式1が真になるま
では偽を返し,その後は式2が真を返すまでは真を返します.式2が
真になれば状態は偽に戻ります...
は式1が真になっ
た時にすぐに式2を評価し(awkのように),...
は次の
評価まで式2を評価しません(sedのように).
while
例:
while sunshine work() end
文法:
while 式 ... end
式を評価した値が真の間,本体を繰り返して実行します.
while
修飾子例:
sleep while idle
文法:
式 while 式
右辺の式を評価した値が真の間,左辺を繰り返して実行します.右
辺の式が begin
である場合には,左辺を最低一度は
評価します.
until
例:
until sunrise sleep end
文法:
until 式 ... end
式を評価した値が真になるまで,本体を繰り返して実行します.
until
修飾子例:
work until tired
文法:
式 until 式
右辺の式を評価した値が真になるまで,左辺を繰り返して実行しま
す.右辺の式が begin
である場合には,左辺を最低
一度は評価します.
例:
[1,2,3].each do |i| print i*2, "\n" end [1,2,3].each{|i| print i*2, "\n"}
文法:
method_call do [`|' expr...`|'] expr...end method_call `{' [`|' 式...`|'] 式...`}'
イテレータとは制御構造(特にループ)の抽象化のために用いられる
メソッドの一種です.begin ... end
または{ }
で囲まれたコードの断片(イテレータブロックと呼ばれる)
を後ろに付けてメソッドを呼び出すと,そのメソッドの内部からブ
ロックを評価できます(おそらくは複数回).このようなイテレータ
ブロックを呼び出すメソッドをイテレータと呼びます.イテレータ
からのブロックの呼び出しは
yield
式を用います.
{}
の方がdo
ブロックよりも結合強度が
強いです.例えば:
foobar a, b do .. end # foobar がイテレータとして呼び出されます foobar a, b { .. } # b がイテレータとして呼び出されます
イテレータブロックの中で初めて代入された(宣言された)ローカル 変数はそのブロックの中でだけ有効です.例えば
foobar { i = 20 # ローカル変数 `i' が宣言された ... } print defined? i # `i' はここでは未定義 foobar a, b { .. } # ブロック内部でだけ有効
for
例:
for i in [1, 2, 3] print i*2, "\n" end
文法:
for lhs... in 式 式.. end
式を評価した結果のオブジェクトの各要素に対して本体を繰り返し て実行します.これは以下の式とほぼ等価です.
「ほぼ」というのは,イテレータブロックは新しいローカル変数の 有効範囲を導入するのに対し,(式).each `{' `|' lhs..`|' 式.. `}'
for
文はローカル変数
のスコープに影響を及ぼさない点が異なるからです.
yield
例:
yield data
文法:
yield `(' [式 [`,' 式...]]) yield [式 [`,' 式...]]
引数をイテレータブロックの引数として代入して,イテレータブロッ
クの呼び出しを行ないます.引数の代入は多重代入と同じルールで
行われます.yield
を実行したメソッドがイテレータ
として呼び出されていない時には例外が発生する.
yield
の値はブロックを評価した値です.
raise
例:
raise "you lose" # raise RuntimeError # both raises SyntaxError raise SyntaxError, "invalid syntax" raise SyntaxError.new("invalid syntax") raise # re-raise last exception
文法:
raise raise message/exception raise error_type, message
例外を発生させます.第一の形式では直前の例外を再発生させます.
第二の形式では,引数が文字列であった場合,その文字列をメッセー
ジとする RuntimeError
例外を発生させます.引数
が例外であった場合にはその例外を発生させます.第三の形式では
第一引数で指定された例外を,第二引数をメッセージとして発生さ
せます.
発生した例外は変数 $! に格納されます.また例外が 発生したソースコード上の位置は変数 $@ に格納され ます.
raise
は ruby の予約語ではなく,
Kernel
クラスで定義されているメソッドです.
raise
には fail
という別名も定義さ
れています.
begin
例:
begin do_something rescue recover ensure must_to_do end
文法:
begin 式.. [rescue [error_type,..] 式..].. [ensure 式..] end
begin
は本体を評価し,最後に評価された式の値を返
します.
本体の実行中に例外が発生した場合,rescue
節が与
えられていた場合例外を捕捉できます.発生した例外と一致する
rescue
節が存在する時にはrescue
節の
本体が実行されます.例外の一致判定は例外のクラスが
rescue
節で指定したクラスと同じかまたはサブクラ
スであるかどうか kind_of?
を用いて判定されます.クラスが省略された時は全ての例外のスー
パークラスであるException
が指定されているとみな
します(SystemExit
とInterrupt
は
Exception
では捕捉できません).
rescue
ではerror_type
は通常の引数と
同じように評価され,そのいずれかが一致すれば本体が実行されま
す.error_type
を評価した値がクラスやモジュール
でない場合には例外TypeError
が発生します.
ensure
節が存在する時はbegin
式を終
了する直前に必ずencure
節の本体を評価します.
retry
例:
retry
文法:
retry
begin
式のrescue
節で使われた場合,
begin
式を始めからもう一度実行します.
begin do_something # exception raised rescue # handles error retry # restart from beginning end
イテレータ,イテレータブロックまたはfor文の中で使われた場合 には,そのイテレータを起動しなおします.イテレータの引数も再 評価されます.
for i in 1..5 retry if some_condition # i == 1 からやり直し end
# ユーザ定義の "untilループ" def UNTIL(cond) yield retry if not cond end
rescue
節やイテレータ以外でretryが用いられた場合
にはエラーになります.
retry
は ruby の予約語ではなく,
Kernel
クラスで定義されているメソッドです.
retry
が再定義されてしまった場合に備えて,
retry!
という別名も定義されています.
return
例:
return return 12 return 1,2,3
文法:
return [式[`,' 式...]]
式の値を戻り値としてメソッドの実行を終了します.式が2つ以上
与えられた時には,それらを要素とする配列をメソッドの戻り値と
します.式が一つもない場合には nil
が戻り値とな
ります.
break
例:
i=0 while i<3 print i, "\n" break end
文法:
break
break
はもっとも内側のループを脱出する.Cと違い,
break
はループを脱出する作用だけを持ち,
case
を抜ける作用は持ちません.
break
は ruby の予約語ではなく,
Kernel
クラスで定義されているメソッドです.
break
が再定義されてしまった場合に備えて,
break!
という別名も定義されています.
next
例:
next
文法:
next
next
はもっとも内側のループの次の繰り返しにジャ
ンプします.
next
は ruby の予約語ではなく,
Kernel
クラスで定義されているメソッドです.
next
が再定義されてしまった場合に備えて,
next!
という別名も定義されています.
redo
例:
redo
文法:
redo
ループ条件のチェックを行なわず,現在の繰り返しをやり直します.
redo
は ruby の予約語ではなく,
Kernel
クラスで定義されているメソッドです.
redo
が再定義されてしまった場合に備えて,
redo!
という別名も定義されています.
例:
class Foo < Super def test : end : end
文法:
class 識別子 [`<' superclass ] 式.. end
例:
class << obj def test : end : end
文法:
class `<<' expr 式.. end
クラス定義と同じ構文で特定のオブジェクトの機能を定義します. この構文の内部で定義したメソッドや定数は指定したオブジェクト に対してだけ有効になります.
例:
module Foo def test : end : end
文法:
module 識別子 式.. end
モジュールを定義します.モジュール名はアルファベットの大文字 で始まる識別子です.
例:
def fact(n) if n == 1 then 1 else n * fact(n-1) end end
文法:
def 識別子 [`(' [arg ['=' default]]...[`,' `*' arg ]`)'] 式.. end
メソッドを定義します.メソッドは定義する前に呼び出すことはで きません.例えば
foo def foo print "foo\n" endは未定義メソッドの呼び出しで例外を発生します.
仮引数にデフォルト式が与えられた場合,メソッド呼び出し時に実
引数が与えられなかった場合にはデフォルト式を評価した結果で初
期化されます(デフォルト式の評価は呼び出し時に行われます).一
番最後の仮引数の直前に*
がある場合には残りの実引
数はみな配列としてこの引数に格納されます.
メソッド定義はネストできません.
メソッドの戻り値はreturn
で
与えた値か,または本体の最後で評価した式の値です.
メソッドには呼び出し制限を加えることができ,制限を加えられた メソッドは,関数形式でしか呼び出せません(privateメソッド).
新規にメソッドを定義する場合,クラス定義の外にあるdef式はデ フォルトではprivateメソッドを定義し,クラス定義の中にあるdef 式はpublicメソッドを定義します.スーパークラスのメソッドを再 定義する場合には定義されるメソッドの可視性はスーパークラスの メソッドのものを受け継ぎます.
メソッドの可視性を変更する場合には
Module
クラス
で定義されている
public
,
private
を用い
ます.
例:
def foo.test print "this is foo\n" end
文法:
def 式 `.' 識別子 [`(' [引数 [`=' default]]...[`,' `*' 引数 ]`)'] 式.. end
特異メソッドとはある特定のオブジェクトに固有のメソッドです. 特異メソッドの定義はネストできます.
クラスの特異メソッドはそのサブクラスにも継承されます.言い替 えればクラスの特異メソッドは他のオブジェクト指向システムにお けるクラスメソッドの働きをすることになります.
alias
例:
alias foo bar alias $MATCH $&
文法:
alias 新メソッド名 旧メソッド名 alias 新変数名 旧変数名
メソッドあるいは大域変数に別名をつけます.メソッドの定義内で 別名を付けることはできません.
別名を付けられたメソッドは,その時点でのメソッド定義を引き継 ぎ,元のメソッドが再定義されても,再定義前の古いメソッドと同 じ働きをします.
正規表現の部分文字列に対応する変数
$1
,$2
,...には別名を付けることがで
きません.また,インタプリタに対して重要な意味のある大域変数
を再定義すると動作に支障を来す場合があります.
undef
例:
undef bar
文法:
undef メソッド名
メソッドの定義を取り消します.メソッドの定義内で定義を取り消
すことはできません.alias
による別名定義と
undef
による定義取り消しによってクラスのインタフェー
スをスーパークラスと独立に変更することができます.ただし,メ
ソッドがselfにメッセージを送っている場合もあるので,よく注意
しないと既存のメソッドが動作しなくなる可能性があります.
defined?
例:
defined? print defined? File.print defined?(foobar) defined?($foobar) defined?(@foobar) defined?(Foobar)
文法:
defined? 式
式が定義されていなければ,偽を返す.定義されていれば式の種別 を表す文字列を返す.