Ruby 2.7 の変更点 - $; と $, の設定が非推奨

Ruby 2.7 アドベントカレンダーの7日目の記事です。

qiita.com

$;, $, の設定が非推奨

$; は String#split で引数を省略した時(または nil を指定した時)に使用されるデフォルトのセパレータです。 $; のデフォルト値は nil で、「先頭と末尾の空白を取り除いてから空白文字で分割する」という動きになります。

" a\tb  c\t ".split  #=> ["a", "b", "c"]
$; = /\t/
" a\tb  c\t ".split  #=> [" a", "b  c", " "]

Ruby 2.7 ではこの変数に nil 以外を設定すると warning が出力されるようになりました。 split の引数で明に指定するようにしましょう。

" a\tb  c\t ".split        #=> ["a", "b", "c"]
$; = /\t/                  #=> warning: non-nil $; will be deprecated
" a\tb  c\t ".split        #=> [" a", "b  c", " "]
                           #=> warning: $; is set to non-nil value
" a\tb  c\t ".split(/\t/)  #=> [" a", "b  c", " "]

$, は逆に Array#join で文字列を結合する時に使用されるデフォルトの文字です。

[1, 2, 3].join   #=> "123"
$, = ','
[1, 2, 3].join   #=> "1,2,3"

これも Ruby 2.7 では nil 以外を設定すると warning が出力されます。引数で明に指定しましょう。

[1, 2, 3].join       #=> "123"
$, = ','             #=> warning: non-nil $, will be deprecated
[1, 2, 3].join       #=> "1,2,3"
                     #=> warning: $, is set to non-nil value
[1, 2, 3].join(',')  #=> "1,2,3"

非推奨になったのは、$;$, もグローバルスコープなので、どこかのメソッド内で設定されると、プログラム全体に影響を与えてしまうためだと思います。

Ruby 3 に向けて着々と負の遺産が整理されていって良いですね。

なお、$; はコマンドラインオプションの -F でも指定できるのですが、これも同様に warning になります。

% cat hoge.rb
p "a,b,c".split
% ruby -F, hoge.rb
hoge.rb:1: warning: $; is set to non-nil value
["a", "b", "c"]

ただし -e でコマンドラインでスクリプトを記述している場合は warning にはなりません。ワンライナーに便利ですしね。

% echo "a,b,c" | ruby -alnF, -e 'p $F'
["a", "b", "c"]