【问题标题】:Is destructuring input parameters available in Scala?Scala 中是否提供解构输入参数?
【发布时间】:2013-05-01 21:00:44
【问题描述】:

有没有办法在 Scala (akin to Clojure) 中解构函数的输入参数?

所以,而不是

scala> def f(p: (Int, Int)) = p._1
f: (p: (Int, Int))Int

我想要这个(不行):

scala> def f((p1, p2): (Int, Int)) = p1

【问题讨论】:

标签: scala clojure


【解决方案1】:

我猜在 scala 中你会使用模式匹配来达到同样的效果,例如像这样:

val f: (Int, Int) => Int = { case (p1, p2) => p1 }

或者,等效地:

def f(p: (Int, Int)) = p match { case(p1, p2) => p1 }

如果可以推断类型,则可以删除(Int, Int) => Int

List((1, 2), (3, 4)) map { case (p1, p2) => p1 }

【讨论】:

  • 我宁愿避免使用模式匹配作为过于冗长的解决方案。不过,如果没有其他惯用的方法,我可以接受。有吗?
  • @JacekLaskowski - 这是你将得到的最好的。元组和方法参数没有完全统一,这是您注意到的地方之一。但是,您可以使用 def f(p1: Int, p2: Int) = p1+p2 然后 (f _).tupled 创建一个采用元组的函数,即使 def 采用单独的参数。
【解决方案2】:
def f(p: ((Int, Int), (Int, Int))) = p._1     > f: (p: ((Int, Int), (Int, Int)))(Int, Int)
f((1,2), (3,4))                               > res1: (Int, Int) = (1,2)

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2011-06-08
    • 2020-10-09
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多