Module#refine + using
2.0までは実験的機能(experimental)であり使用すると警告が出ていましたが、2.1でめでたく標準機能入りした機能です。Module#refine
は引数にクラスとブロックを取り、ブロック内でそのクラスの機能を拡張してやります。
こうしてrefineブロックで定義した機能は、using
を呼び出したレシーバのスコープにおいてのみ有効化されます。
「地の文」、つまりmain
部分で呼び出したときはこうなります。
ここまではシンプルですが、モジュール定義内でusing
して、そのモジュールを別のクラスにinclude...などと考えだすとなかなか複雑になってきます。
あまり気軽に使える機能ではないと思いますが、使いドコロとしては例えば「Stringクラスの既存メソッドを書き換える必要があるけど、グローバルに変更してしまうと影響範囲が大きくて怖い...」というケースなどの、範囲を限定した標準ライブラリに対するモンキーパッチなどでしょうか。
参考: Rubyist Magazine - Refinementsとは何だったのか
余談
倉持: 被告人のPCで何をしていたか
M氏: VisualStudioを使ったC#のプログラムが書かれていたと思います。
倉持: C#と分かったのはなぜか。
M氏: C#特有のキーワードが片山さんが書いているプログラムにあった。
倉持: 具体的には
M氏: "using"と"namespace"
【PC遠隔操作事件】C#でのプログラム作成能力を巡って(第6回公判メモ)(江川 紹子) - 個人 - Yahoo!ニュース
以上
Ruby2.1の機能紹介は以上です。
今回紹介したような新機能/新構文に加えて、VMの性能もアップしているそうなので既に2.0を使っている人はバージョンアップの動機付けになるかもしれません。