Ruby 2.2.0 preview1: ついに来ました!恒等関数 Kernel#itself などなど

こんにちは、鈴木です。

 

先日(2014/9/18)に Ruby 2.2.0 preview1 が出ましたね!

いくつか新しい機能も増えていたので、気になったものをご紹介します!(詳細な変更内容はこのページで確認することができます。)

 

ついに来ました!恒等関数: Kernel#itself

いわゆる恒等関数と呼ばれる、自身 (self) をそのまま返すメソッド Kernel#itself が追加されました。

他の言語でも恒等関数が組み込みで存在する場合があり、id や identity などの名前で定義されていることが多いです。「名前重要!」の Ruby では恒等関数の導入案は以前からありましたが、名前がなかなか決まらなかったという経緯があります。今回は itself という名前に落ち着いたようで、ようやく導入されました。

Kernel#itself は以下のような動きをします。

要するに self を返してくれるということですね。

具体的な利用例ですが、以下のように配列の値自身で group_by したい場合に綺麗に書くことが出来ます。

他にも send や sort_by の引数が実行時にしか決まらない場合のデフォルト値として itself を使用することも考えられます。

 

Float#next_float, prev_float

数値計算系のプログラムでお世話になりそうなメソッドです。

次の or 前の float って?と思われるかもしれませんが、浮動小数点数には無限の精度があるわけではなく、表現できる値は飛び飛びになっています。

Float#next_float と Float#prev_float は、表現可能な次の or 前の値を返すメソッドです。以下のような結果になります。

これを利用すれば機械イプシロン(1.0 より大きい最小の値と 1.0 との差)を求めることもできます。

 

Binding#local_variables, receiver

メタプロの小道具になりそうなメソッドが追加されました。

Binding#local_variables はそのコンテキストで定義されているローカル変数の名前を返します。

以下のようにすると、呼び出し元で定義されているローカル変数にアクセスすることが出来ます。

これを実行すると次のような出力が得られます。

Binding#receiver は Binding#eval('self') と同じ結果を返すメソッドです(良く利用されるので新しいメソッドとして追加されました)。

以下のように呼び出し元のオブジェクトにアクセスしたい場合に利用します。「Ruby: Procによる変数の隠蔽とbindng」の「Proc#bindingとmethod_missingの合わせ技」では DSL で利用する例を解説しているので、そちらも参考にしてみてください。

これを実行すると、次のような結果が得られます。

 

Enumerable#slice_after

Enumerable#each_slice(n) は n 個ずつにスライスしてくれるメソッドですが、特定の条件を満たす要素の直後でスライスするメソッド slice_after が新しく追加されました。ちなみに slice_before は前からありました。

slice_after は以下のように使います。

以下、実行結果です。

Enumerable モジュールには chunk や each_cons など親戚のようなメソッドをはじめとして、便利なメソッドが数多く定義されているので、リファレンスを一読しておくと良いでしょう。Ruby のバージョンアップごとにメソッドが追加されることもあるので、たまに見直してみると「こんなメソッドがあったのか」ということも多々あります。

 

Method#curry

メソッドをカリー化する Method#curry が追加されました。

以下のような動作をします。

カリー化すると、複数の引数を取るメソッドを、一つの引数を取るメソッドの連鎖に分解することができます。例えば、二つの引数を取るメソッドをカリー化すると、引数が一つで戻り値が「ひとつの引数を取るメソッド」であるメソッドになります。これによって、以下のように引数を部分的に適用し、残りは他の処理に任せる、といったことが簡単に行えます。

 

Method#super_method

Method#super_method を使用すると、メソッドをオーバーライドしているときの親クラスのメソッドを取得することができます。

デバッグで役に立つかもしれません。

 

まとめ

新機能をいくつか見てきましたが、便利そうなものが多いですね。他にもインクリメンタル GC やシンボル GC などの性能面の改善なども行われているので、正式リリースが楽しみです。

 

 

Comments are closed, but you can leave a trackback: Trackback URL.