我有一个Tuple,我存储了匿名函数,我想迭代它们并执行它们。
val functions = ((x:Int, y:Int) => x + y, (x:Int, y: Int) => x - y)
// I want to execute the anonymous functions in the Tuple
functions.productIterator.foreach(function => function)
不幸的是我无法做到
functions.productIterator.foreach(function => function(1, 2))
OR
functions.productIterator.foreach(_(1, 2))
出路是什么?
答案 0 :(得分:4)
元组并不意味着迭代。类型会丢失,因为元组中的每个条目都可以是不同的类型,因此类型系统只假定Any
(因此Iterator[Any]
)。所以真正的建议是,如果你想迭代,请使用像Seq
或Set
这样的集合。
另一方面,如果您知道元组包含特定类型的函数,那么您可以通过使用asInstanceOf
进行转换来绕过类型检查,但这是不推荐因为类型检查是你的朋友。
functions.productIterator.map(_.asInstanceOf[(Int,Int)=>Int](1, 2))
// produces `Iterator(3, -1)`
或者,查看Shapeless中的HLists,它们具有元组和集合的属性。
答案 1 :(得分:1)
productIterator
上的 Tuple
会返回Iterator[Any]
,而不是Iterator[Function2[Int, Int, Int]]
,正如您所期望的那样。
答案 2 :(得分:0)
我们可以在保留类型信息的同时将元组的元素提取为Seq
;因此
Seq(functions._1, functions._2).map(_(1,2))
List(3, -1)