2016-02-01 33 views
1

這是我在一階DSL第一次嘗試:DSL追加字符串列出

object ListOfStringsDsl extends App { 

    object Commands { 

    val l: scala.collection.mutable.ListBuffer[String] = new scala.collection.mutable.ListBuffer(); 

    def and(s: String) = { 
     l += s; 

     this 
    } 

    override 
    def toString = l.mkString(",") 
    } 

    println(Commands and("test") and("test2") toString) 
} 

此打印:

test,test2 

這是預期的輸出。但我想簡化輸出是如何創建的,所以不是println(Commands and("test") and("test2") toString)到輸出命令使用方法:

希望能夠使用:

println(Commands "test" and "test2" toString) 

如何在Scala中實現這一目標?

+0

這個和應該工作只是找到,調用toString可能需要導入此語言功能:import language.postfixOps你可能不應該使用副作用來實現這樣的DSL。 「asd」和「foo」看起來非常像表達式,而不是修改全局對象Commands的東西。 – dth

回答

1

我已經成功與隱

case class Commands(val list: List[String]) { 
    def and(that: String) = Commands(that :: list) 
    } 
    implicit def command(cmd: String) = Commands(cmd :: Nil) 
    println("run1" and "wait") 

我認爲implicits是DSL的重要組成部分。