例:
foo.bar() foo.bar bar() print "hello world\n" print Class::new
文法:
[式 `.'] 識別子 [`(' 式 ... [`*' [式]],[`&' 式] `)'] [式 `::'] 識別子 [`(' 式 ... [`*' [式]],[`&' 式] `)']
メソッド呼出し式はレシーバ(`.'
の左側の式の値)の
メソッドを呼び出します。レシーバが指定されない時はself
のメソッドを呼び出します。
メソッド名には通常の識別子の他、識別子に?
または
!
の続いたものが許されます。慣習として、述語(真
偽値を返すメソッド)には?
を、同名の
(!
の無い)メソッドに比べてより破壊的な作用をもつ
メソッド(例:tr
とtr!
)には
!
をつけるようになっています。
最後の引数の直前に*
がついている場合、その引数の
値が展開されて渡されます。つまり:
foo(*[1,2,3])
は
foo(1,2,3)
と同じです。
最後の引数の直前に&
がついている場合、その引
数で指定した手続きオブジェクトがブロックとしてメソッドに渡さ
れます。
メソッド呼び出しの際、privateなメソッドは関数形式
(レシーバを省略した形式)でしか呼び出すことができません。
またprotectedなメソッドはself
がそのメソッド
が定義されたのと同じクラス、またはそのサブクラスでなければ
呼び出せません。(呼び出し制限を参照)
例:
super super(1,2,3)
文法:
super super(式, ... )
super
は現在のメソッドがオーバーライドしているメ
ソッドを呼び出します。括弧と引数が省略された場合には現在のメソッド
の引数がそのまま引き渡されます。
例:
def foo( arg ) arg = 1 super arg # 1 を引数にして呼び出す super # 5 を引数にして呼び出す super() # 引数なしで呼び出す end 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
ブロックよりも結合強度が
強いです*1。例えば:
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)をブロックと
して渡すにはイテレータの引数の最後に `&
' で修飾した手
続きオブジェクトを渡します。
pobj = proc {|v| p v } [1,2,3].each(&pobj) => 1 2 3
例:
yield data
文法:
yield `(' [式 [`,' 式 ... ]] `)' yield [式 [`,' 式 ... ]]
引数をブロックの引数として渡してブロックを評価します。
ブロック引数の代入は多重代入と同じルールで行われます。
またyield
を実行したメソッドにブロックが渡されていない
(イテレータではない) 時は例外 LocalJumpError が発生します。
yield
の値はブロックを評価した値です。
*1あらい:2001-04-02 version 1.6.0 から 1.6.2 までは
この結合強度の違いがなくなっていましたが、これはバグです。version 1.6.3 で修正
されました