如何从ProductIterator(元组)调用map()

时间:2013-12-14 22:31:52

标签: scala

给出以下占位符记录方法:

def testshow(value: Any) = value.toString

在以下代码段中:

  case t : Product =>
    t.productIterator.foreach( a => println(a.toString))
     val lst =  t.productIterator.map(a => testshow(a))
     val lst2 = t.productIterator.map(_.toString)
      lst.mkString("(",",",")")
      lst2.mkString("(",",",")")

给出一个输入元组:

(Some(OP(_)),Some(a),1)

println成功显示给定元组的条目。

Some(OP(_))
Some(a)
1

lst2(带有toString)说:非空迭代器。然而,列表“lst”说:

empty iterator

那么在productIterator上调用map()方法的语法有什么问题?

注意:如果使用“toString”代替testshow,这可以正常工作。

更新:“自包含”代码段确实有效。目前还不清楚为什么上面的代码没有..

def testshow(value: Any) = "TestShow%s".format(value.toString)

val obj = ("abc",123,"def")
obj match {
  case t : Product =>
    t.productIterator.foreach( a => println(a.toString))
    val lst =  t.productIterator.map(a => testshow(a))
    val lst2 = t.productIterator.map(_.toString)
    println("testshow list %s".format(lst.mkString("(",",",")")))
    println("toString list %s".format(lst2.mkString("(",",",")")))
  }

输出:

abc
123
def
testshow list (**abc**,**123**,**def**)
toString list (abc,123,def)

2 个答案:

答案 0 :(得分:0)

迭代器只能遍历一次,然后就会耗尽。映射迭代器会产生另一个迭代器。如果您看到迭代器为空,则必须强制进行遍历。

scala> case class Foo(a: Int, b: Int)
defined class Foo

scala> Foo(1, 2).productIterator.map(_.toString)
res1: Iterator[String] = non-empty iterator

非空。你确定你使用了新的迭代器吗?因为如果你为第一个foreach循环使用了相同的迭代器,那么如果你之后尝试map相同的迭代器,那么它将是空的。


编辑: map函数参数的形状与此无关:

def testshow(value: Any) = value.toString

case class OP(x: Any)

def test(x: Any) = x match {
  case t: Product =>
    val lst = t.productIterator.map(a => testshow(a))
    lst.mkString("(", ",", ")")
  case _ => "???"
}

test((Some(OP(_)),Some('a'),1))  // "(Some(<function1>),Some(a),1)"

答案 1 :(得分:0)

看起来像一个Intellij Bug。我只是更改了&#34; lst&#34;变量为&#34; lst3&#34;它的工作原理。我重复了前后命名/重命名的过程,这是可重复的错误。没有其他事情发生在&#34; lst&#34;在整个文件中,无论如何它都是一个局部变量。