Kogawa

テクノロジーに少し偏る雑記ブログ

RubyのProcクラスについての学習メモ

投稿日:2018年1月2日 更新日:

学習のためProcクラスについて学んだことをメモしておきます。

Procクラスとは

ブロックをコンテキスト(ローカル変数のスコープやスタックフ レーム)とともにオブジェクト化した手続きオブジェクトです。

Proc は ローカル変数のスコープを導入しないことを除いて 名前のない関数のように使えます。ダイナミックローカル変数は Proc ローカルの変数として使えます。

Proc がローカル変数のスコープを保持していることは以下の例で 変数 var を参照できていることからわかります。

参考: 公式ドキュメント

Procクラスはブロックとして記述された処理を保持しておくためのクラスで、ProcオブジェクトはProcクラスを元に作られたインスタンスでプログラムの一部を保持するオブジェクト。

Procを作る方法

↓のように Proc.new メソッドにブロックを与えると、そのブロックを保持するProcオブジェクトが作られる。

呼び出しは

とすることで呼び出し可能。

↓は実行結果

ラムダ式

Procオブジェクトは Proc.new の他にlambdaメソッドを使用しても作ることができる。

lambdaメソッドは Proc.new と同じくProcオブジェクトを作るが、lambdaメソッドで作成したProcオブジェクトの方が、普通のメソッド呼び出しと同じように使える。

以降、lambdaメソッドで作られたProcオブジェクトをラムダ式と呼ぶ。

Procオブジェクトと比較するラムダ式の特徴

1. 引数チェックが厳密

以下のように、 Proc.new では定義した引数より少なくてもエラーは起きないが、 lambda の場合引数が合わないとエラーになる。

 

2. returnが使える

Proc.new の場合はエラーとなる。

ラムダ式の場合はエラーが起きない

ラムダ式のエイリアス

↑の書き方を↓のように書くこともできる。

ブロックをProcオブジェクトとして受け取る

引数にブロックを指定し、指定する際のブロックをProc引数のような形式で記述するとブロックをProcオブジェクトとして受け取ることができる。

例: 値を合算するメソッド

↑に対しブロックをProcオブジェクトとして受け取るように変更。

 

-テクノロジー
-,

執筆者:

関連記事

Ionic3でハイブリッドアプリ開発時に遭遇した問題と問題に対する対処法の共有

この記事はIonic Advent Calendar 2017の12/22のエントリーです。 アプリを開発するにあたり遭遇した問題を共有しようと思います。 いつか同じ問題に遭遇した時、このページで解決 …

RESTfulなURL設計について簡単にまとめて見ました

どうも、こがわです。 RESTfulなURL設計について、以前に学習したものを復習がてらまとめて見たいと思います。 Webサービスを開発する際、URL設計はとても大事です。 サービスを構成するシステム …

no image

ブログに特化したCMS「Ghost」をさくらのVPSにインストールしてみた

WordPressからGhostに移行しました。 移行の主な理由として、ページ読み込みのレスポンス速度を向上させたかったのです。実際に移行した結果、定量的に見てはいないのですが体感的にかなり速くなった …

WordPressのローカル開発環境にDocker(docker-compose)を用いて4分58秒で開発環境を構築しました

WordPressのテーマをカスタマイズするにあたりローカルで作業する必要があったのですが、MAMPの調子が悪く、新しく開発環境を作らねばならなくなりました。 それならばDocker先生にお世話になろ …

Ionic3でGoogleMaps表示とGoogle PlacesAPIを用いたAutocomplete機能を持つアプリを作る方法その2: Google PlacesAPIを用いてAutocompleteを実装する。

どうも、こがわです。 本記事はIonic3でGoogleMaps表示とGoogle PlacesAPIを用いたAutocomplete機能を持つアプリを作る方法その1: GoogleMapsで現在地を …

プロフィール

プロフィール

地元青森でITエンジニアとしてフリーランスで活動中。フルリモートで生活費を稼ぐ傍、作りたいアプリを黙々と製作中。

ポートフォリオはこちら