我开始学习Scala,我很有趣,我可以在Scala中定义和使用没有任何类或对象的函数,就像Haskell中没有OOP概念一样。我有兴趣可以在没有任何OOP概念的情况下完全使用Scala吗?
P.S。我为Scala使用IntelliJ插件
答案 0 :(得分:21)
嗯,你真的不能这样做,但你可以通过使用package objects来接近它:
src/main/scala/yourpackage/package.scala
:
package object yourpackage {
def function(x: Int) = x*x
}
src/main/scala/yourpackage/Other.scala
:
package yourpackage
object Other {
def main(args: Array[String]) {
println(function(10)); // Prints 100
}
}
注意function
对象中Other
的使用方式 - 没有任何限定符。这里function
属于一个包,而不属于某个特定的对象/类。
答案 1 :(得分:10)
正如其他答案所指出的那样,不能在没有对象或类的情况下定义函数,因为在Scala中,函数是对象,并且(例如)Function1
是一个类。
但是,可以定义一个没有封闭类或对象的函数。您可以通过将函数本身作为对象来实现此目的。
src/main/scala/foo/bar/square.scala
:
package foo.bar
object square extends (Int => Int) {
def apply(x: Int): Int = x * x
}
extends (Int => Int)
只是extends Function1[Int, Int]
的语法糖。
然后可以像这样导入和使用它:
src/main/scala/somepackage/App.scala
:
package foo.bar.somepackage
import foo.bar.square
object App {
def main(args: Array[String]): Unit = {
println(square(2)) // prints "4"
}
}
答案 2 :(得分:4)
不,作为“第一类对象”的功能意味着它们仍然是对象。
但是,构建一个除了调用任意组合的函数之外什么都不做的Scala应用程序仍然很容易。
一个Odersky模因是Scala融合了FP和OOP,它利用了OOP的模块化。斯卡拉并不追求“纯粹的FP”,这是不言而喻的。但OOP对日常编程有实际影响,例如Map
是Function
,Set
或String
(由于StringOps
的浓缩}})。
因此,虽然可以编写一个只调用函数且不是OOPly结构的程序,但是这种语言不支持在继承和其他unFP事件(如可变状态和副作用)的意义上主动避免OOP。