scala - 使用 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)
解决方案
每当我尝试运行这个简单的代码时,它都会说 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)
推荐阅读
- c# - 在 SpecFlow 中的多个功能文件之间共享步骤声明
- r - 具有分类变量的多变量回归交互项
- javascript - 如何在 Promise.finally() 中测试 Promise 的状态而不在生产代码中等待它
- excel - 粘贴后删除表格图像
- java - 通过JDBC查询小写表名
- delphi - 如何声明一个恒定的 Tpoint?
- docker - Jenkins 的 Docker 云插件
- json - 如何删除Wiremock中每个循环中的最后一个逗号
- javascript - 如何定义适用于猫鼬和 graphql 的模式
- azure-devops - 当某些测试失败时,Visual Studio 测试任务部分成功而不是失败