换行后的左大括号造成的问题:
class FooHolder { def foo() { println("foo was called") } }
Scala认为def foo()这行代码定义了一个抽象方法。这是因为它没有捕捉到后面的大括号,认定def foo()是完整的一行语句。当编译时,它认为这是一个洗呢匿名代码块,应该在类构建过程中执行。
解决办法:加一条新的编码规定,要求所有的方法定义使用"="语法。
trait FooHolder2{ def foo() : Unit = { println("foo2 was called") } }
空悬的操作符和括号表达式
"大字符串聚合"是空悬操作符能够帮到编译器的例子,指你试图创建一个很大的、无法在一行里完整定义的字符串。
java例子:
class test{ private int x = 5; private String foo() { return "HAI" + x + "ZOMG" + "\n"; } }
在Scala下就会编译失败,可以把操作符放到行末,从而知道后面还有更多内容
class test{ private int x = 5; private String foo() { return "HAI" + x + "ZOMG" + "\n"; } }
也可以增加括号
class test{ private int x = 5; private String foo() { return ("HAI" + x + "ZOMG" + "\n";) }
Scala的特质是线性化的,所以如果想要使用覆盖的方法,可以在实例化对象的时候混入父类,而不需要定义新的类。
trait Animal {def talk : String} trait Mammal extends Animal trait Cat {def talk = "Meow"} val x = new Mammal with Cat x.talk
执行结果如下:
时间: 2024-11-10 07:35:40