Ruby 2.6 の変更点 - Kernel

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

qiita.com

Kernel

Kernel#then 追加

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

Kernel#thenKernel#yield_self の別名として追加されました。

RubyKaigi 2018 でまつもとさんが突然発表して物議を醸したアレです。

yield_self は名前が悪いってことで別の名前が考えられてたみたいだけど、しかし then か…。 メソッド名が動詞じゃないってのは別にこだわるところじゃないのかな。

Kernel#Complex, Kernel#Float, Kernel#Integer, Kernel#Rational:exception オプション追加

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

exception: false を指定すると例外を発生させる代わりに nil が返ります。

Integer("hoge")                    #=> no implicit conversion of Hash into Integer (TypeError)
Integer("hoge", exception: false)  #=> nil

Kernel#system:exception オプション追加

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

exception: true を指定するとコマンドが失敗した時に例外を発生させます。

system("false")                   #=> nil
system("false", exception: true)  #=> Command failed with exit 1: false (RuntimeError)

Kernel#systemKernel#exec がファイルディスクリプタをクローズしない

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

:close_others オプションのデフォルトが false になったようです。

と言っても Ruby 内でオープンしたファイルは O_CLOEXEC つきでオープンされているため、exec 時には今まで通りクローズされます。 Ruby の外でオープンされたファイルディスクリプタが影響します。

2.5:

% ruby -e 'system("cat <&5")' 5< /etc/lsb-release 
sh: 1: 5: Bad file descriptor

2.6:

% ruby -e 'system("cat <&5")' 5< /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.10
DISTRIB_CODENAME=cosmic
DISTRIB_DESCRIPTION="Ubuntu 18.10"