Ruby2.6アドベントカレンダーの1日目の記事です。
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
を使用するとエラー
https://bugs.ruby-lang.org/issues/14606
次のようなスクリプトはパース時に構文エラーになります。 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 B #=> 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){ } と同じ結果