Сравнительные сопоставления не работают на смешанных числовых типах - PullRequest
2 голосов
/ 14 июня 2019

В ванильной версии Scala следующие утверждения проходят

assert(1D > 0F)
assert(1F > 0)
assert(1L > 0)
assert(1 > 0.toShort)
assert(1.toShort > 0.toChar)

, однако аналогичные сопоставления в ScalaTest не выполняются

1D shouldBe > (0F)
1F shouldBe > (0)
1L shouldBe > (0)
1 shouldBe > (0.toShort)
1.toShort shouldBe > (0.toChar)

Обходной путь заключается в том, чтобы обе стороны одного типаНапример,

1D shouldBe > (0D)

Почему это работает в Scala, но не в Scalatest, или что такое подпись >

def >[T : Ordering] (right: T): ResultOfGreaterThanComparison[T]

что делает его неудачным?

1 Ответ

2 голосов
/ 14 июня 2019

Vanilla Scala работает благодаря автоматическому преобразованию типов, т. Е. 0F приводится к 0D, что является распространенной практикой во многих языках.

Более интересный вопрос, почему shouldBe не работает. Осушение последствий дает

new AnyShouldWrapper[Double](leftSideValue = 1D,
                             pos = ???,
                             prettifier = ???)
  .shouldBe(new ResultOfGreaterThanComparison[Double](right = 0D))

new AnyShouldWrapper[Double](leftSideValue = 1D,
                             pos = ???,
                             prettifier = ???)
  .shouldBe(new ResultOfGreaterThanComparison[Float](right = 0F))

, что приводит к перегруженным реализациям shouldBe. В первом случае здесь , а во втором здесь .

После просмотра исходного кода кажется, что единственная причина, по которой 1D shouldBe > (0F) фактически компилируется, - это поддержка сравнения массивов с ключевым словом shouldBe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...