1. ホーム
  2. scala

[解決済み] Scala - case classを木のように(きれいに)印刷する方法

2022-02-12 03:06:19

質問内容

ScalaのCombinatorを使ってパーサーを作っています。すごいですね。私が最終的に行き着いたのは、絡み合ったケースクラスの長いリストです。 ClassDecl(Complex,List(VarDecl(Real,float), VarDecl(Imag,float))) ただ、100倍長いだけです。このようなケースクラスをツリー状に印刷して見やすくする良い方法はないものでしょうか?(または、他の形式の プリティプリント )

ClassDecl
  name = Complex
  fields =
  - VarDecl
      name = Real
      type = float
  - VarDecl
      name = Imag
      type = float

^ 最終的にはこんな感じにしたいです。

edit: ボーナス質問

パラメータ名を表示する方法もあるのでしょうか...?みたいな感じで。 ClassDecl(name=Complex, fields=List( ... ) ?

解決方法は?

という名前の小さな拡張ライブラリをチェックしてみてください。 セクスト . これは、次のようにエクスポートします。 この2つの関数 というような目的のために、まさに

例題の使い方はこうです。

object Demo extends App {

  import sext._

  case class ClassDecl( kind : Kind, list : List[ VarDecl ] )
  sealed trait Kind
  case object Complex extends Kind
  case class VarDecl( a : Int, b : String )


  val data = ClassDecl(Complex,List(VarDecl(1, "abcd"), VarDecl(2, "efgh")))
  println("treeString output:\n")
  println(data.treeString)
  println()
  println("valueTreeString output:\n")
  println(data.valueTreeString)

}

以下は、このプログラムの出力です。

treeString output:

ClassDecl:
- Complex
- List:
| - VarDecl:
| | - 1
| | - abcd
| - VarDecl:
| | - 2
| | - efgh

valueTreeString output:

- kind:
- list:
| - - a:
| | | 1
| | - b:
| | | abcd
| - - a:
| | | 2
| | - b:
| | | efgh