Scala函数作为对象与类

时间:2016-10-07 16:35:56

标签: 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 
}

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

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

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

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

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

在我的特定情况下,我想在currying风格中将另一个Function作为参数提供给函数,然后使用不同的MyFunction根据他们获得的函数做一些不同的东西:How to write a currying Scala Function trait? < / p>

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

PS:我试图将关于如何咖喱和类或对象的问题分开 - 似乎没有那么好用,就在这里。

1 个答案:

答案 0 :(得分:3)

这取决于您的目标!

scala中的apply()函数只是语法糖[12],它允许您使用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
    }

}

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

class Calculator {

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

你会同样使用

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

同样,您会发现可以在不创建实例的情况下使用object Calculator。您可以将Scala对象中定义的字段和参数与Java类中的静态字段进行比较,您也可以在不创建实例化类的对象的情况下访问它。你应该选择哪一个完全取决于你想要编程的内容。要了解相关信息,您可以阅读Difference between object and class in Scala