这个例子来自Scala的一本书:
trait IO { self =>
def run: Unit
def ++(io: IO): IO = new IO {
def run = { self.run; io.run }
}
}
object IO {
def empty: IO = new IO { def run = () }
}
书中给出的解释如下:
self参数允许我们将此对象称为self而不是this。
那句话意味着什么?
答案 0 :(得分:7)
self
只是声明它的对象中this
的别名,它可以是任何有效的标识符(但不是this
,否则不会产生别名)。因此,self
可用于从内部对象中引用外部对象中的this
,其中this
将表示不同的内容。也许这个例子可以解决问题:
trait Outer { self =>
val a = 1
def thisA = this.a // this refers to an instance of Outer
def selfA = self.a // self is just an alias for this (instance of Outer)
object Inner {
val a = 2
def thisA = this.a // this refers to an instance of Inner (this object)
def selfA = self.a // self is still an alias for this (instance of Outer)
}
}
object Outer extends Outer
Outer.a // 1
Outer.thisA // 1
Outer.selfA // 1
Outer.Inner.a // 2
Outer.Inner.thisA // 2
Outer.Inner.selfA // 1 *** From `Outer`