2016-02-01 1 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» очень похожи на выражение, а не на то, что изменяет глобальные команды объектов. – 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.