可以用java相同的方式实例化一个scala类
问题描述:
如果我将Functions声明为对象而不是类,那么下面的类不会编译,我可以使用Functions.fac(3)来运行方法fac。尝试像这样运行课程,在scala中有意义吗?如何修改下面的代码,使其运行时不更改为对象而不是类?可以用java相同的方式实例化一个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));
}
}
答
你代码中最明显的问题是你有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))
}
}
答
Java和Scala非常不同地实现静态函数。在Java中,您添加了静态标识符,而在Scala中,您将该方法放在Object伴侣中。
使用'new'创建一个新对象并且该代码*应该*编译(即使可能不能运行)是非常有意义的。确保您提出了您想问的问题 - 例如,什么“不起作用”呢? – 2012-08-14 21:55:52