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オブジェクトとして受け取るように変更。

 

-テクノロジー
-,

執筆者:

関連記事

今更ながらRubyでTwitterへ自動ツイートできるプラグラムを作ってみたので、2017年12月現在手順通りに行うだけで同じように作れる情報を共有。

どうも、こがわです。 今更ながらRubyでTwitterへ自動ツイートできるプラグラムを書いてみたので共有します。 INDEX環境情報開発事前準備Twitterでアプリ登録Twitter APIをコー …

Zapierを使わずRaspberry Pi 3でTogglのタイムトラッキングデータをGoogle Calendarへ同期するようにした話

どうも、こがわです。 以前にZapierを使ってGoogleカレンダーとTogglを同期!行動を可視化して自制を促進しよう!を書いたばかりなのに、もうZapierを使わないでTogglとGoogle …

no image

iOS開発 – Swift3.0でLTMorphingLabelをCocoaPodsで導入時、コンパイルエラーになる問題を解決

現執筆時、2016/11/19(土)の時点で、CocoaPodsでLTMorphingLabelをインストールしたときにコンパイルエラーとなる問題の回避方法をご紹介致します。 コンパイルエラー時のスク …

Ionic3でGoogleMaps表示とGoogle PlacesAPIを用いたAutocomplete機能を持つアプリを作る方法その1: GoogleMapsで現在地をマーカーで表示する。

どうも、こがわです。 とあることをきっかけにGoogle Mapsをハイブリッドアプリで使う機会が出来たので、得た知見を共有したいと思います。 例にもれず使用したフレームワークはIonicです。 ちな …

no image

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

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

プロフィール

プロフィール

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

ポートフォリオはこちら