给出以下占位符记录方法:
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)
答案 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;在整个文件中,无论如何它都是一个局部变量。