我有一个带getter / setter的课程:
class Person {
private var _age = 0
//getter
def age = _age
//setter
def age_=(value: Int): Unit = _age = value
def echo(x: String): Unit = println(x)
}
我做了一些测试:
val p = new Person()
//invoke age setter method
p.age =(2)
p age = 11
p.age = 8-4
// invoke echo method
p.echo("Hello")
p echo "Scala"
p.echo "Johnson" //compile error here
所以我收到编译错误:
p.echo "Johnson"
错误消息:
Error:(84, 16) ';' expected but string literal found.
p.echo "Johnson" //compile error here (why scala?)
^
为什么p.age = 8-4
工作正常但我在p.echo "Johnson"
上收到错误?这是因为_=
中的def age_=
吗?
更新
我做了一个实验:
class Person {
...
def echo = "Ginger"
def echo_=(x: String): Unit = println(x)
}
然后更改了调用的echo
方法:
p.echo= ("Hello")
p echo= "Scala"
p.echo= "Johnson"
他们工作正常。但如果我删除def echo = "Ginger"
,我将收到编译错误。
基于这种观察,我得出了结论:"魔法" setter方法取决于getter方法。如果没有定义getter方法,魔法就会消失。
但这意味着我无法创建一个setter(只写)方法??
答案 0 :(得分:3)
这是因为如果您也删除了点,则无点scala语法只允许您删除括号:
1 + 2 // 3
1.+(2) // 3
1.+ 2
// <console>:1: error: ';' expected but integer literal found.
// 1.+ 2
// ^
基本上它认为你试图调用一个无法方法echo
,然后你就会有一个随机的字符串文字。