Ben*_*enP 5 parameters types scala
我想编写一个根据其类型参数而行为不同的函数.我想要的一个简单示例如下所示:
def f[Int] = "I'm an int"
def f[Float] = "I'm a float"
def f[Burger] = "You want fries with that?"
Run Code Online (Sandbox Code Playgroud)
这可能在Scala中还是需要某种解决方法?
RM.*_*RM. 14
不直接; 你在Scala中这样做的通常方法是使用类型类.
trait FAble[T] { def doF: String }
object FAble {
implicit val fInt = new FAble[Int] { def doF = "I'm an int" }
implicit val fFloat = new FAble[Float] { def doF = "I'm a float" }
implicit val fBurger = new FAble[Burger] { def doF = "You want fries?" }
}
def f[T](implicit ev: FAble[T]) = ev.doF
// or
def f[T: FAble] = implicitly[FAble[T]].doF
Run Code Online (Sandbox Code Playgroud)
它有点冗长,但它也有一些优点 - 可以计算隐式实例(使用implicit defs而不是vals),并且任何给定类型都可以有多个实例,这使您可以选择行为代码不同点的范围内的不同实例.
你不能用C++方式做的原因是Scala泛型不涉及不同类型参数的代码生成(@specialized除此之外,因为它不能做你想要的).因此,说"嘿编译器,当你在那个位置看到一个Int,而不是从通用模板生成代码时,使用这个特定的代码"是没有意义的.