Почему ScalaTest по умолчанию не выравнивает типы при сопоставлении? - PullRequest
1 голос
/ 05 июля 2019

Мне было интересно, почему ScalaTest ведет себя иначе, чем Specs2.

Specs2

"" must be equalTo 3
TestSpec.scala:11:26: type mismatch;
[error]  found   : Int(3)
[error]  required: String
[error]       "" must be equalTo 3

ScalaTest

3 should === ("r")
[info] Done compiling.
[info] TestTest:
[info] Dummy test
[info] - should fail *** FAILED ***
[info]   "" did not equal 3 (PersistentTaskRuntimeTest.scala:21)

ScalaTest по умолчанию завершается с ошибкой только во время выполнения, все сравнивается как Any-to-Any.

Существует плагин Supersafe для получения более качественных проверок (или TypeCheckedTripleEquals), но они выглядят как хаки, поскольку Specs2 просто использует компилятор scala, чтобы требовать, чтобы типы двух значений сравнивались в отношениях подтип / супертип.

Для справки это вывод при использовании TypeCheckedTripleEquals, помните хаки CanEqual

TestTest.scala:21:7: types String and Int do not adhere to the type constraint selected for the === and !== operators; the missing implicit parameter is of type org.scalactic.CanEqual[String,Int]
[error]     "" should === (3)
[error]       ^

Так в чем же причина этого?

  • Менее тяжелый для компилятора scala?
  • Меньше кода для написания для ScalaTest?
  • Менее скрытая магия (загадочные сообщения об ошибках)?
  • Выдвинуть плагин коммерческого компилятора?

1 Ответ

0 голосов
/ 05 июля 2019

TypeCheckedTripleEquals использует ограничения обобщенного типа , например, B <:< A в

implicit override def typeCheckedConstraint[A, B](implicit equivalenceOfA: Equivalence[A], ev: B <:< A): A CanEqual B

Это стандартная функция Scala для принудительного выполнения времени компиляциибезопасность и используется во многих распространенных библиотеках Scala.

...