Scala函数作为对象与类

Scala Functions as object vs class

1
2
3
4
5
6
7
8
9
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
}

我不完全确定该怎么用。不同之处在于如何运行它们?

1
2
3
4
5
6
7
8
scala> val f = new MyFunction1
f: MyFunction1 = <function2>

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

scala> MyFunction2(1,2)
res48: Double = 0.0

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

在我的特殊情况下,我想给出另一个函数作为当前样式中函数的参数,然后使用不同的MyFunction,根据它们得到的函数,这些函数的作用略有不同:如何编写当前scala函数特征?

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

附言:我试着把关于如何讨价还价的问题和阶级或对象的问题分开来——在这里似乎效果不太好。


这取决于你想做什么!

scala中的apply()函数只是语法糖〔1,2〕,它允许您使用MyObject(x)作为MyObject.apply(x)的简写。

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

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

正因为如此,你可能想重新思考你想做什么。从这个意义上讲,类和对象不是简单的数学函数,您定义对象x、对象y,…,然后使用x(…)和y(…)。您想要创建的是一个类或一个对象(即singleton类),您可以在其中定义函数,例如。

1
2
3
4
5
6
7
8
9
10
11
object Calculator {

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

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

}

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

1
2
3
4
5
6
class Calculator {

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

你也会用它

1
2
val calc = new Calculator
calc.add(3,2)

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