0

背景:我正在将scala.js / scalatags与 scala.rx 一起使用。我想要实现的是Var使用运算符样式将值从 html 输入绑定到 Rx 。这就是我要做的:

implicit class BoundHtmlInput(input: Input) {
  def bindTextTo(v: Var[String]): Input = {
    input.oninput = { (e: dom.Event) => v() = input.value}
    input
  }

  def bindNumberTo(v: Var[Int]): Input = {
    input.oninput = {(e: dom.Event) => v() = input.valueAsNumber}
    input
  }

  def ~>[T](v: Var[T])(implicit ev: T =:= Int): Input =
     bindNumberTo(v.asInstanceOf[Var[Int]])

  def ~>[T](v: Var[T])(implicit ev: T =:= String): Input = 
     bindTextTo(v.asInstanceOf[Var[String]])
}

它适用于方法调用,但不适用于操作员~>调用。错误如下:

Error:(43, 70) ambiguous reference to overloaded definition,
both method ~> in class BoundHtmlInput of type [T](v: rx.Var[T])(implicit ev: =:=[T,String])org.scalajs.dom.html.Input
and  method ~> in class BoundHtmlInput of type [T](v: rx.Var[T])(implicit ev: =:=[T,Int])org.scalajs.dom.html.Input
match argument types (rx.core.Var[String])

而且我对两者的使用都不满意asInstanceOf

我希望这提供了足够的背景。我的问题是,实现我想要的更好的方法是什么?

4

1 回答 1

2

直接使用Var[Int]andVar[String]与虚拟隐式来对抗擦除后的双重定义:

def ~>[T](v: Var[Int]): Input =
  bindNumberTo(v)

def ~>[T](v: Var[String])(implicit dummy: DummyImplicit): Input = 
  bindTextTo(v)

DummyImplicit如果您有更多类型要处理,您可以根据需要添加任意数量的 s:

def ~>[T](v: Var[Boolean])(implicit dummy1: DummyImplicit,
    dummy2: DummyImplicit): Input = 
  bindBooleanTo(v)
于 2016-01-06T16:34:22.653 回答