我被困在一台锁定的电脑上工作。但我正在尝试练习我的Scala。我使用Ideone.com,因为我甚至无法安装scalac
...
无论如何这不是编译:
class DPt(var name: String, var x: Double, var y: Double){
def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}
object Main {
def main(args: Array[String]) {
val pt0 = new DPt("Joe", 1.0, 1.0)
println("checking generated accessor: " + pt0.x)
pt0 print
pt0.x_=(3.0)
pt0 print
}
}
我从Ideone.com scala编译器收到此消息:
Main.scala:12: error: Unit does not take parameters
pt0 print
^
one error found
spoj: The program compiled successfully, but Main.class was not found.
Class Main should contain method: def main(args: Array[String]).
但是,当我在语句的末尾添加分号时,如下所示:
class DPt(var name: String, var x: Double, var y: Double){
def print = println("DPt; name: " + name + " x: " + x + " y: " + y)
}
object Main {
def main(args: Array[String]) {
val pt0 = new DPt("Joe", 1.0, 1.0);
println("checking generated accessor: " + pt0.x);
pt0 print;
pt0.x_=(3.0);
pt0 print;
}
}
我发现Scala中的中缀和后缀表示法很棒,但我必须遗漏一些东西。为什么Scala不认为该行的结尾是声明的结尾?
这个博客上的第二张海报似乎有答案。斯卡拉人应该继续这样做。这样的烦恼....虽然这是第一次讨厌这个我在这个美妙的语言中遇到的烦恼。 http://www.scala-lang.org/node/4143
直接来自文档的另一种解释:http://docs.scala-lang.org/style/method-invocation.html
删除点时,Scala假定您使用的是arg0 operator arg1
语法。它与1 + 2
相同:Scala假设一个参数将跟随运算符。
所以,假设print
是一个接受参数的方法,它会转到下一行寻找一个参数。你得到一个错误,因为那实际上不起作用:print
没有参数。
通过添加分号,您告诉编译器肯定不会有该方法的参数,因此它将停止查找。这有助于编译器发现print
不需要参数,所以一切都很好。
要解决问题,只需说pt0.print
,你会没事的。