разница
Разница между assert () и предположить () заключается в том, что
- assert () - это способ документировать и динамически проверять инварианты, а
- предположим, что () предназначен для использования инструментами статического анализа
Предполагаемый потребитель / контекст assert () - это тестирование, такое как тест Scala JUnit, в то время как тест предположения () - это «как средство спецификации стиля по контракту предварительных и постусловий для функций». с намерением, чтобы эти спецификации могли быть использованы инструментом статического анализа "(выдержка из scaladoc ).
Статический анализ / проверка модели
В контексте статического анализа, как указал Адам Залкман, assert () является утверждением всех путей выполнения, чтобы проверить глобальный инвариант, тогда как accept () работает локально, чтобы сократить объем проверки того, что анализатор нужно сделать. accept () используется в контексте рассуждения о предположении-гарантии, который является механизмом «разделяй и властвуй», чтобы помочь контролерам моделей принять что-то в методе для решения проблемы взрыва состояний, возникающей при попытке проверить все пути, которые программа может занять. Например, если вы знали, что при разработке вашей программы функция f1 (n1: Int, n2: Int) НИКОГДА не передается n2
На практике
На практике, поскольку такие контроллеры моделей для всей программы все еще в основном теоретические, давайте посмотрим, что делает компилятор и интерпретатор scala:
- оба предположения () и выражения assert () проверяются во время выполнения
- -Xdisable-assertions отключает проверку как предположить (), так и проверки assert ()
Подробнее
Больше от превосходного скаладока на эту тему:
* 1034 утверждения *
Набор функций assert
предоставляется для использования в качестве способа документирования и динамической проверки инвариантов в коде. Операторы assert можно исключить во время выполнения, указав аргумент командной строки -Xdisable-assertions
для команды scala
.
Также предусмотрены варианты assert
, предназначенные для использования с инструментами статического анализа: assume
, require
и ensuring
. require
и обеспечение предназначены для использования в качестве средства определения стиля по контракту предварительных и постусловий функций с намерением использования этих спецификаций инструментом статического анализа. Например,
def addNaturals(nats: List[Int]): Int = {
require(nats forall (_ >= 0), "List contains negative numbers")
nats.foldLeft(0)(_ + _)
} ensuring(_ >= 0)
Объявление addNaturals гласит, что список переданных целых чисел должен содержать только натуральные числа (то есть неотрицательные), и что возвращаемый результат также будет натуральным. Требование отличается от утверждения в том, что если условие не выполняется, то виноват вызывающий функции, а не логическая ошибка, сделанная в самой addNaturals. обеспечивает это форма утверждения, которая объявляет гарантию, которую функция предоставляет относительно ее возвращаемого значения.
)