Есть ли какая-нибудь помощь для передачи ленивых аргументов в Scala?

Это может звучать как ошибка новичка, но я делаю много этого. При передаче ленивого вычисляемого блока или значения в функцию, если я забуду, как-нибудь сделать соответствующий параметр этой функции ленивым (передача / вызов по имени), что на первый взгляд вызывает некоторые недоразумения, потому что это вызывает оценку. Очень маленький ex;

lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);

Выход:

a
Hello

Итак, мой вопрос, есть ли какая-либо помощь компилятора для этой проблемы?(Флаг и т. Д.) Или я должен позаботиться об этом?

1 ответ

Вы можете переместить проблему в систему типов.

  1. Не использовать lazy valявно вместо...
  2. Определите поле для лениво оцененных значений:

class Lazy[A](body: => A) {
  lazy val value = body
}

object Lazy {
  def apply[A](body: => A) = new Lazy[A](body)
}

Теперь у вас будет небольшая помощь от компилятора:

val a = Lazy {
  println("a")
  1
}

def myfunc(b: Lazy[Int]) = {
  println("hello")
}

myfunc(a) // ok, and it doesn't print "a" since it never uses it
// myfunc(42) // won't compile

def myfunc2(b: Int) = b + 42

// myfunc2(a) // does not compile
myfunc2(a.value) // ok, explicitly evaluate - or consider refactoring myfunc2
Другие вопросы по тегам