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でGoogleMaps表示とGoogle PlacesAPIを用いたAutocomplete機能を持つアプリを作る方法その2: Google PlacesAPIを用いてAutocompleteを実装する。

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

さくらのVPS(CentOS7)にJIRA(オンプレ)をインストールしてみました。

どうも、こがわです。 突然ですが、プライベートでタスク管理ツール使ってますか? 会社では使ってるけど、能動的にプライベートで使ってる人は多くないかもしれません。 タスク管理ツール、いいですよ。 少なく …

no image

WordPress管理画面 – 不正アクセス対策をして攻撃者から自分のブログを守ろう!(Digest認証/管理画面ログインURL変更)

どうも、こがわです。今回はWordPress管理画面の不正アクセス対策について、僕が実践している方法をご紹介します。 WordPress管理画面ログインURLは、基本的に何も変更していなければ、htt …

no image

Digest認証設定方法 – セキュアなユーザー認証を用いて盗聴/改竄を防ごう!

どうも、こがわです。お題の通りなのですが、今回は、Digest認証を用いて認証を突破しない限りページの閲覧ができないようにする方法を説明します。 ユーザー認証は、管理画面などによく用いられていますね。 …

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

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

プロフィール

プロフィール

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

ポートフォリオはこちら