Защо BigDecimal на Scala няма НУЛА?

Достатъчно лесно е да създадете:

object zero extends BigDecimal(java.math.BigDecimal.ZERO)

Просто се чудя дали това е пропуск или е имало съзнателно решение това да не се добавя и ако е така, има ли причини да избягвам кода по-горе. Може би има общо с MathContext?


person pr1001    schedule 24.02.2012    source източник


Отговори (3)


Мисля, че е така, защото обикновено не ти трябва. Докато в Java трябва да въведете нещо подобно

BigDecimal b = new BigDecimal(1.23).add(BigDecimal.ZERO);

в Scala има преобразуване на числа, което означава, че можете да пишете

val b = BigDecimal(1.23) + 0

Можете също да го напишете просто като BigDecimal(0). Ако инстанцирате толкова много, може да искате да го кеширате като наименувана стойност (както за всяко друго число), но обикновено няма да е необходимо и мисля, че помага за опростяване на API, ако премахнете специални случаи, които трябва да запомните.

person Luigi Plinge    schedule 24.02.2012

Ако трябваше да гадая, това е, защото очакваният начин да се получи тази стойност би бил следният:

val zero: BigDecimal = 0
person Ian McLaird    schedule 24.02.2012
comment
Добра точка. Благодаря за отговора, но приемам отговора на Луиджи, защото смятам, че е по-подробен и по-полезен за бъдещи посетители. - person pr1001; 28.02.2012

Възкресяване на стара тема за пълнота. Scala всъщност има нещо подобно на java BigDecimal.ZERO, можете да получите достъп до него с BigDecimalIsFractional.zero.

Както вече беше посочено в предишните отговори, през повечето време литералът 0 ще бъде наред. Като каза това, границите на контекста могат да бъдат полезни с общ код:

def zero[T: Numeric](): Unit = {
  val evidence = implicitly[Numeric[T]]
  val zero = evidence.zero
  println(s"${zero} is a ${zero.getClass.getSimpleName} defined at ${evidence.getClass.getName}")
}

zero[BigDecimal]() // 0 is a BigDecimal defined in scala.math.Numeric$BigDecimalIsFractional$
zero[Double]() // 0.0 is a Double defined in scala.math.Numeric$DoubleIsFractional$
zero[Int]() // 0 is a Integer defined at scala.math.Numeric$IntIsIntegral$
person Anthony Accioly    schedule 26.03.2018