【问题标题】:Yield from a Tuple元组的收益
【发布时间】:2015-03-29 17:03:58
【问题描述】:

元组和产量:非常常见的构造。但令我惊讶的是,以下将它们组合在一起的方法并不那么明显:

 val edges = ((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10),
 (1,7),(4,10))

  val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)
   // e is interpreted as "any"
   // therefore e._1 and e._2 are invalid / do not compile

更新

添加类型参数似乎有帮助.. 但为什么需要它?

  val edgesw = for (e: (Int, Int) <- edges) yield (e._1, e._2, 1.0)

另一个更新我忽略了 Seq / Array 符号!

 val edges = Seq((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10),
 (1,7),(4,10))

现在行为符合预期:

  val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)
 edgesw: Seq[(Int, Int, Double)] = List((1,2,1.0), (2,3,1.0), (3,4,1.0), (4,5,1.0), (1,6,1.0), (3,8,1.0), (4,9,1.0), (5,10,1.0), (1,7,1.0), (4,10,1.0))

【问题讨论】:

  • @enzyme 哦!现在已经晚了。我忘记了前面的 Seq 或 Array!是的,有趣的是,这完全有效! OP 已更新以在前面显示 Seq。

标签: scala yield


【解决方案1】:

以下内容:

val edges = ((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10), (1,7),(4,10))
val edgesw = for (e <- edges) yield (e._1, e._2, 1.0)

无法编译。你需要Seq正如你提到的所以:

scala> val edges = Seq((1,2),(2,3),(3,4),(4,5),(1,6),(3,8),(4,9),(5,10)) 
edges: Seq[(Int, Int)] = List((1,2), (2,3), (3,4), (4,5), (1,6), (3,8), (4,9), (5,10))

scala> for (e <- edges) yield (e._1, e._2, 1.0)
res2: Seq[(Int, Int, Double)] = List((1,2,1.0), (2,3,1.0), (3,4,1.0), (4,5,1.0), (1,6,1.0), (3,8,1.0), (4,9,1.0), (5,10,1.0))

所以类型推断按预期工作。

【讨论】:

    【解决方案2】:

    你应该使用这样的东西:

      val edgesw = for (
        eany <- edges.productIterator;
        e = eany.asInstanceOf[(Int, Int)]
      ) yield (e._1, e._2, 1.0)
    

    每个元组都扩展 Product 特征,因此具有:

    def productIterator: Iterator[Any]
    

    但是因为每个元组成员都可以包含不同类型的对象Product 只能返回Iterator[Any]。因为这个eany 类型是Any,你应该把它转换成(Int, Int)

    更新: 您的 UPDATE 版本不适用于我:

    val edgesw = for (e: (Int, Int) <- edges) yield (e._1, e._2, 1.0)
    

    我收到以下错误:

    值过滤器不是 ((Int, Int), ...) ...的成员 ...

    【讨论】:

    • 嗯。任何时候我们看到“asInstanceOf”都会让我怀疑。我更愿意将上面显示的“更新”代码保留在这个代码中。至少显式声明 (Int, Int) 不涉及强制转换。哦!我发现了问题 - 忽略了原始数据前面的 Seq (/Array) 符号
    • 是的,使用 Seq (/Array) 比使用 Tuple 保存 Tuple 更可取。
    猜你喜欢
    • 2015-01-28
    • 2013-07-03
    • 2019-09-19
    • 2012-08-15
    • 2015-10-11
    • 2018-08-15
    • 2019-08-07
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多