我正在尝试编写一个可以打印任意嵌套数组的辅助方法。我的计划是编写一个递归方法来解决这个问题。我想使用键入来区分要调用的方法。
基本情况是打印一个包含值的数组,即不是另一个嵌套数组。
递归情况是,如果数组包含另一个数组,则在子数组上调用 print。
这是我想写的代码
object Helper {
// Takes something that is an array of arrays and prints it
def print[B <: Array[Array[AnyVal]]](data: B): Unit = {
val sb = new StringBuilder()
printSb(data, sb)
println(sb.toString())
}
// Same as above but with string builder
private def printSb[B <: Array[Array[_]]](data: B, sb: StringBuilder): Unit = {
data.foreach(arr => printSb(arr, sb))
}
// Prints a value
def print[B <: AnyVal](data: Array[B]): Unit = {
val sb = new StringBuilder()
printSb(data, sb)
println(sb.toString())
}
// Prints an Array of values, not an array or arrays
private def printSb[B <: AnyVal](data: Array[B], sb: StringBuilder): Unit = {
data.foreach(b => "%s ".format(sb.append(printVal(b))))
}
// Prints a value
def printVal(v: Any): String = {
v match {
case b: Boolean => if (b) "1" else "0"
case i: Integer => "%01d".format(i)
case v => v.toString
}
}
}
但是,编译器很难决定将方法调用调度到哪个打印(我认为是因为 AnyVal == Array[_] ???(。我正在寻找一种通过类型表达我要求的好方法,这可能吗?
在我看来,你正在使它变得比它需要的更复杂。
从简单的事情开始...
def stringAll[X](x :X) :String = x match {
case arr: Array[_] => arr.map(stringAll).mkString("["," ","]")
case _ => x.toString
}
。那行得通...
val a = Array(Array(Array(2,5),Array('c','t')))
stringAll(a) //res0: String = [[[2 5] [c t]]]
。并根据需要添加更花哨的变换case b:Boolean => ...
。