Scala 中方法调用的间距不一致

Spacing inconsistency on method invocation in Scala

我有一个 class 和 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方法的"magic"依赖于getter方法。如果没有定义 getter 方法,魔法就消失了。

但这意味着我无法创建 setter(只写)方法 ??

这是因为 point-free scala 语法只允许你在去掉圆点的情况下去掉括号:

1 + 2   // 3
1.+(2)  // 3

1.+ 2
// <console>:1: error: ';' expected but integer literal found.
//   1.+ 2
//       ^

基本上它认为您正在尝试调用无参数方法echo,然后您后面有一个随机字符串文字。