Ruby 2.6 の変更点 - 言語仕様その2

Ruby2.6アドベントカレンダーの2日目の記事です。

qiita.com

言語仕様

キーワード引数のハッシュのキーがシンボルでない場合はエラー

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 で発生した例外は barrescue により隠蔽されて元の原因がわからなくなってしまっていました。

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)