【问题标题】:Get Tuple2 from first two elements of Tuple3 in scala在scala中从Tuple3的前两个元素获取Tuple2
【发布时间】:2015-01-24 14:25:23
【问题描述】:

给定一个 Tuple3,例如("one", "two", "three")我要获取tuple2,它只包含前两个元素("one", "two")

一种方法是这样的:

val (one, two, _) = ("one", "two", "three")
val result = (one, two)

但是如果我想做类似的事情从 tuple16 获取 tuple14 呢?样板。

更新:

更具体的用例(func2 和 func3 不能更改)。

def func3(one: String, two: String, three: String) = println("Do something") 
def func2(one: String, two: String) = println("Do something 2")

val originalTuple = ("one", "two", "three")
val newTuple = ???

(func3 _).tupled(originalTuple)
(func2 _).tupled(newTuple)

【问题讨论】:

  • 不使用元组?将元组视为(某种)索引序列永远不会很好地工作(尽管 shapeless 会尽力提供帮助)
  • 不幸的是,这个元组是我无法更改的函数的参数列表。根据stackoverflow.com/questions/14722860/… 列表无法转换为元组。而且我不知道将参数列表传递给函数的方法。
  • " 而且我不知道将参数列表传递给函数的方法" 请进一步解释您的意思(也许在另一个问题中)。有可能。
  • 它有一个答案:)

标签: scala tuples


【解决方案1】:

你可以试试 Shapeless 2.0 中的take/drop

import syntax.std.tuple._

scala> (23, "foo", true).take(2)
res3: (Int, String) = (23,foo)

标准库中没有这样的解决方案,因为通常你不需要它。具有 16 种不同类型/元素的元组没有任何意义,并且是不良风格的明显标志。通常这样的元组可以表示为嵌套的案例类,但有时(非常罕见)你可能需要这样的东西来提高类型安全性。这就是Shapeless存在的原因。

【讨论】:

  • 别忘了import syntax.std.tuple._
  • 这很好,但我在标准库中寻找一些解决方案。
  • 没有,因为你真正需要它的情况非常罕见 - 具有 16 种不同类型/元素的元组没有意义(并且是一种糟糕风格的标志)。通常它可以表示为几个嵌套的元组/案例类。但有时(非常非常罕见)你需要它——这就是无形存在的原因。
  • 听起来很合理。
【解决方案2】:

这对于前两个元素来说没问题。

scala> val tuple3 = ("one","two","three")
tuple3: (String, String, String) = (one,two,three)

scala> (tuple3._1, tuple3._2)
res8: (String, String) = (one,two)

【讨论】:

  • 我认为这与我的问题中的示例几乎相同。这将是 tuple16 的样板。
  • 实际上这不一样,也不是样板:val tuple16 = (1,2,3,4,5,6,7,8,...,16); (tuple16._1, tuple16._2)。这里的问题(由 Shapeless 解决)是只有当你想从 tuple16 获得像 tuple14 这样的 smtg 但你实际上并没有要求时:obtain tuple2, which contains only first two elements ("one", "two")
  • 糟糕。我的错。我实际上是指 tuple16 中的 tuple14。 tuple2/3 问题只是为了简化。感谢您注意到这一点。我已经编辑了问题
猜你喜欢
  • 1970-01-01
  • 2020-07-31
  • 2016-02-26
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多