scala:将元组引用传递给函数
Posted
技术标签:
【中文标题】scala:将元组引用传递给函数【英文标题】:scala: pass tuple reference to function 【发布时间】:2016-12-16 14:49:50 【问题描述】:在python中我可以简单地定义一个这样的函数:
def func(lst):
lst[0] = lst[0] + 5
return lst
这个 'lst' 可以将不同长度的列表作为参数。
如何在 Scala 中使用元组?
注意:我正在尝试在 Scala 中实现一个用 Python 编写的 Spark 程序(或通用库)。在那个程序中有这个函数,它把 RDD 中的每条记录作为参数,对其进行操作,然后返回它。现在这些记录的长度可以根据调用函数的 RDD 有所不同。
【问题讨论】:
【参考方案1】:与您描述的 python 函数完全等价的内容如下所示:
def func(list: List[Any]) = list.headOption.map
_.asInstanceOf[Int] + 5
++ list.tail
但不要这样做。类型安全(能够在编译时确保您正在查看的数据正是您期望的类型)是选择 scala 而不是 python 的最大原因之一。
如果您不打算使用它,为什么还要在 scala 中重写您的 python 代码?就用你所拥有的吧。
【讨论】:
【参考方案2】:你可以这样做:
def add5ToHead(list: List[Int]) =
list match
case head :: tail => head+5 :: tail
case l => l
【讨论】:
唯一的问题是 List/Tuple 的元素可以是不同的类型。所以它必须是一个元组。【参考方案3】:copy
方法可能非常适合您的情况:
def func1(t: (Int, Int, Int)) = t.copy(_1 = t._1 + 5)
Int
类型和+5
只是一个示例,您可以通过额外的参数传入值和类型。
您也可以将PartialFunction
应用于您的方法,例如:
val partialFunc1: PartialFunction[Int, Int] =
case x => x + 5
def func1(t: (Int, Int, Int), f: PartialFunction[Int, Int]) = t.copy(_1 = f(t._1))
func1((1,2,3), partialFunc1) // output will be (6,2,3)
【讨论】:
以上是关于scala:将元组引用传递给函数的主要内容,如果未能解决你的问题,请参考以下文章