class RuboCop::Cop::Performance::BigDecimalWithNumericArgument
4.to_d(6)
BigDecimal(1, 2)
# good
BigDecimal(‘4’, 6)
BigDecimal(‘1’, 2)
# bad
BigDecimal(‘4.5’, 6, exception: true)
BigDecimal(‘1.2’, 3, exception: true)
# good
4.5.to_d(6, exception: true)
BigDecimal(1.2, 3, exception: true)
# bad
@example
an integer. Initializing from Integer is faster than from String for BigDecimal.
Also identifies places where an integer string argument to BigDecimal should be converted to
Initializing from String is faster than from Float for BigDecimal.
Identifies places where a float argument to BigDecimal should be converted to a string.
def on_send(node)
def on_send(node) if (numeric = big_decimal_with_numeric_argument(node)) if numeric.numeric_type? add_offense(numeric, message: MSG_FROM_FLOAT_TO_STRING) do |corrector| corrector.wrap(numeric, "'", "'") end elsif numeric.value.match?(/\A\d+\z/) add_offense(numeric, message: MSG_FROM_INTEGER_TO_STRING) do |corrector| corrector.replace(numeric, numeric.value) end end elsif (numeric_to_d = to_d(node)) if numeric_to_d.numeric_type? add_offense(numeric_to_d, message: MSG_FROM_FLOAT_TO_STRING) do |corrector| big_decimal_args = node.arguments.map(&:source).unshift("'#{numeric_to_d.source}'").join(', ') corrector.replace(node, "BigDecimal(#{big_decimal_args})") end elsif numeric_to_d.value.match?(/\A\d+\z/) add_offense(numeric_to_d, message: MSG_FROM_INTEGER_TO_STRING) do |corrector| corrector.replace(node, "#{numeric_to_d.value}.to_d") end end end end