Я пытаюсь сделать замену println
, которая выводит вложенные коллекции в более читаемый формат.Лучше всего это проиллюстрировать на примере: я бы хотел, чтобы List(Set(Vector(1.0,1.1), Vector(0d)), Set(Vector("a", "b", "c"), Vector("x", "y")))
был напечатан как
List
Set
Vector(1.0, 1.1)
Vector(0.0)
Set
Vector(a, b, c)
Vector(x, y)
Это было бы намного проще без стирания типа, но я придумал
def rprint(a: Any, indent: Int = 0): Unit = a match {
case x: Traversable[_] =>
if (x.isEmpty)
rprint(x.toString, indent)
else x.head match {
case y: Traversable[_] => {
rprint(x.toString.takeWhile(_ != '('), indent)
x foreach {i => rprint(i, indent + 2)}
}
case y => rprint(x.toString, indent)
}
case x => println(" " * indent + x)
}
Я изо всех сил пытаюсь заставить это работать хорошо с Массивами, без существенного дублирования кода.Я бы хотел, чтобы они работали так же, как и для других коллекций.В частности:
Массивы не Traversable
могут преобразовывать массивы с использованием genericArrayOps
в ArrayOps, что составляет TraversableOnce
, но TraversableOnce
не имеет head
метода, поэтому я не вижу, как заставить элемент проверять его тип
toString
не работает как другие коллекции (используйте .deep
)
Каков наилучший способ включения массивов в этот метод, или есть другой подход, который будет работать лучше?