Rubyのラムダ徹底解説――基本から実践的な応用テクニックまで
Rubyにおいてブロックは非常に重要な存在であり、ブロックなしにこの言語を語ることはできません。では、ラムダはどうでしょうか?ラムダを愛している人はいるのでしょうか?実際のところ、何年もラムダを使わずに過ごすことだって可能かもしれません。まるで昔の時代の遺物のように見えることもあるでしょう。
しかし、それは完全な真実ではありません。少し掘り下げてみると、ラムダには興味深い技が数多く隠されているのです。
この記事では、まずラムダの基本的な使い方から始め、その後、より高度で面白い応用へと進んでいきます。すでに毎日ラムダを使いこなしている方は、ぜひ後半の応用編までスクロールしてください。
ラムダについて覚えておくべき最も重要なポイントは、関数のように振る舞うという点です。ブロックやProcにもそれぞれ用途がありますが、どちらも本物の関数と100%同じようには動作しません。ラムダは動作します。それでは、順番に見ていきましょう。
ラムダは引数の数を厳密にチェックする
Procとは異なり、ラムダは引数の数が正しいかどうかを検証します。期待される引数の数と実際に渡された数が一致しない場合、ArgumentErrorが発生します。この厳格さにより、意図しないバグを早期に発見できます。
ラムダはデフォルト引数をサポートする
以下の例では、デフォルト値として「hello world」を持つラムダ関数を作成しています。引数を省略して呼び出した場合はデフォルト値が使われ、値を渡した場合はそちらが優先されます。

returnキーワードは期待通りに動作する
些細なことに聞こえるかもしれませんが、Procの中でreturnを使ったことがある方なら、決して小さな話ではないことをご存知のはずです。
以下の例でお見せしましょう。somethingというメソッドを定義し、その中でProcを呼び出しています。このProcにはreturn文が含まれています。しかしこのreturn文には罠があります。Procから抜けるだけでなく、somethingメソッド全体から抜けてしまうのです。
一方、lambdaで同様の処理を行うと、return文はラムダから抜けるだけです。他の通常の関数とまったく同じように動作します。

ラムダはクロージャである
優れたStack Overflowの投稿からの引用です。
クロージャを最もシンプルに捉えるなら、それは変数として格納できる関数(いわゆる「ファーストクラス関数」)であり、自身が生成されたスコープ内のローカル変数にアクセスできる特別な能力を持つものです。
「ラムダが生成されたスコープ内のローカル変数にアクセスできる」とは、どういうことなのでしょうか?例を見てみましょう。以下のコードでは、marcoという名前のローカル変数を作成しています。この変数はラムダの中で利用できます。さらに、その変数の値を変更すると、ラムダは新しい値を認識します。

ラムダはカメレオンである
ラムダに関する本当に奇妙な点の一つは、呼び出し方の多様さです。以下のサンプルでは、ラムダを呼び出す3つの方法を示しています。これらはすべて同等の結果をもたらします。

少し奇妙に感じるかもしれません。筆者も最初はそうでした。正直に言えば、l.(arg)という構文は今でも不思議に思えます。しかし、l[arg]という構文はかなり興味深いものです。これは、限定的ではありますが、通常配列やハッシュを使う場面でラムダを代用できることを意味しています。
計算されるハッシュ・配列としてラムダを活用する
テストスイートがあると想像してください。初期化の一環として、偽のPersonレコードを作成する必要があります。これは簡単です。新しいFakePersonレコードを作成し、名前と姓を渡すだけです。
しかし、テストを実行するたびに異なる名前を使ってシステムを「ファジングテスト」したい場合はどうすればよいでしょうか?
一つの有効なアプローチは、ハッシュの代わりにラムダ関数を渡すことです。以下の例では、優れたFaker gemを利用して偽の名前を生成するラムダ関数を使用しています。

ラムダにはカリー化が組み込まれている
カリー化は、関数型プログラミングで頻繁に使われる強力なテクニックです。既存の関数から新しい関数を派生させる手法で、実際のコードを見ればすぐに理解できます。
以下のコードでは、2つの数値を加算するラムダ関数があります。わかりやすくaddという名前を付けています。次に、カリー化を利用して、任意の数値に1を加えるだけの、より特殊化された関数incrementを作成します。

ラムダは特別な種類のProcである
コードサンプルの中で、ラムダ関数を定義すると必ずProcオブジェクトが返ってくることに気づいたかもしれません。これは、Rubyがラムダを一種のProcとして実装しているためです。したがって、この記事で紹介した多くのテクニックは、ラムダだけでなくProcでも実現できます。
スタビーラムダ(->記法)
この記事では分かりやすさを優先してlambdaキーワードを使用してきました。しかし、Ruby 1.9で導入された、より簡潔なラムダ定義構文があり、「スタビーラムダ(stabby lambda)」として広く知られています。アロー演算子のような->を使って記述するこの構文は、現在のRubyコミュニティでは事実上の標準となっています。以下のように使います。

-
RubyでAWS Lambda関数を構築・テスト・デプロイする完全ガイド
ソフトウェア開発は決して簡単ではありませんが、それ以上に大変なのが保守運用です。保守にはソフトウェアのパッチ適用やサーバーの管理が含まれます。この記事では、その中でも特にサーバー管理と運用に焦点を当てて解説します。 従来、サーバーはオンプレミス環境に設置され、物理ハードウェアの購入と維持管理が必要でした。しかしクラウドコンピューティングの登場により、物理的なサーバーを所有する必要はなくなりました。2006年、AmazonがAWSを開始しEC2サービスを発表したことで、現代のクラウドコンピューティングの時代が幕を開けました。この種のサービスにより、物理サーバーの管理やハードウェアのアップグレード
-
Ruby 2.6の新機能9選|コード例でわかる注目ポイントを徹底解説
Ruby 2.6には、開発者の生産性を高める新しい機能やパフォーマンス改善が多数盛り込まれています。 本記事では、Ruby 2.6で導入された9つの注目新機能を、実際のコード例とともにわかりやすく紹介します。最新のRuby動向をキャッチアップしたい方は、ぜひ最後までご覧ください。 1. 無限Range(Endless Range) Ruby 2.5以前でもFloat::INFINITYを使えば終端のない範囲を表現できましたが、Ruby 2.6ではさらに直感的な記法が使えるようになりました。 新しい無限Rangeは次のように書きます。 (1..) 通常のRangeが(1..10)のように終端