Scala Puzzle:关于如何使这项工作的任何想法?

时间:2016-06-03 16:26:29

标签: scala

此代码无效!

def add(a: Int, b: Int): Int = a plus b

所以,我尝试像这样定义plus

def plus(a: Int, b: Int): Int = a + b

但是,编译器仍抱怨Cannot resolve symbol plus

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

a plus b无法正常工作,因为它是a.plus(b)的简写,标准库中的Int上没有此类方法。为了完成这项工作,你必须加强" Int类通过隐式转换。

implicit class MyPlus[T](a: T)(implicit ev:Numeric[T]) {
  def plus(b: T): T =  ev.plus(a,b)
}

现在您可以执行3 plus 5a plus b等。

您也可以这样做(更简洁,更易读,但基本上相同):

import Numeric.Implicits._
implicit class MyPlus[T: Numeric](a: T) {
  def plus(b: T): T = a + b
}

答案 1 :(得分:1)

由于a中的addInt,而scala.Int没有plus方法,我们需要创建一个隐式转换{ {1}}包含scala.Int并具有Int方法的内容:

plus

现在,一切正常:

implicit class IntWithPlus(val i: Int) extends AnyVal {
  def plus(other: Int) = i + other
}

另一种方法是创建一个类型def add(a: Int, b: Int): Int = a plus b add(2, 3) // => 5 ,该类型将导入到本地命名空间阴影Int中,并为该类型提供scala.Int方法。