【问题标题】:Underscore usage in Scala's identifierScala 标识符中的下划线用法
【发布时间】:2015-03-01 00:40:41
【问题描述】:

我有一个带有 getter/setter 的课程:

class Person {
    private var _age = 0

    //getter
    def age = _age

    //setter
    def age_=(value: Int): Unit = _age = value
}

我们知道我们可以像这样调用setter方法:

val p = new Person()
p.age= (2)
p age= 11
p.age= 8-4

在这种情况下有趣的是:def age_= 中的下划线 (_) 可以在调用该方法时删除。

我的问题是,在这种情况下,下划线是做什么用的?

有人告诉我它用于分隔标识符中的非字母字符。所以我尝试了这个:

var x_= = 20
x_= = 10
x= = 5    // I got error here

为什么在这种情况下我不能删除下划线?

另外,如果我多次尝试使用下划线:

val x_=_x = 1

我也遇到了编译错误。

是否有关于下划线用法的规则以及这种下划线用法的术语是什么?

【问题讨论】:

标签: scala getter-setter magic-methods syntactic-sugar


【解决方案1】:

编译错误说明了一切,真的:

scala> var x_= = 20
<console>:10: error: Names of vals or vars may not end in `_='

仅允许名称以_= 结尾的方法。这是有道理的,因为允许将 val 命名为 x_=

真的令人困惑

但是,下划线确实用于将字母数字字符与特殊字符分开。只是在val或var的情况下,不能用=结束

scala> var x_# = 20
x_#: Int = 20
scala> x_# = 10
x_$hash: Int = 10

我认为在特殊字符之前的第一个下划线之后不允许有另一个下划线。

val x_y_^ = 1    // Ok
val x_^_^ = 1    // Not ok

基于Scala language spec

首先,标识符可以以字母开头,后跟任意字母和数字序列。后面可以是下划线“”字符和另一个由字母和数字或运算符字符组成的字符串。

有关有效标识符的示例,另请参见链接规范中的示例 1.1.1。

【讨论】:

  • 非常感谢。但是p.age= 8-4的解释是什么?不需要下划线。
  • 确切地说,并不是您要删除下划线。编译器只专门处理以_= 结尾的方法。即p.age = 8-4 的处理方式类似于p.age_=(8-4)。注意你也可以在那里放置一个空间。
  • 所以我们可以说在这种情况下删除下划线是语言语法的一部分?
  • 我明白了。我希望在 scala 中不会使用太多神奇的模式。
猜你喜欢
  • 2014-08-12
  • 2013-06-15
  • 2021-11-04
  • 2022-12-14
  • 1970-01-01
  • 2021-07-04
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多