在 Scala 中传递惰性参数有什么帮助吗?

alt*_*han 3 scala lazy-evaluation scalac

这听起来像是一个新手错误,但我做了很多。在将惰性求值块或值传递给函数时,如果我忘记以某种方式使该函数的相应参数变为惰性(按名称传递/调用),乍一看会引起一些混乱,因为它强制求值。

lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);
Run Code Online (Sandbox Code Playgroud)

输出:

a
Hello
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这个问题是否有任何编译器帮助?(标志等)或者这是我应该处理的事情?

Ole*_*cov 5

您可以将问题移到类型系统中。

  1. 不要lazy val显式使用s,而是...
  2. 为延迟计算的值定义一个框:

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

object Lazy {
  def apply[A](body: => A) = new Lazy[A](body)
}
Run Code Online (Sandbox Code Playgroud)

现在,您将获得编译器的一些帮助:

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
Run Code Online (Sandbox Code Playgroud)