在scala中使用extends Function2 [Int,Int]定义对象有什么用例?

时间:2016-07-03 21:46:20

标签: scala functional-programming

下方对象sum与函数f(i: Int, j:Int) = i + j

的区别如何

据我所知,函数是特征,每次我们声明一个函数时,都会创建一个具有相应定义的apply方法的特征的对象。但我无法理解下面的对象定义可以用于什么特殊目的。

如果我在任何地方都错了,请纠正我。

 object sum extends Function2[Int, Int, Int]{
    def apply(first: Int, second: Int) = {
      first + second
    }
  }

2 个答案:

答案 0 :(得分:1)

这是一个价值; f不是,它只能转换为值,如果在多个地方使用它,它将被多次转换,这可能会对性能产生(可能非常小)影响。但是,与val sum = (i: Int, j: Int) => i + j相比,我认为没有任何优势(或者如果它需要处于最高级别,object A { val sum = (i: Int, j: Int) => i + j })。

答案 1 :(得分:1)

函数文字中有一些功能方法没有:

  • 方法可以是通用的,函数文字不能,
  • 方法可以有一个隐含的参数列表,函数文字不能,
  • 方法可以使用带有默认参数的可选参数,函数文字不能,
  • 方法可以有重复的参数,函数文字不能。

因此,通过显式定义.then方法而不是使用函数literal syntactic sugar,您可以访问所有这些。

此外,您还可以添加其他方法和/或字段。

但是,您的示例不使用这些,所以实际上,使用显式语法没有意义。

实际上,有一个区别:

apply

val sum = (first: Int, second: Int) => first + second sum,而在您的示例中,它是val

另请注意,您发布的代码:

object

不是一个函数,它是一个方法!我的答案适用于函数文字和显式定义的def f(i: Int, j:Int) = i + j 实例/子类型,与方法之间的区别。