Ruby 2.7 アドベントカレンダーの7日目の記事です。
$;
, $,
の設定が非推奨
$;
は 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"]