Ruby 2.6 の変更点 - Numeric, BigDecimal

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

qiita.com

Numeric

Numeric#stepEnumerator::ArithmeticSequence オブジェクトを返す

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

Range#step と同様です。

単純な Enumerator ではなく step に指定した引数情報を取得できる Enumerator::ArithmeticSequence オブジェクトを返すようになりました。

a = 1.step(10, 2)  #=> #<Enumerator::ArithmeticSequence>
a.begin            #=> 1
a.end              #=> 10
a.first(2)         #=> [1, 3]  # これは 2.5 から可能
a.last(2)          #=> [7, 9]
a.step             #=> 2

BigDecimal

BigDecimal.allocate 削除

数値クラスなのでNumericと同じようにimmutableオブジェクト化するためだと思います。

BigDecimal オブジェクトが frozen

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

これも同上です。

BigDecmial.new が非推奨

これも同じく。使用すると -w をつけてなくてもwarningが出ます。

require 'bigdecimal'

BigDecimal.new(123)  #=> 0.123e3
# warning: BigDecimal.new is deprecated; use BigDecimal() method instead.

BigDecimal(123)      #=> 0.123e3
# これは警告無し

BigDecimal():exception オプション追加

:exceptionfalse を指定すると例外を発生させずに nil を返します。

require 'bigdecimal'

BigDecimal(123.4)
#=> can't omit precision for a Float. (ArgumentError)

BigDecimal(123.4, exception: false)  #=> nil

nil.to_d が 0.0 を返す

2.5 では NoMethodError になってました。

BigDecimal() が不正な文字列でエラー

2.5 では不正な文字までの部分までの結果を返してました。

require 'bigdecimal'

BigDecimal("1.2.3")
#=> invalid value for BigDecimal(): "1.2.3" (ArgumentError)
# 2.5 では 0.12e1 を返してた

BigDecimal.ver 削除

2.5 で非推奨になりました。代わりに BigDecimal::VERSION を使えということのようです。