在Scala中传递延迟参数有什么帮助吗?

时间:2017-12-29 11:12:54

标签: scala lazy-evaluation scalac

听起来像是一个新手的错误,但我做了很多。在将惰性求值块或值传递给函数时, 如果我忘记以某种方式使该功能的相应参数懒惰(通过名称传递/调用),乍一看会引起一些混淆,因为 它迫使评估。非常小的前

<delete includeEmptyDirs="true">
  <fileset dir="${dir.to.delete}"> 
    <include name = "**" />
    <exclude name = "**/.svn" /> <!-- in case you want to skip .svn folders to avoid SVN conflicts -->
  </fileset>
</delete>

输出:

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 请勿明确使用lazy val,而是......
  2. 为延迟评估的值定义一个框:
  3. 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