gpt4 book ai didi

scala - 隐含的太多了!

转载 作者:行者123 更新时间:2023-12-04 15:54:14 25 4
gpt4 key购买 nike

我正在编写一个 2D Vector 类,其声明如下所示:

case class Vec2(x:Float, y:Float) extends (Float, Float)(x, y) {

def +(v:Vec2) = Vec2(v.x+x, v.y+y)
//Subtract, dot product, projection, etc.
...
...
}

我希望能够写出像 Vec2(3, 7) + (2, 9) 这样的东西,所以我写了

scala> implicit def ii2v2(i:(Int, Int)) = Vec2(i._1, i._2)
ii2v2: (i: (Int, Int))org.zhang.lib.misc.Vec2

scala> Vec2(2, 6) + (3, 1)
res25: org.zhang.lib.misc.Vec2 = (5.0,7.0)

太棒了。但是如果我尝试 Vec2(3, 7) + (2.6f, 9.3f) 隐式将不起作用,因为 (Float, Float) 不匹配 (整数,整数)。我想到的唯一解决方案是为 (Int,Int)、(Int, Float)、(Float, Int) 和 (Float, Float) 编写四个隐含函数。

当您尝试考虑 double 或编写 Vec3 类时,问题会变得很荒谬。有没有解决的办法?我可以 Vec2-ify 一切,但我的一部分真的想添加一个 (Int, Int) 到 Vec2 :)

最佳答案

这样做:

implicit def ii2v2[T: Numeric, U: Numeric](i:(T, U)) = {
import Numeric.Implicits._
Vec2(i._1.toFloat, i._2.toFloat)
}

这使用上下文边界告诉编译器在数值类型存在的范围内寻找 Numeric[T]。 import Numeric.Implicits._ 从 2.9 开始可用,允许编写 toFloat

在 2.8 上你可以这样写:

implicit def ii2v2[T, U](i:(T, U))(implicit num1: Numeric[T], num2: Numeric[U]) = {
Vec2(num1.toFloat(i._1), num2.toFloat(i._2))
}

请参阅另一个类似的问题:Writing a generic mean function in Scala

关于scala - 隐含的太多了!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6852782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com