scala - Using v. Not Using the `self` Type -
given following traits:
scala> trait foo { self => | def f: string = self.getclass.getname | } defined trait foo scala> trait bar { | def f: string = this.getclass.getname | } defined trait bar
and making classes extend them:
scala> class fooimpl extends foo {} defined class fooimpl scala> class barimpl extends bar {} defined class barimpl
and calling f
methods on new instances:
scala> (new fooimpl).f res1: string = fooimpl scala> (new barimpl).f res4: string = barimpl
the repl shows print out same values - class's name.
perhaps isn't example. what's difference of using self
in above foo
compared bar
, uses this
?
in case there's no difference—you're using name this
. self types useful when need disambiguate between different this
s. example:
abstract class foo { self => def bar: int def qux = new foo { def bar = self.bar } }
if wrote def bar = this.bar
here, compiler complain our definition of bar
calling recursively, since this
referring anonymous subclass of foo
we're defining in qux
, not outside foo
.
Comments
Post a Comment