Scala 类变量名隐藏方法参数名

虾米哥 阅读:13 2024-11-24 20:56:43 评论:0

我想知道为什么我不能对函数参数和类中使用的名称使用相同的名称。请引用以下例子。

scala> class Person() {var name = "bob" } 
defined class Person 
 
scala> val p = new Person 
p: Person = Person@486f8860 
 
scala> p.name 
res0: java.lang.String = bob 
 
scala> p.name = "alice" 
 
scala> p.name 
res1: java.lang.String = alice 
 
scala> def chngName(name:String) = new Person() {this.name= name} 
chngName: (name: String)Person 
 
scala> val p = chngName("aa") 
p: Person = $anon$1@3fa1732d 
 
scala> p.name 
res2: java.lang.String = bob 
 
scala> def chngName(n:String) = new Person() {name= n} 
chngName: (n: String)Person 
 
scala> val p = chngName("aa") 
p: Person = $anon$1@19d2052b 
 
scala> p.name 
res3: java.lang.String = aa 

当然,我可以使用不同的名称,但我想知道为什么我不能,或者我想念这里的某些东西。谢谢

请您参考如下方法:

(为什么要在 chngName 中返回一个新对象时使用 var?)

如前所述,类的同名字段隐藏了方法参数。

你当然可以在进入类的范围之前重命名它:

def chngName(name:String) = { 
  val _name = name 
  new Person() { name = _name } 
} 

但是,对于此用例,还有一些其他选项。但是,这取决于您是否要复制对象,即。返回一个 new Person,或者如果对 var 进行简单的更改就足够了。

如果你想返回一个全新的对象,你可以考虑使用一个case class,它添加了一个具有相同语义和相同命名方法参数的copy方法。 (所以你可以使用命名参数):

case class Person(name: String) 
val p = Person("bob") 
p.name // bob 
val q= p.copy(name = "aa") 
q.name // aa 
q == p // false 


标签:Scala
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号