一系列功能?

时间:2011-12-18 06:58:54

标签: scala

如何在Scala中创建一个函数数组,以便我可以遍历它们并调用它们来执行计算?

def f1(x: Int, y: Int): Int = x + y

def f2(x: Int, y: Int): Int = x - y

def f3(x: Int, y: Int): Int = x * y

def test() {
   val someValues1 = List(1, 2)
   val someValues2 = List(3, 4)
   val fnList = Array(f1,f2,f3)

   for (f <- fnList; a <- someValues1; b <- someValues2) {
     val result = f(a, b)
     println("Result=" + result)
   }
}

3 个答案:

答案 0 :(得分:26)

在你的问题中,你说你想要一系列功能。但是整个代码段中没有一个函数!

我猜你的名字是f1f2f3,你认为这些是函数。但它们不是:def关键字用于声明方法,而不是函数。这两个根本不同

所以,如果你想使用一系列函数,只需要f1f2f3实际函数而不是方法:

val f1: (Int, Int) => Int = _ + _
val f2: (Int, Int) => Int = _ - _
val f3: (Int, Int) => Int = _ * _

另一种方法是实际读取错误消息,告诉你完全问题是什么以及如何解决它:

error: missing arguments for method f1 in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
          val fnList = Array(f1,f2,f3)
                             ^

因此,如果您只是执行错误消息告诉您要做的事情,即使用_运算符将方法转换为函数,一切都会正常工作:

val fnList = Array(f1 _, f2 _, f3 _)

您收到错误消息的原因仅仅是因为Scala允许您在方法调用中省略括号。所以,f1只是意味着“没有参数列表调用f1”,这是一个错误,因为f1有两个参数。

在某些情况下,当真的非常明显地认为参数不能可能一个函数时,Scala会执行自动从方法转换为功能。所以,第三个选择是 make 对于Scala而言,你已经非常明显地明白你有一个函数数组,你知道,它是一个函数数组:

val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or
val fnList = Array[(Int, Int) => Int](f1, f2, f3)

现在,Scala 知道 fnList是一个函数数组,它不再尝试调用f1,而是将其转换为函数。

答案 1 :(得分:7)

或写为:

scala> val fnList = Array(f1 _,f2 _,f3 _)
fnList: Array[(Int, Int) => Int] = Array(<function2>, <function2>, <function2>)

答案 2 :(得分:4)

目前尚不清楚你在问什么,但你可能也想知道

val fnList = Array[(Int,Int) => Int](_ + _, _ - _, _ * _)

作品。