2015-01-02 113 views
0

方法调用间距不一致我有一个的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_=

UPDATE:

我做了一个实验:

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

关于'_'的回答:需要在语法上创建一个标识符。每个符号(非alnum字符)应由至少一个“_”与字母数字字符分隔。 –

+0

@GáborBakos:谢谢。但是似乎下划线只能使用一次,因为当我尝试这个时:'val x _ = _ x = 20',我得到了编译错误。我还有一些关于它的问题,我想我最好为此做一个单独的问题。 – null

回答

3

这是因为自由点,斯卡拉语法只允许你把括号,如果你也落了点:

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

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

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

+2

但是'p.age = 8-4'可以正常工作。 – null

+2

这是一个完全不同的,特殊处理的语法。这不是“age”是方法名称,“=”是参数。编译器将它转换为'p.age _ =(8-4)',而不是'p.age(=)...'。 – dhg

+0

查看我更新的问题。所有这些都来自** scala的魔法**? – null