下面的类不编译,如果我将函数声明为对象而不是类,我可以使用Functions.fac(3)运行方法fac。在scala中尝试运行这样的类是否有意义?如何修改下面的代码,使其运行而不更改为对象而不是类?
class Functions {
def fac(n : Int) = {
var r = 1;
for(i <- 1 to n) r = r * i;
r
}
def main(args:Array[String]) = {
Functions f = new Functions();
print(f.fac(3));
}
}
答案 0 :(得分:7)
代码中最明显的问题是您拥有Functions f = ...
。这是Java语法,因此在Scala中您需要它来说val f: Functions = ...
其次,Scala比Java更能区分静态和非静态事物。在Scala中,在对象中声明了静态的东西(例如main
方法)。因此,您应该将object
(静态)部分与class
部分分开。
第三,您的fac
功能可以更简单地写为(1 to n).product
。
最后,你不需要分号。
class Functions {
def fac(n: Int) =
(1 to n).product
}
object Functions {
def main(args: Array[String]) = {
val f: Functions = new Functions()
print(f.fac(3))
}
}
答案 1 :(得分:1)
Java和Scala以非常不同的方式实现静态函数。在Java中,您添加了静态标识符,而在Scala中,您将该方法放在Object伴侣中。