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
,然后您后面有一个随机字符串文字。
我有一个 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
,然后您后面有一个随机字符串文字。