ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

初めてのRubyを読む その36 7.3

2011-10-25 16:56:04 | Ruby
「初めての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をコードブロックの代わりに引き渡す
  →&で修飾して、引数リストの最後におく
この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 初めてのRubyを読む そ... | トップ | KDDI版IPhoneの○で速度落ちは... »
最新の画像もっと見る

Ruby」カテゴリの最新記事