私のDSLでは、次のようにできるようにしたいと思います。
val a = 5
Parse("TYPE") {
a match {
case 3 => info("almost")
case s: String => error("wrong type")
case 5 => info("you won!")
case _ => error("omg")
}
}
出力付き
[INFO] TYPE: you won!
ここで、は、およびメソッドParse
を持つ関数オブジェクトです。apply(String)
info(String)
error(String)
object Parse {
def apply(name: String)(parseF: => Unit) { parseF }
def info(text: String) { println("[INFO] " + name + ": " + text) }
def error(text: String) { println("[ERROR] " + name + ": " + text) }
}
秘訣は、メソッドinfo
とerror
メソッドの出力が何らかの形でParse
オブジェクトにネイティブであり、上記の例でメッセージを作成する必要があることです。したがって、彼らは
- インポートなしで、例のようにアクセス可能である必要があります。
- 渡される最初の引数
Parse()
(例では「TYPE」)にアクセスできる必要があります。 - 作業中にインスタンスや追加のオブジェクトを作成してはなりません。
これは理想的な説明です。もう少し定型文が必要になると思います。提案してください、どうすればそれを達成できますか?
編集:メソッド内でメソッドinfo
とメソッドを宣言する最初の推測では、渡されるメソッドでそれらが表示されません。まあ、当然のことながら..error
apply
parseF