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:我试图将关于如何咖喱以及是类还是对象的问题分开 - 似乎不太好,就在这里。
这取决于你想做什么!
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 中的对象和类之间的差异