Scala 函数作为对象与类

Mak*_*e42 4 scala

trait MyFunctionTrait extends ((Int, Int) => Double)

class MyFunction1 extends MyFunctionTrait {
   override def apply(a: Int, b: Int) => Double = a/b 
}

object MyFunction2 extends MyFunctionTrait {
   override def apply(a: Int, b: Int) => Double = a/b 
}
Run Code Online (Sandbox Code Playgroud)

我不完全确定如何使用哪一个。区别是如何运行它们?

scala> val f = new MyFunction1
f: MyFunction1 = <function2>

scala> f(1,2)
res50: Double = 0.0

scala> MyFunction2(1,2)
res48: Double = 0.0
Run Code Online (Sandbox Code Playgroud)

我确实知道单例对象和类之间的区别是什么。我想知道在定义函数的特殊情况下的用例。文章中解释了函数,但我已经看到它被编程为一个类和一个对象,所以我想知道最佳实践是什么时候以及为什么。

在我的特定情况下,我想以柯里化风格将另一个函数作为函数的参数,然后MyFunction根据他们获得的函数来做略有不同的事情:如何编写柯里化 Scala 函数特征?

请回答1)一般情况,2)特殊情况。

PS:我试图将关于如何咖喱以及是类还是对象的问题分开 - 似乎不太好,就在这里。

dab*_*abe 5

这取决于你想做什么!


apply()scala 中的函数只是语法糖 [ 1 , 2 ],它允许您MyObject(x)用作MyObject.apply(x).

scala 中的对象是单例对象,这意味着该类最多只有一个实例。因此,您可以调用MyFunction2(1,2).

类是具有已知字段和函数的类型。它是您尝试使用代码建模的内容的定义。因此,您不能调用MyFunction1(1,2),因为您需要该类的实例才能访问其字段和函数。


话虽如此,您可能想要重新考虑您正在尝试做什么。从这个意义上说,类和对象不是简单的数学函数,您可以在其中定义对象 x、对象 y、...,然后使用 x(...) 和 y(...)。您想要创建的是您定义函数的类或对象(即单例类),例如

object Calculator {

    def add(a: Int, b:Int): Int = {
        return a + b
    }

    def subtract(a: Int, b: Int): Int = {
        return a - b
    }

}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用它来调用您的函数,例如Calculator.add(2,3).

或者

class Calculator {

    def add(a: Int, b: Int): Int = {
       return a + b
    }
}
Run Code Online (Sandbox Code Playgroud)

你同样会使用

val calc = new Calculator
calc.add(3,2)
Run Code Online (Sandbox Code Playgroud)

同样,您会发现object Calculator无需创建实例即可使用。您可以将 Scala 对象中定义的字段和参数与 Java 类中的静态字段进行比较,您也可以在不创建类的实例化对象的情况下访问它们。您应该选择哪一个完全取决于您尝试编程的内容。要找出答案,您可能需要阅读Scala 中的对象和类之间的差异