方法名称中的下划线

时间:2015-12-26 11:38:22

标签: scala

你好Scalaists,

我最近又看了一下Scala中的setter,发现方法名称中的_似乎转换为"可能还有空格哦,哦也可以将下一个特殊字符视为方法名称的一部分& #34;

  1. 首先,这是正确的吗?
  2. 其次,有人可以解释为什么倒数第二行不起作用吗?

    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
    
  3. 最后,删除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
    
  4. 编辑: 以下是我最初阅读的来源(看似虚假),引发了这个问题:

      

    这条线路有点棘手,但我会解释一下。一,方法   name是" age _ ="。下划线是Scala中的特殊字符   在这种情况下,基本上允许方法名称中的空格   将名称命名为" age ="

    http://dustinmartin.net/getters-and-setters-in-scala/

1 个答案:

答案 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并且可以这样使用 - 这就是为什么_=不能再工作的原因了你删除了吸气剂。