Цикл while уже реализован с параметрами передачи по имени? : Scala - PullRequest
1 голос
/ 24 мая 2019

Документы Scala Tour Of Scala объясняют параметры передачи по имени, используя в качестве примера функцию whileLoop.

def whileLoop(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    whileLoop(condition)(body)
  }

var i = 2

whileLoop (i > 0) {
  println(i)
  i -= 1
}  // prints 2 1

В этом разделе объясняется, что если условие не выполняется, то тело не оценивается, что повышает производительность, не оценивая тело кода, который не используется.

Использует ли реализация Scala while уже параметры передачи по имени?

Если есть причина или особые случаи, когда реализация не может использовать параметры передачи по имени, пожалуйста, объясните мне, я пока не смог найти какую-либо информацию об этом.

РЕДАКТИРОВАТЬ: Согласно ответу Valy Dia (https://stackoverflow.com/users/5826349/valy-dia), я хотел бы добавить еще один вопрос ...

Будет ли реализация метода оператора while работать лучше, чем сам оператор, если в некоторых случаях можно вообще не оценивать тело? Если это так, зачем вообще использовать оператор while?

Я попытаюсь проверить это, но я новичок в Scala, так что это может занять некоторое время. Если бы кто-то хотел объяснить, это было бы здорово.

Ура!

Ответы [ 2 ]

4 голосов
/ 24 мая 2019

Будет ли реализация метода оператора while работать лучше, чем сам оператор, если в некоторых случаях можно вообще не оценивать тело?

Нет.Встроенный while также вообще не оценивает тело, если в этом нет необходимости, и собирается компилировать в гораздо более эффективный код (потому что ему не нужно вводить функции thunks / closures / lambdas / anonymousкоторые используются для реализации «передачи по имени» под капотом).

Пример в книге просто показал, как можно реализовать его с помощью функций, если не было встроенного оператора while.

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

Нет, это сделало бы встроенным while абсолютно бесполезно.Это не то, к чему они клонили.Они хотели сказать, что вы можете делать такие вещи с «вызовом по имени» (в отличие от «вызова по значению», а не в отличие от того, что делает цикл while - потому что последний также работает так).

Основной вывод заключается в том, что в Scala можно создать нечто похожее на управляющую структуру, поскольку у вас есть синтаксический сахар, такой как «call-by-name» и «последняя группа аргументов, принимающая функцию».с блоком ".

4 голосов
/ 24 мая 2019

Оператор while не является method, поэтому параметр терминологии by-name не имеет значения ... Сказав так, оператор while имеет следующую структуру:

while(condition){
  body
}

, где condition многократно оценивается, а тело оценивается только после проверки condition, как показывают эти небольшие примеры:

scala> while(false){ throw new Exception("Boom") }
// Does nothing

scala> while(true){ throw new Exception("Boom") }
// java.lang.Exception: Boom

scala> while(throw new Exception("boom")){ println("hello") }
// java.lang.Exception: Boom
...