Ruby2.6アドベントカレンダーの2日目の記事です。
言語仕様
キーワード引数のハッシュのキーがシンボルでない場合はエラー
https://twitter.com/yukihiro_matz/status/1022287578995646464
def hoge(*a, **k) end hoge("a"=>1, a: 1) # 2.6ではエラー non-symbol key in keyword arguments: "a" (ArgumentError)
変数名と同じブロックパラメーターでの警告を削除
https://bugs.ruby-lang.org/issues/12490
2.5 では次のように実行すると警告が出ていましたが、2.6では出なくなりました。
% ruby -w -e 'a=123; [1,2,3].each{|a| }' -e:1: warning: shadowing outer local variable - a
もともと 1.8 の時の挙動が 1.9 で変更になったために導入された警告で、そろそろもういいだろうってことのようです。
原因となった例外も出力
https://bugs.ruby-lang.org/issues/8257
次のような感じのプログラムを実行すると
def foo raise "foo!" end def bar foo rescue raise "bar!" end bar
例外で落ちるんですが、
% ruby /tmp/a.rb Traceback (most recent call last): 2: from /tmp/a.rb:9:in `<main>' 1: from /tmp/a.rb:4:in `bar' /tmp/a.rb:7:in `rescue in bar': bar! (RuntimeError)
foo
で発生した例外は bar
の rescue
により隠蔽されて元の原因がわからなくなってしまっていました。
2.6 だと元の原因となった例外も出力されるようになりました。
ruby /tmp/a.rb Traceback (most recent call last): 2: from /tmp/a.rb:9:in `<main>' 1: from /tmp/a.rb:5:in `bar' /tmp/a.rb:2:in `foo': foo! (RuntimeError) 2: from /tmp/a.rb:9:in `<main>' 1: from /tmp/a.rb:4:in `bar' /tmp/a.rb:7:in `rescue in bar': bar! (RuntimeError)