你好Scalaists,
我最近又看了一下Scala中的setter,发现方法名称中的_似乎转换为"可能还有空格哦,哦也可以将下一个特殊字符视为方法名称的一部分& #34;
其次,有人可以解释为什么倒数第二行不起作用吗?
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
编辑: 以下是我最初阅读的来源(看似虚假),引发了这个问题:
这条线路有点棘手,但我会解释一下。一,方法 name是" age _ ="。下划线是Scala中的特殊字符 在这种情况下,基本上允许方法名称中的空格 将名称命名为" age ="
答案 0 :(得分:10)
首先,这是正确的吗?
不,方法名称中的下划线与您描述的完全不同。它并不意味着"可能有空格,空格后的字符也是方法名称的一部分"。
Scala语言规范的 Section 4.2解释了名称以_=
结尾的方法。
变量声明
var x: T
等同于getter函数x
和setter函数x_=
的声明:def x: T def x_= (y: T): Unit
类的实现可以使用变量定义或通过定义相应的setter和getter方法来定义声明的变量。
请注意,如果您只定义了setter方法而不是getter方法,那么setter方法的魔力就会消失 - 它只被视为另一个名称恰好以{{1}结尾的方法},但在这种情况下,这没有特别的意义。
只有当有一个getter和setter时,带有_=
的方法才能充当setter并且可以这样使用 - 这就是为什么_=
不能再工作的原因了你删除了吸气剂。