By-Name-Constructors的参数

hot*_*zen 2 constructor scala pass-by-name

来自我的另一个问题 是有一种方法来获取构造函数的名字参数吗?我需要一种方法来提供一个代码块,它在对象内部按需/延迟/按名称执行,这个代码块必须能够访问类方法,就像代码块是类的一部分一样.

以下Testcase失败:

package test

class ByNameCons(code: => Unit) {

    def exec() = {
        println("pre-code")
        code
        println("post-code")
    }

    def meth() = println("method")

    def exec2(code2: => Unit) = {
        println("pre-code")
        code2
        println("post-code")
    }
}


object ByNameCons {

    def main(args: Array[String]): Unit = {
        val tst = new ByNameCons {
            println("foo")
            meth() // knows meth() as code is part of ByNameCons
        }
        tst.exec() // ByName fails (executed right as constructor)


        println("--------")


        tst.exec2 { // ByName works
            println("foo")
            //meth() // does not know meth() as code is NOT part of ByNameCons
        }       
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

foo
method
pre-code
post-code
--------
pre-code
foo
post-code
Run Code Online (Sandbox Code Playgroud)

gwo*_*pq9 5

这是因为当你创建这样的实例时:

val tst = new ByNameCons {
  ...
}
Run Code Online (Sandbox Code Playgroud)

..你实际上正在创建一个匿名类,就像在java中一样.以上代码与:

val tst = new ByNameCons() { ... }
Run Code Online (Sandbox Code Playgroud)

..而传递by-name的正确语法是:

val tst = new ByNameCons( { ... } )
Run Code Online (Sandbox Code Playgroud)

对于构造函数和函数,您不能以相同的方式省略括号.