- - 目次

Rubyの文法



字句構造

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}"

ダブルクォート(")で囲まれた文字列式,コマンド文 字列および正規表現,の中では#{式}という形式で式 の内容(を文字列化したもの)を埋め込むことができます.式が変数 記号($,@)で始まる変数の場合には {}を省略して,#変数名という形式で も展開できます.文字#に続く文字が {,$,@でなければ,その まま文字#として解釈されます.明示的に式展開を止 めるには#の前にバックスラッシュを置きます.

数値リテラル

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)
:symbol
識別子/変数名/演算子と一対一対応する整数.

?表現では全てのバックスラッシュ記法が有効である.

変数と定数

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 のメソッドを呼び出します.

メソッド名には通常の識別子の他,識別子に?または !の続いたものが許されます.慣習として,述語(真 偽値を返すメソッド)には?を,同名の (!の無い)メソッドに比べてより破壊的な作用をもつ メソッド(例:trtr!)には !をつけるようになっています.

最後の引数の直前に*がついている場合,その引数の 値が展開されて渡されます.つまり:

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..`]' '=' 式
式`.'識別子 '=' 式

代入式は変数などに値を設定するために用いられます.代入はロー カル変数やクラス定数の宣言にも用いられます.代入式の左辺は以 下のいずれかで無ければなりません.

自己代入

例:

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が指定されているとみな します(SystemExitInterruptExceptionでは捕捉できません).

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? 式

式が定義されていなければ,偽を返す.定義されていれば式の種別 を表す文字列を返す.


- - 目次

matz@caelum.co.jp