ruby-trunk-changes r47645 - r47652

今日は Binding#eval 内での super が呼べないという不具合の修正の他、Hash のキーの文法の拡張や Enumerable#slice_when の追加などの新機能追加がありました。

nobu: r47645 2014-09-20 07:55:59 +0900

Binding#eval の中で super が効かないという不具合を修正しています。いやー、これ binding をこのメソッドの外に持ち出してから eval("super") したらやっぱり binding 取得したところの super が呼ばれるというのが正しいというのはわかるけど、なんかすごい。しかし cfp->klass に block->self のクラスを代入していて、こういうあたりといじるとだいたい別のところでなにか出てきたりするんですよね…。2.0.0 からの regression じゃないかということですが、しばらく様子をみよう。 [ruby-core:65122] [Bug #10263]

svn: r47646 2014-09-20 07:56:10 +0900

version.h の日付更新。

akr: r47647 2014-09-20 10:17:05 +0900

拡張ライブラリ openssl の OpenSSL::BN#pretty_print と OpenSSL::X509::Name#pretty_print、OpenSSL::X509::Certificate#pretty_print という証明書などのデータを文字列化した表現にするメソッドを追加しています。

nobu: r47648 2014-09-20 10:23:02 +0900

バイトコードへのコンパイル時のキーワード引数の名前リストを ID の数値で管理していたのを Symbol を使うようにしています。 dynamic symbol は ID が Fixnum に収まらない範囲の数値になることがあるため to_sym した Symbol と同名のキーワード引数を定義しようとした時にエラーになる不具合の修正。 [ruby-dev:48564] [Bug #10266]

nobu: r47649 2014-09-20 10:48:43 +0900

Hash のキーの文法を拡張していて、以下のように Symbol のキーにクオートが必要な文字を含むものをクオート付きで書けるようにしています。おおーついに入ったのですね。ということは 2.2 から使えることになるかも。 [ruby-core:34453] [Feature #4276]

{
  key: 42,
  "ill-formed-key": 72
}
  # => {:key=>42, :"ill-formed-key"=>72}

この :"ill-formed-key" は ':' がついているので Symbol です。文字列のキーが書けるようになったのではなくて、そのままでは書けなかった(クオートが必要な) Symbol のキーが ":" で区切る記法で書けるようになったというものです。

nobu: r47650 2014-09-20 11:49:24 +0900

r47649 で追加したクオートつき Symbol のキーの記法について NEWS ファイルに追記しています。

hsbt: r47651 2014-09-20 11:55:27 +0900

.travis.yml に対象 OS として Mac OS X を追加しています。TravisOS X がテストできるようになった(なってた)のを利用するようにしたのですね。
また test_copied_ivar_memory_leak のメモリリークテストのメモリ増加量のしきいちをデフォルトの 1.5 から 1.8 に増やしています。 https://github.com/ruby/ruby/pull/723

akr: r47652 2014-09-20 15:52:29 +0900

Enumerable#slice_when という新規メソッドを追加しています。 これは隣りあった要素を2つの引数としてブロックを呼び出して真を返したらそこで区切るというパターンの slice です。テストケースからいくつか例をひっぱると

[1,4,9,10,11,12,15,16,19,20,21].slice_when {|i, j| i+1 != j }.to_a
  # => [[1], [4], [9,10,11,12], [15,16], [19,20,21]]

とすると連続している(1ずつ増えている)かたまりに分解しますし

[7, 5, 9, 2, 0, 7, 9, 4, 2, 0].slice_when {|i, j| i.even? != j.even? }.to_a
  # => [[7, 5, 9], [2, 0], [7, 9], [4, 2, 0]]

とすると奇数/偶数の種類ごとのかたまりに分解されるという具合です。 [ruby-core:62499] [Feature #9826]