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

时间:2015-01-02 17:08:42

标签: scala functional-programming

我有一个带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(只写)方法??

1 个答案:

答案 0 :(得分:3)

这是因为如果您也删除了点,则无点scala语法只允许您删除括号:

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

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

基本上它认为你试图调用一个无法方法echo,然后你就会有一个随机的字符串文字。