Ruby 2.1.0がリリースされたそうですが
ちなみにリリース日はクリスマスとのことです。気になったのをいくつかピックアップしてご紹介。
新しく分数と複素数のリテラルが追加された
1/2r # 1/2(Rational(1, 2)) 0.333_333_333r # Rational(333_333_333, 1_000_000_000) 1.2i # 1.2i(Complex(0, 1.2))
有理数については小数を与えた場合、それを有限小数と見立てた場合の既約分数になります。これは今までもそうでしたね。rとiを同時に指定すると有理数の虚数となります。
def式の戻り値がSymbolになった
今まではnilでした。こうすると「private def hoge()」みたいなのが書けるようになります。
private def hoge; end TypeError: nil is not a symbol from (pry):2:in `private'
ちなみに2.0.0までだと上のようになります。
ガベージコレクションの刷新
RGenGCというあたらしいガベージコレクションを使うようになりました。世代別GCをもう少し発展させたものらしいですが、この辺の戦略について書くにはもう少し勉強が必要そうです。
RGenGCの発表資料を読んだ - oupoの日記
Refinementの正式実装
Ruby2.0で実装される予定でしたが先送りされたものです*1。モンキーパッチやオープンクラスによる拡張の影響を限定する機能だそうで、using ModuleNameというふうにすると特定のスコープでのみその拡張が有効になるのだとか。モンキーパッチによる野放図な拡張を防ぐ効果があると期待されていたようですが、リリース直前にいろいろわけあって中途半端なことになっていたようです。しかし、今回のアップデートにてはれて正式実装となりました。
Rubyist Magazine - Refinementsとは何だったのか
Array#to_h
[[key, value], [key, value], .. ]というかんじの、2つの要素を持った配列の配列をハッシュに変換します。同じ値のkeyが複数あるときはいちばん最後に現れたvalueに置き換えられます。
気になったのはこんなところ。他にもいろいろ改善点があります。
Ruby2.1.0のリリースノート(英語)
*1:2.0.0でも警告が出るものの限定的に使えるらしい