我可以在Scala中使用非逗号分隔的标记集创建元组吗?

时间:2011-06-10 10:39:22

标签: scala dsl

我正在继续我的Stack-Overflow驱动的测试DSL编程 - 感谢迄今为止所有贡献者!

目前我的DSL读起来像这样

scenario("Incorrect password") {
  given("user visits", the[AdminHomePage])
  then(the[SignInPage], "is displayed")      

  when("username", "admin", "and password", "wrongpassword", "are entered")
  then(the[SignInPage], "is displayed")      
  and("Error message is", "Sign in failed")
}

给出,何时然后是采用Any的方法,所以当这样调用时,它们会传递一个参数元组 - Why and how is Scala treating a tuple specially when calling a one arg function?

理想情况下,我会删除逗号,以便它读得更好,只用空格分隔标记

scenario("Incorrect password") {
  given("user visits" the[AdminHomePage])
  then(the[SignInPage] "is displayed")      

  when("username" "admin" "and password" "wrongpassword" "are entered")
  then(the[SignInPage] "is displayed")      
  and("Error message is" "Sign in failed")
}

任何人都可以想到任何可以让我实现这一目标的技术,或者它对于内部DSL来说太过分了吗?

3 个答案:

答案 0 :(得分:1)

不,您不能从空格分隔的标记创建元组(尽管您可以使用自定义运算符作为分隔符而不是逗号)。你可以做的是使用这样的无点语法:

obj method obj method obj ...

许多DSL实现(如规范)利用此语法创建更多“类文本”语法。

答案 1 :(得分:1)

您需要“令牌”之间的方法/运算符。对于对,已经有->,例如

println("hello" -> 12 -> '!' -> 12.0)
//--> (((hello,12),!),12.0)

答案 2 :(得分:1)

不确定它是否有效:

如前所述,您可以在运算符表示法中调用一个参数方法。动态特征还允许动态调用方法:http://www.scala-lang.org/api/current/index.html#scala.Dynamic

因此,如果您从实现动态特征的对象开始,它可能会起作用..