メソッド呼出し

例:

foo.bar()
foo.bar
bar()
print "hello world\n"
print
Class::new

文法:

[式  `.'] 識別子 [`(' 式 ... [`*' [式]],[`&' 式] `)']
[式 `::'] 識別子 [`(' 式 ... [`*' [式]],[`&' 式] `)']

メソッド呼出し式はレシーバ(`.'の左側の式の値)の メソッドを呼び出します。レシーバが指定されない時はself のメソッドを呼び出します。

`::' を `.' の代わりに使えます。`::' は、クラスメソッ ド呼び出しに使うという流儀がありますが*1、大文字で始まるメソッド名を使うつもりで

Klass::Foo

とした場合定数と見なされるという制限があります。大文字で始まるメソッド 名を使用する場合は

Klass.Foo

と `.' を使うか、

Klass::Foo()

と括弧でメソッド呼び出しであることを明示する必要があります。

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

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

foo(*[1,2,3])

foo(1,2,3)

と同じです。

最後の引数の直前に & がついている場合、その引数で指定した手続き オブジェクト(Proc)やメソッドオブジェクト(Method)がブロック としてメソッドに渡されます。詳細はイテレータを参 照してください。

メソッド呼び出しの際、privateなメソッドは関数形式 (レシーバを省略した形式)でしか呼び出すことができません。 またprotectedなメソッドはselfがそのメソッド が定義されたのと同じクラス、またはそのサブクラスでなければ 呼び出せません。(呼び出し制限を参照)

super

例:

super
super(1,2,3)

文法:

super
super(式, ... )

superは現在のメソッドがオーバーライドしているメ ソッドを呼び出します。括弧と引数が省略された場合には現在のメソッド の引数がそのまま引き渡されます。引数を渡さずにオーバーライドした メソッドを呼び出すには super() と括弧を明示します。

例:

class Foo
  def foo(arg=nil)
    p arg
  end
end

class Bar < Foo
  def foo(arg)
    super(5)       # 5 を引数にして呼び出す
    super(arg)     # 5 を引数にして呼び出す
    super          # 5 を引数にして呼び出す super(arg) の略記法
    arg = 1
    super          # 1 を引数にして呼び出す super(arg) の略記法
    super()        # 引数なしで呼び出す
  end
end
Bar.new.foo 5

イテレータ

例:

[1,2,3].each do |i| print i*2, "\n" end
[1,2,3].each {|i| print i*2, "\n" }

文法:

method(arg1, arg2, ...)  do [`|' 式 ... `|'] 式 ... end
method(arg1, arg2, ...) `{' [`|' 式 ... `|'] 式 ... `}'
method(arg1, arg2, ..., `&' proc_object)

イテレータとは制御構造の抽象化のために用いられるメソッドです。 最初はループの抽象化のために用いられていましたが、最近では その他の用途も拡大しています。do ... end または { ... } で 囲まれたコードの断片(ブロックと呼ばれる)を後ろに付けてメソッドを 呼び出すと、そのメソッドの内部からブロックを評価できます。 このようなブロックを呼び出すメソッドをイテレータと呼びます。 イテレータからのブロックの呼び出しはyield式を 用います。yield に渡された値は ||の間にはさまれた 変数に代入されます。

{ ... }の方がdo ... endブロックよりも結合強度が 強いです*2。例えば:

foobar a, b do .. end   # foobar がイテレータとして呼び出されます
foobar a, b { .. }      # b がイテレータとして呼び出されます

ブロックの中で初めて代入された(宣言された)ローカル変数はその ブロックの中でだけ有効です。例えば:

foobar {
  i = 20                # ローカル変数 `i' が宣言された
   ...
}
print defined? i        # `i' はここでは未定義なので false
foobar a, b do
  i = 11                # まったく別の変数 i の宣言
   ...
end

以下は逆にブロック外でも有効な例です。

i = 10
[1,2,3].each do |m|
  p i * m               # いきなり i を使える
end

ブロックの代わりに手続きオブジェクト(Proc)をブロックとして渡すに はイテレータの引数の最後に `&' で修飾した手続きオブジェクトを渡 します。Proc の代わりにメソッドオブジェクト(Method)を渡す ことも出来ます。この場合、そのメソッドを呼ぶ手続きオブジェクトが生成さ れ渡されます。

pobj = proc {|v|
  p v
}

[1,2,3].each(&pobj)
=> 1
   2
   3

ruby 1.7 feature: version 1.7 では、to_proc メソッドを持つオブジェクトならば、`&' 修飾した引数として渡すことができます(デフォルトで Proc、Method オブジェ クトは共に to_proc メソッドを持ちます)。to_proc はメソッド呼出し時に実 行され、Proc オブジェクトを返すことが期待されます。

class Foo
  def to_proc
    Proc.new {|v| p v}
  end
end

[1,2,3].each(&Foo.new)

=> 1
   2
   3

イテレータの戻り値は、通常のメソッドと同様ですが、ブロックの中から break により中断された場合は nil を返します。 ruby 1.7 feature: break に引数を指定した場合はその値がイテ レータの戻り値になります。

yield

例:

yield data

文法:

yield `(' [式 [`,' 式 ... ]] `)'
yield [式 [`,' 式 ... ]]

引数をブロックの引数として渡してブロックを評価します。yieldイテレータを定義するために メソッド定義内で使用します。

def foo
  yield(1,2)
end

foo {|a,b| p [a,b]}

ブロック引数の代入は多重代入と同じルールで行われます。 また yield を実行したメソッドにブロックが渡されていない (イテレータではない) 時は例外 LocalJumpError が発生します。

yield はブロック内で最後に評価した式の値を返します。また、 next によりブロックの実行が中断された場合は nil を返します。

ruby 1.7 feature: next に引数を指定した場合はその値が yield の戻り値になりま す。


*1あらい 2002-04-21: このマニュ アルでは `::' の流儀を積極的には使いません。クラスメソッドとインスタン スメソッドの表記を使い分けるのは難しいと考えている(実際、同じスクリプ ト内で `::' を使ったり、`.' を使ったりと一貫しない例は良く見かける)の と、クラスが普通のオブジェクトと同様オブジェクトであることの理解を妨げ る。大文字のメソッドに関してここに書いた制限があるのが煩わしい。という 個人的な考えからです
*2あらい:2001-04-02 version 1.6.0 から 1.6.2 までは この結合強度の違いがなくなっていましたが、これはバグです。version 1.6.3 で修正 されました