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:我试图将关于如何咖喱和类或对象的问题分开 - 似乎没有那么好用,就在这里。答案 0 :(得分:3)
这取决于您的目标!
scala中的apply()
函数只是语法糖[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
}
}
然后您可以使用它来调用您的函数,例如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