読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Ruby クロージャであるProcやlambdaをやってみる

Ruby

f:id:secret_hamuhamu:20150501050313p:plain
Rubyクロージャをやってみようと思う。
どうやら、Rubyクロージャを扱うには、Procというものを使わなかればならないらしい。

環境構成


第一級オブジェクト

クロージャを扱うためには、第一級(ファーストクラス)オブジェクトでなくてはなりません。

引用 : wikipedia

第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。


Rubyメソッドは、変数への代入が出来ないので、第一級オブジェクトではない。
第一級オブジェクトではないから変数への代入が出来ないといったほうが正しいのかも。

Rubyメソッドクロージャとして扱うには Proclambda を使います。
厳密に言うと Rubyにおいて Proclambda を扱ったものは、第一級オブジェクトではないらしい。

Procやlambda

Procやlambdaを使うことで、手続きをオブジェクト化出来るとのこと。
Procを扱うにはいくつか記法があるみたい。

# lambdaを使用するパターン
hensu = lambda { |x, y| x * y }

# procを使用するパターン
hensu = proc { |x, y| x * y }

# Proc.newを使用するパターン
hensu = Proc.new { |x, y| x * y }

# ->を使用するパターン
hensu = -> x, y { x * y }

# 呼び出し方
#
# callを使用するパターン
p hensu.call(3, 5)
# []を使用するパターン
p hensu[3, 5]

好きな記法で扱えばいいと思いますが、 -> が一番簡潔なのでそれがよさそう。
黒魔術っぽいですけど。

最近読んだ本

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Effective Ruby

Effective Ruby