By-Name-Parameters for Constructors

Posted by hotzen on Stack Overflow See other posts from Stack Overflow or by hotzen
Published on 2010-04-15T16:28:12Z Indexed on 2010/04/15 16:33 UTC
Read the original article Hit count: 360

Filed under:
|
|

Hello,

coming from my other question is there a way to get by-name-parameters for constructors working? I need a way to provide a code-block which is executed on-demand/lazy/by-name inside an object and this code-block must be able to access the class-methods as if the code-block were part of the class.

Following Testcase fails:

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
        }       
    }
}

Output:

foo
method
pre-code
post-code
--------
pre-code
foo
post-code

© Stack Overflow or respective owner

Related posts about scala

Related posts about pass-by-name