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

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

qiita.com

Ruby は毎年クリスマスにバージョンが上がります。 今年も順調にいけば 12/25 に Ruby 2.6 がリリースされる予定です。

2.6 がリリースされるまで毎日少しずつ変更点を見ていきます。 ソースは NEWS です。

言語仕様

$SAFE がグローバルになり、1から0への変更も可

https://bugs.ruby-lang.org/issues/14250

2.5 では $SAFE はスレッド/Procローカルな状態を保持していましたが、2.6 ではグローバルになります。

p $SAFE     # => 0
proc do
  $SAFE = 1
  p $SAFE   # => 1
end.call
p $SAFE     # => 2.5では0, 2.6では1

あと 2.5 では一旦 1 にすると 0 に戻すことはできませんでしたが、2.6 では 0 に戻すことができます。

$SAFE = 1
$SAFE = 0   # 2.5 ではエラー tried to downgrade safe level from 1 to 0 (SecurityError)

個人的には $SAFE は使わないので、わりとどうでもいいです。

リファインメント

リファインメントで to_proc を定義した場合にメソッド引数の & でも使用される https://bugs.ruby-lang.org/issues/14223

public_send でリファインメントが使用される https://bugs.ruby-lang.org/issues/15326

respond_to? でリファインメントが使用される https://bugs.ruby-lang.org/issues/15327

明に呼び出すメソッドではなく、暗に呼び出されるメソッドにもリファインメントを拡張する流れのようです。

rescue 無しで else を使用するとエラー

次のようなスクリプトはパース時に構文エラーになります。 2.5 までは warning でした。

begin
  p 1
else
  p 2
end

2.5

% ruby /tmp/a.rb
/tmp/a.rb:5: warning: else without rescue is useless
1
2

2.6

% ruby /tmp/a.rb
/tmp/a.rb:3: else without rescue is useless

非ASCIIの大文字で始まる識別子は定数

https://bugs.ruby-lang.org/issues/13770

A = 1
p defined?(A)  #=> 2.5では "local-variable"、2.6では "constant"
class#=> 2.5では構文エラー "class/module name must be CONSTANT"
end

あんまり非ASCIIの識別子をプログラム中で使う人はいないと思いますが、もし使ってたら注意。 なお、ひらがなカタカナの「あ」とかは「ぁ」に比べて大文字と言ってもいいと思いますが、ローカル変数のままです。

終端の無い範囲

https://bugs.ruby-lang.org/issues/12912

範囲指定は (1..9) のように書きますが、終端が無い (1..) という表記も可能になりました。

ary[1..]                            # ary[1..-1]と同じ
(1..).each {|index| ... }           # 1から始まる無限ループ
ary.zip(1..) {|elem, index| ... }   # ary.each.with_index(1){ } と同じ結果