我正在努力完成我的DSL构建尝试
我的方法应该采取多对(A,B),理想情况下我正在寻找这种代码:
myMethod(
a1 -> b1,
a2 -> b2,
a3 -> b3)
Run Code Online (Sandbox Code Playgroud)
我的A和B类经常使用单个字符串参数构造,所以我添加了隐式转换器,如下所示:
implict def stringToA(s: String): A = new A(s)
implict def stringToB(s: String): B = new B(s)
Run Code Online (Sandbox Code Playgroud)
但箭头操作符(对于构造)不会获取隐式转换器:
object Test {
case class A(s: String)
case class B(s: String)
def myMethod(pairs: (A, B)*): Unit = Unit
implicit def stringToA(s: String): A = A(s)
implicit def stringToB(s: String): B = B(s)
myMethod(new Tuple2("a", "b")) // works just fine
myMethod("a" -> "b") // Error: Type mismatch, expected: (Test.A, Test.B), actual: (String, String)
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
该->方法通过隐式转换(any2ArrowAssocin scala.Predef)在所有Scala类型上可用.出于理智的原因,Scala不允许多个隐式转换在同一表达式上"链接".你可以:
->在您的A班级上定义一个显式方法.不幸的是,由于默认的隐式转换会与此冲突,因此您可能必须构建代码-Yno-predef以避免冲突A使用视觉上相似的名称在您的类上定义一个方法,该名称不会发生冲突,例如~>或»myMethod(("a", "b"))如果您喜欢该语法,请调用(直接支持此语法,而不是通过隐式转换)myMethod接受(String, String)*并执行转换A和B内部.(String, String)到(A, B)为@BenReich建议.