在 Scala 中传递惰性参数有什么帮助吗?
Is there any help for lazy argument passing in Scala?
这听起来像是菜鸟犯的错误,但我经常犯这样的错误。将惰性评估块或值传递给函数时,
如果我忘记以某种方式使该函数的相应参数惰性化(按名称 pass/call ),乍一看会引起一些混乱,因为
它迫使 evaluation.Very 小前男友;
lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);
输出:
a
Hello
所以我的问题是,对于这个问题是否有任何编译器帮助?(标志等)或者这是我应该处理的事情?
你可以把问题移到类型系统中。
- 不要明确使用
lazy val
,而是...
- 为惰性计算值定义一个框:
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
这听起来像是菜鸟犯的错误,但我经常犯这样的错误。将惰性评估块或值传递给函数时, 如果我忘记以某种方式使该函数的相应参数惰性化(按名称 pass/call ),乍一看会引起一些混乱,因为 它迫使 evaluation.Very 小前男友;
lazy val a = {println("a");1}
def myfunc(b:Int){println("hello")}
myfunc(a);
输出:
a
Hello
所以我的问题是,对于这个问题是否有任何编译器帮助?(标志等)或者这是我应该处理的事情?
你可以把问题移到类型系统中。
- 不要明确使用
lazy val
,而是... - 为惰性计算值定义一个框:
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