如何在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)
}
}
答案 0 :(得分:26)
在你的问题中,你说你想要一系列功能。但是整个代码段中没有一个函数!
我猜你的名字是f1
,f2
和f3
,你认为这些是函数。但它们不是:def
关键字用于声明方法,而不是函数。这两个根本不同!
所以,如果你想使用一系列函数,只需要f1
,f2
和f3
实际是函数而不是方法:
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](_ + _, _ - _, _ * _)
作品。