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