blob: 3684bf9690df6d6f23fc11b91992b81b2d651585 (
plain) (
tree)
|
|
object Test extends Function0[Int] {
// this and v resolve to Test.this, Test.v not A.this, A.v
class A(x: Function0[Int] = this)(val a: Int = v, val b: Int = v * x()) extends Function0[Int] {
val v = 3
override def toString = x.toString +", "+ a +", "+ b
// ordinary instance scope
def m(i: Int = v, y: Function0[Int] = this) = "m, "+ i +", "+ y()
def apply() = 19
}
object A {
val v = 5
// should happily coexist with default getters, in a happier world
def init(x: Function0[Int] = Test.this)(a: Int = v, b: Int = v * x()) = x.toString +", "+ a +", "+ b
override def toString = "A"
}
val v = 7
def apply() = 17
override def toString = "Test"
def main(args: Array[String]) {
val sut = new A()()
println(sut.toString)
println(sut.m())
println(A.init()())
println((new T.C()).x)
println((new T.D(0,0)).x)
}
}
object T {
override def toString = "T"
// `this` refers to T
class C(val x: Any = {println(this); this}) { // prints T
println(this) // prints C
override def toString() = "C"
}
class D(val x: Any) {
override def toString() = "D"
// `this` refers again to T
def this(a: Int, b: Int, c: Any = {println(this); this}) { this(c); println(this) } // prints T, then prints D
}
}
|