你好Scalaists,
我最近又看了一下Scala中的setter,发现方法名称中的_似乎转换为"可能有一个空格或者没有空间,并且还将下一个特殊字符视为方法名称的一部分".
首先,这是正确的吗?
其次,有人可以解释为什么倒数第二行不起作用?
class Person() { private var _name: String = "Hans" def name = _name def name_=(aName: String) = _name = aName.toUpperCase } val myP = new Person() myP.name = "test" myP.name= "test" myP.name_= "test" //Bad doesnt work myP.name_=("test")//Now It works
最后,删除getter打破了上面的例子
class Person() { private var _name: String = "Hans" def name_=(aName: String) = _name = aName.toUpperCase } val myP = new Person() myP.name = "test" //Doesnt work anymore myP.name= "test" //Doesnt work anymore myP.name_= "test" //Still doesnt work myP.name_=("test")//Still works
编辑:这是我最初阅读的来源的引用(看似错误),并产生了这个问题:
这条线有点棘手,但我会解释.首先,方法名称是"age_ =".下划线是Scala中的一个特殊字符,在这种情况下,允许方法名称中的空格实际上使名称为"age ="
http://dustinmartin.net/getters-and-setters-in-scala/
首先,这是正确的吗?
不,方法名称中的下划线与您描述的完全不同.它并不意味着"可能存在空格,空格后的字符也是方法名称的一部分".
Scala语言规范的4.2节解释了一个名称以_=
平均值结尾的方法.
变量声明
var x: T
等同于getter函数x
和setter函数的声明x_=
:def x: T def x_= (y: T): Unit类的实现可以使用变量定义或通过定义相应的setter和getter方法来定义声明的变量.
请注意,如果您只定义了setter方法而不是getter方法,那么setter方法的魔力就会消失 - 它被视为另一个名称恰好以此结尾的方法_=
,但在这种情况下没有特殊含义.
只有当有一个getter和setter时,该方法_=
才能充当setter并且可以这样使用 - 这就是为什么myP.name = "test"
如果你删除了getter就不再工作了.