scala隐式转换和箭头

1 scala implicit-conversion

我正在努力完成我的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)

有任何想法吗?

lmm*_*lmm 5

->方法通过隐式转换(any2ArrowAssocin scala.Predef)在所有Scala类型上可用.出于理智的原因,Scala不允许多个隐式转换在同一表达式上"链接".你可以:

  • ->在您的A班级上定义一个显式方法.不幸的是,由于默认的隐式转换会与此冲突,因此您可能必须构建代码-Yno-predef以避免冲突
  • A使用视觉上相似的名称在您的类上定义一个方法,该名称不会发生冲突,例如~>»
  • myMethod(("a", "b"))如果您喜欢该语法,请调用(直接支持此语法,而不是通过隐式转换)
  • myMethod接受(String, String)*并执行转换AB内部.
  • 编辑:您还可以从定义的隐式转换(String, String)(A, B)为@BenReich建议.