ruby-trunk-changes r52498 - r52505

今日は frozen_string_literal: true の時に "#{var}" のように式展開を含む文字列も freeze するようにする変更と、新機能として Array#dig と Hash#dig というネストした要素にアクセスするためのメソッド追加がありました。

kazu: r52498 2015-11-09 00:13:18 +0900

r52473 と r52487 の ChangeLog エントリの typo 修正。

svn: r52499 2015-11-09 00:13:35 +0900

version.h の日付更新。

hsbt: r52500 2015-11-09 15:56:36 +0900

make test や make test-all での coverage のための simplecov を clone してくるリポジトリは hsbt さんの fork から gituhb.com/ruby に fork したものを取ってくるように変更しています。

shugo: r52501 2015-11-09 17:32:37 +0900

r52087 で frozen_string_literal: true のコンパイルオプションが有効な時(magic comment がついている時)も "#{x}" のように式展開を含み、なおかつその中身が文字列リテラルだけでないような時は freeze しない文字列を返すようにしていましたが、やっぱり式展開が含まれる場合も freeze するようにしています。例外にするには理由が弱いということでやっぱり一貫して freeze するようにしています。 [ruby-core:57574] [Feature #8976]
ちょっと話がそれますが %w{ a b } # => ["a", "b"] や %W{ #{a}, #{b} } のような %w, %W 記法の時も frozen_string_literal: true で配列の各要素の文字列は freeze されるのかな…と確かめてみると freeze されているようでした。

hsbt: r52502 2015-11-09 17:38:20 +0900

r52500 の続きで simplecov は本家の github.com/colszowka/simplecov を直接使うようにして、タグ(v0.10.0)を指定して clone するようにしています。また simplecov-html と docile といったリポジトリも clone してくるようにしています。

yuki: r52503 2015-11-09 18:02:32 +0900

gems/bundled_gems に記載されている bundle される did_you_mean.gem のバージョンを 1.0.0.beta3 に更新しています。 最近のコミット(https://github.com/yuki24/did_you_mean/commits/master)を眺めてみると NameError#receiver を活用するようにする変更などがあったみたいです。

nobu: r52504 2015-11-09 21:27:26 +0900

Array#dig および Hash#dig という新しいメソッドが追加されています。ネストした Array や Hash の深い場所の要素に、nil チェックしながら a[k1] && a[k1][k2] && k[k1][k2][k3] みたいに参照したいことはとてもよくありますが、これが a.dig(k1, k2, k3) でできるようになるというメソッドです。 rb_obj_dig() という関数も定義されていますが、Object#dig が定義されているわけではなくて Array#dig と Hash#dig から再帰的に呼び出すためのものです。ここをみると独自に dig メソッドを定義しておけば Array や Hash の dig の挙動を模倣させることもできるようです。これはよくあるちょっと面倒ケースが簡単に書けてしかもメソッド呼び出しを減らせる(Array と Hash だけの場合は)ので効率的にもなっていいですね。 [ruby-core:71293] [Feature #11643]
しかしリリース前に新機能とか文法変更とかラッシュで入りますね…。

nobu: r52505 2015-11-09 21:48:20 +0900

r52504 で追加した rb_obj_dig() でもありましたが rb_check_funcall() でメソッドがあったら呼び出して、なかったら指定の VALUE の値を返す(Qundef の場合が多いと思いますが dig だと Qnil ですね)という処理を rb_check_funcall_default() という関数として切り出して使いまわすようにするリファクタリングをしています。 [ruby-core:71293] [Feature #11643]