我可以在Scala中定义和使用类和对象之外的函数吗?

时间:2013-08-31 13:45:31

标签: scala functional-programming scala-2.10

我开始学习Scala,我很有趣,我可以在Scala中定义和使用没有任何类或对象的函数,就像Haskell中没有OOP概念一样。我有兴趣可以在没有任何OOP概念的情况下完全使用Scala吗?

P.S。我为Scala使用IntelliJ插件

3 个答案:

答案 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对日常编程有实际影响,例如MapFunctionSetString(由于StringOps的浓缩}})。

因此,虽然可以编写一个只调用函数且不是OOPly结构的程序,但是这种语言不支持在继承和其他unFP事件(如可变状态和副作用)的意义上主动避免OOP。