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

Mai*_*r00 11 functional-programming scala scala-2.10

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

PS我为Scala使用IntelliJ插件

Vla*_*eev 22

好吧,你不能真的那么做,但你可以通过使用包对象来非常接近:

src/main/scala/yourpackage/package.scala:

package object yourpackage {
  def function(x: Int) = x*x
}
Run Code Online (Sandbox Code Playgroud)

src/main/scala/yourpackage/Other.scala:

package yourpackage

object Other {
  def main(args: Array[String]) {
    println(function(10));   // Prints 100
  }
}
Run Code Online (Sandbox Code Playgroud)

注意如何functionOther对象中使用 - 没有任何限定符.这里function属于一个包,而不属于某个特定的对象/类.

  • @JörgWMittag,当然,这是一种方法.Java平台没有功能概念.甚至Scala函数也只是具有花哨类型的对象.但在我的回答中,我从未说过`function`是一个函数,它只是一个名字. (5认同)
  • 那不是一个函数,那是一种方法。 (3认同)

Tim*_*thy 11

正如其他答案所指出的那样,不能在没有对象或类的情况下定义函数,因为在Scala中,函数是对象,(例如)Function1是一个类.

但是,可以定义没有封闭类或对象的函数.您可以通过将函数本身作为对象来完成此操作.

src/main/scala/foo/bar/square.scala:

package foo.bar

object square extends (Int => Int) {
  def apply(x: Int): Int = x * x
}
Run Code Online (Sandbox Code Playgroud)

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"
  }
}
Run Code Online (Sandbox Code Playgroud)


som*_*ytt 5

不,作为“一流对象”起作用意味着它们仍然是对象。

但是,构造一个只调用任意组成的功能的Scala应用程序仍然很容易。

奥德斯基的一个模因是,Scala的FP和OOP的融合利用了OOP的模块化。Scala不为“纯FP”而努力,这是不言而喻的。但是OOP对日常编程会产生实际的影响,例如a Map是a Function,as是a Set或a String(由于丰富到StringOps)。

因此,尽管可以编写仅调用一个函数而不进行OOPly结构化的程序,但从继承性和可变状态和副作用之类的其他非FP方面讲,该语言不支持主动避免OOP。

  • 您知道幕后的设计吗?在Python中,函数也是第一类对象,可以在任何类中定义它,也可以分配给其他变量... (2认同)