首页 > 解决方案 > 使用 def name_= 的 Scala 方法表示法不起作用?

问题描述

每当我尝试运行这个简单的代码时,它都会说 balance 不是 Playground.cat 的成员

我在一本书中读到了这个符号,所以我很困惑为什么它不起作用?

class cat(var _balance:Int) {
    def balance_=(nb:Int) = _balance = nb
}
val c = new cat(5)
c.balance +=25
print(c._balance)

标签: scalaoopmethods

解决方案


每当我尝试运行这个简单的代码时,它都会说 balance 不是 Playground.cat 的成员

我在一本书中读到了这个符号,所以我很困惑为什么它不起作用?

错误消息非常清楚地说明了它:它找不到成员balance,换句话说,您缺少吸气剂。

它在Scala语言规范的第 6.15 节[加粗强调我的]中也非常明确地说明:

6.15 作业

Expr1        ::=  [SimpleExpr ‘.’] id ‘=’ Expr
              |  SimpleExpr1 ArgumentExprs ‘=’ Expr

对简单变量赋值的解释 = 取决于 的定义。如果表示一个可变变量,则赋值将 的当前值更改为计算表达式的结果。的类型应符合 的类型如果是在某个模板中定义的无参数方法,并且同一个模板包含一个 setter 方法_=作为 member,则分配 = 被解释为_=()对该 setter 方法的调用。. = 类似地,对无参数方法的赋值被解释为调用._=()

要修复它,您需要在同一个模板中添加一个同名的 getter(这是 SLS 用于类、特征或对象的名称):

class Cat(var _balance: Int) {
    def balance            = _balance
    def balance_=(nb: Int) = _balance = nb
}

val c = new Cat(5)

c.balance += 25

print(c._balance)

推荐阅读