一系列功能?

11 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)
   }
}
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 26

在你的问题中,你说你想要一组函数.但是整个代码段中没有一个函数!

我的名字猜测f1,f2f3你以为那些都是功能.但它们不是:def关键字用于声明方法,而不是函数.这两者根本不同!

所以,如果你想使用的功能的阵列,只是使f1,f2f3实际上功能,而不是方法:

val f1: (Int, Int) => Int = _ + _
val f2: (Int, Int) => Int = _ - _
val f3: (Int, Int) => Int = _ * _
Run Code Online (Sandbox Code Playgroud)

另一种方法是实际读取错误消息,它会准确地告诉您问题是什么以及如何解决它:

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)
                             ^
Run Code Online (Sandbox Code Playgroud)

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

val fnList = Array(f1 _, f2 _, f3 _)
Run Code Online (Sandbox Code Playgroud)

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

在某些情况下,当它是真的痛苦公然明显的参数不能可能是任何东西,而是一个功能,斯卡拉从方法执行转换到自动为您工作.因此,第三个选择是 Scala明显地显而易见,你确实拥有一系列函数,你知道,它将它声明为一个函数数组:

val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or
val fnList = Array[(Int, Int) => Int](f1, f2, f3)
Run Code Online (Sandbox Code Playgroud)

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


Eas*_*sun 7

或写作:

scala> val fnList = Array(f1 _,f2 _,f3 _)
fnList: Array[(Int, Int) => Int] = Array(<function2>, <function2>, <function2>)
Run Code Online (Sandbox Code Playgroud)