「初めてのRuby」を読むの続き
7章 メソッド
7.3 ブロック付きメソッド
から
■7.3 ブロック付きメソッド
・メソッド呼び出しにはブロックを付加できる
→引数とともにメソッドに引き渡される
・ブロック付きメソッド呼び出しの主な用途は3つ
→ループの抽象化:2章
ブロックへの機能追加。典型的にはリソース管理:5章
コールバック関数・イベントハンドラ:Arrays.sort
・ブロックの数
・複数のブロックが必要になる場合はほとんどないことが
歴史的に知られている
→どうしても必要な場合は、Proc.newやlambdaを使う
■7.3.1 クロージャーとしてのブロック
・ブロックがクロージャーとして振舞っている
→ブロック内に現れる自由変数はブロックの外部環境に従う
→ブロックの外と中で変数が共有され、ブロック内で変数を
書き換えると、外部にも影響する
■7.3.2 ブロック引数とブロックローカル変数
・メソッドに渡したブロックはメソッドから呼び返されるときに
引数を受け取ることが出来る
・ブロックは独自のローカル変数をもちことが出来る
・Ruby1.9で文法が整理された
→工法互換性が損なわれている
・Ruby1.9の場合
ブロック付き呼び出しは、新しい変数スコープを用意する
ブロック引数は、外部のローカル変数とは独立
→同名の変数があっても、互いに影響しない
ブロック変数に続けて、任意のブロックローカル変数を宣言することが出来る
→これらの変数は、外部の同名のローカル変数とは独立したものになる
→ブロック内の初出のローカル変数は、宣言しなくてもブロックローカル
・Ruby1.8
ブロック引数はローカル変数と独立していない
→同名のローカル変数があると、上書きする
→ブロックローカルの宣言構文はない
→初出のローカル変数がブロックローカルになるのは同じ
・以下の2点に気をつければ、1.8と1,9の混乱はされられる
外部のローカル変数と同名のブロック引数を用いない
外部で既出のローカル変数はブロック内外で共有(クロージャー)
■7.3.3 ブロック付きメソッドの定義
・特別な方法はなく、def式を用いて定義
・yield式は、メソッド内から呼び出し側のブロックをコールバックする構文
→後に0個以上の式を取ることが出来る
→それらの式の値をブロック呼び出し時に、ブロック引数として渡す
・イテレーター内のyield
yieldを利用する点を除いては、ブロックつきメソッドは普通のメソッドと
変わらない
メソッド本体では任意の処理を行える
どんな形でyieldを実行しても良い
・Enumeration
Ruby1.9では、ブロックを付けずにイテレータを呼び出すと、Enumerable::Enumerator
オブジェクトが返る
ユーザー定義のイテレーターはそうはいかない
→自前で明示的に実装する
・yield式は、ブロックの評価値を返す
→ブロックをつけていない場合は例外発生
■7.3.4 Proc
・受け取ったブロックを変数に代入したり、他のメソッド呼び出しの引数にしたい
→呼び出し側のブロックをオブジェクトとして取得したい
→仮引数リストの最後に&で修飾された引数を置く
→この引く数に呼び出し側のブロックをあらわすProcオブジェクトが
格納される
・ブロックをProc化してためておいて後で使うのもよくある
・Procをコードブロックの代わりに引き渡す
→&で修飾して、引数リストの最後におく
7章 メソッド
7.3 ブロック付きメソッド
から
■7.3 ブロック付きメソッド
・メソッド呼び出しにはブロックを付加できる
→引数とともにメソッドに引き渡される
・ブロック付きメソッド呼び出しの主な用途は3つ
→ループの抽象化:2章
ブロックへの機能追加。典型的にはリソース管理:5章
コールバック関数・イベントハンドラ:Arrays.sort
・ブロックの数
・複数のブロックが必要になる場合はほとんどないことが
歴史的に知られている
→どうしても必要な場合は、Proc.newやlambdaを使う
■7.3.1 クロージャーとしてのブロック
・ブロックがクロージャーとして振舞っている
→ブロック内に現れる自由変数はブロックの外部環境に従う
→ブロックの外と中で変数が共有され、ブロック内で変数を
書き換えると、外部にも影響する
■7.3.2 ブロック引数とブロックローカル変数
・メソッドに渡したブロックはメソッドから呼び返されるときに
引数を受け取ることが出来る
・ブロックは独自のローカル変数をもちことが出来る
・Ruby1.9で文法が整理された
→工法互換性が損なわれている
・Ruby1.9の場合
ブロック付き呼び出しは、新しい変数スコープを用意する
ブロック引数は、外部のローカル変数とは独立
→同名の変数があっても、互いに影響しない
ブロック変数に続けて、任意のブロックローカル変数を宣言することが出来る
→これらの変数は、外部の同名のローカル変数とは独立したものになる
→ブロック内の初出のローカル変数は、宣言しなくてもブロックローカル
・Ruby1.8
ブロック引数はローカル変数と独立していない
→同名のローカル変数があると、上書きする
→ブロックローカルの宣言構文はない
→初出のローカル変数がブロックローカルになるのは同じ
・以下の2点に気をつければ、1.8と1,9の混乱はされられる
外部のローカル変数と同名のブロック引数を用いない
外部で既出のローカル変数はブロック内外で共有(クロージャー)
■7.3.3 ブロック付きメソッドの定義
・特別な方法はなく、def式を用いて定義
・yield式は、メソッド内から呼び出し側のブロックをコールバックする構文
→後に0個以上の式を取ることが出来る
→それらの式の値をブロック呼び出し時に、ブロック引数として渡す
・イテレーター内のyield
yieldを利用する点を除いては、ブロックつきメソッドは普通のメソッドと
変わらない
メソッド本体では任意の処理を行える
どんな形でyieldを実行しても良い
・Enumeration
Ruby1.9では、ブロックを付けずにイテレータを呼び出すと、Enumerable::Enumerator
オブジェクトが返る
ユーザー定義のイテレーターはそうはいかない
→自前で明示的に実装する
・yield式は、ブロックの評価値を返す
→ブロックをつけていない場合は例外発生
■7.3.4 Proc
・受け取ったブロックを変数に代入したり、他のメソッド呼び出しの引数にしたい
→呼び出し側のブロックをオブジェクトとして取得したい
→仮引数リストの最後に&で修飾された引数を置く
→この引く数に呼び出し側のブロックをあらわすProcオブジェクトが
格納される
・ブロックをProc化してためておいて後で使うのもよくある
・Procをコードブロックの代わりに引き渡す
→&で修飾して、引数リストの最後におく