当前位置:  开发笔记 > 编程语言 > 正文

方法名称中的下划线

如何解决《方法名称中的下划线》经验,为你挑选了1个好方法。

你好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/



1> Jesper..:

首先,这是正确的吗?

不,方法名称中的下划线与您描述的完全不同.它并不意味着"可能存在空格,空格后的字符也是方法名称的一部分".

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就不再工作了.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有