相关疑难解决方法(0)

隐式转换与类型类

在Scala中,我们可以使用至少两种方法来改进现有或新类型.假设我们想要表达某些东西可以使用a来量化Int.我们可以定义以下特征.

隐式转换

trait Quantifiable{ def quantify: Int }
Run Code Online (Sandbox Code Playgroud)

然后我们可以使用隐式转换来量化例如字符串和列表.

implicit def string2quant(s: String) = new Quantifiable{ 
  def quantify = s.size 
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{ 
  val quantify = l.size 
}
Run Code Online (Sandbox Code Playgroud)

导入这些后,我们可以quantify在字符串和列表上调用该方法.请注意,可量化列表存储其长度,因此它可以避免在后续调用时对列表进行昂贵的遍历quantify.

输入类

另一种方法是定义一个"证据" Quantified[A],表明某种类型A可以量化.

trait Quantified[A] { def quantify(a: A): Int }
Run Code Online (Sandbox Code Playgroud)

然后,我们提供这种类型的类的实例为StringList地方.

implicit val stringQuantifiable = new Quantified[String] {
  def quantify(s: String) = s.size 
}
Run Code Online (Sandbox Code Playgroud)

如果我们编写一个需要量化其参数的方法,我们写道:

def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) = 
  as.map(ev.quantify).sum …
Run Code Online (Sandbox Code Playgroud)

coding-style scala implicit-conversion

91
推荐指数
3
解决办法
7338
查看次数

标签 统计

coding-style ×1

implicit-conversion ×1

scala ×1