scala - Constructor parameter names and class member names -


i understand how scala deals constructor parameters, i.e. generating getter val , getter/setter var. have found quite few discussions name clashes between constructor parameters , class members.

for names w/o val & var, expect if they're prefixed this., class members instead should used. that's not case.

class a(val a: int) {   def m = println("a.a: " + a) }  class b(a: int) extends a(2 * a) {   override def m = {     super.m     println("@a: " + a)     println("this.a: " + this.a)  // @a, not a.a   } }  object testapp extends app {     val b = new b(10)     b.m     println(b.a); // a.a } 

output:

a.a: 20 @a: 10 this.a: 10 20 

i feel it's weird there design reason behind it?

as wrote in question scala generates getter val, when declare val parameter in a class, has method m , field a, inherited b class. have a parameter in b class, doubled , passed argument super constructor of a. understand what's going on, turn on option -xprint:typer repo , paste code, e.g a represented this:

class extends scala.anyref {   <paramaccessor> private[this] val a: int = _;   <stable> <accessor> <paramaccessor> def a: int = a.this.a;   def <init>(a: int): = {     a.super.<init>();     ()   };   def m: unit = scala.this.predef.println("a.a: ".+(a.this.a)) } 

as can see scala created hidden private[this] field a parameter. , here representation b class:

class b extends {   <paramaccessor> private[this] val a: int = _;   def <init>(a: int): b = {     b.super.<init>(2.*(a));     ()   };   override def m: unit = {     b.super.m;     println("@a: ".+(b.this.a));     println("this.a: ".+(this.a))   } } 

as can see scala defined private[this] field a parameter in b class. because didn't mark val value, didn't generate new a getter, still defined a.this.a, not b.this.a, that's why r getting 20 when calling b.a.

as answer, don't think there complex design behind this, looks logical , quite reasonable. if rename a param in b class constructor , pass a, nothing change.


Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -