Rails (OSS) パッチ会

開催後だいたい2周目に突入して顔ぶれが変わった感があったので、今回は Rails コミッターにまつわる話をしてもらったりしていた。

ここでは、少し横道にそれて Ruby 2.5 の機能についての話を書き残しておく。

Ruby 2.4.1 と Ruby 2.5.0dev で、以下のようにバックトレースの表示が変わる。

対象のソースコード

cat /tmp/a.rb の結果。

def foo; bar; end
def bar; raise 'hi'; end

foo

Ruby 2.4.1 での実行結果

% ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin13]
% ruby /tmp/a.rb
/tmp/a.rb:2:in `bar': hi (RuntimeError)
        from /tmp/a.rb:1:in `foo'
        from /tmp/a.rb:4:in `<main>'

Ruby 2.5.0dev での実行結果

% ruby -v
ruby 2.5.0dev (2017-07-24 trunk 59413) [x86_64-darwin13]
% ruby /tmp/a.rb
Traceback (most recent call last):
        2: from /tmp/a.rb:4:in `<main>'
        1: from /tmp/a.rb:1:in `foo'
/tmp/a.rb:2:in `bar': hi (RuntimeError)

例外の発生順が付与されて、バックトレースの出力順が逆になっていることが確認できる。

これにより例外元を見るためスクリーンを上に辿る必要がなくなるという点はメリットとしてあり、余談ながら Python と同じ出力結果になるらしい (このあたりは良く知らないので風聞) 。

一方で RSpec のバックトレースが追随してくるかどうかという点や、この表示順がこれまでの Ruby ユーザーに優しくなるのかどうかが分からないためフィードバックは募集されているとのこと。