我有一个关于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"
上出错了?是因为_=
in 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 (只写)方法?
发布于 2015-01-02 17:35:55
这是因为无点scala语法只允许您在删除点时删除括号:
1 + 2 // 3
1.+(2) // 3
1.+ 2
// <console>:1: error: ';' expected but integer literal found.
// 1.+ 2
// ^
基本上,它认为您试图调用一个no-arg方法echo
,然后在它后面有一个随机字符串文本。
https://stackoverflow.com/questions/27745787
复制相似问题