2017-07-18 85 views
0

在斯卡拉,如果我有一个名为Vector2D的类,并且我想为其进行一些隐式转换。目前,我已将此功能置于Vector2Dimplicit def fromFloatTuple(tuple: (Float, Float)): Vector2D = new Vector2D(tuple._1, tuple._2)通过Scala中的隐式函数调用函数

我可以成功执行以下操作val x: Vector2D = (1f, 1f)。但是,我不能这样做:val x: Float = (1f, 1f).length()(明显的长度是为Vector2D定义的)。为什么这不起作用,我希望它被转换成类似val x: Float = fromFloatTuple((1f, 1f)).length()的东西,但事实并非如此。我如何在Scala中获得这种效果?

现在我想到了它,我怎样才能让这个函数也接受其他数值类型,而且没有为所有数值类型的每个组合创建一个函数(不是2D矢量的问题,而是对于4维向量不太清楚)。

回答

-1

This is exactly how it is supposed to work

import scala.language.implicitConversions 

object Test { 
    class Vector2D(x: Float, y: Float) { def length(): Float = x + y } 

    implicit def fromFloatTuple(tuple: (Float, Float)): Vector2D = Vector2D(tuple._1, tuple._2) 

    val x: Float = (1f, 1f).length() 

对于你可能想看看scala.math.Numeric更一般的情况下。

case class Vector4D[N](a: N, b: N, c: N, d: N)(implicit n: Numeric[N]) { 
    import n._ 

    def length(): N = a + b + c + d 
    } 

    implicit def c2V4D[N: Numeric](tup: (N, N, N, N)): Vector4D[N] = new Vector4D(tup._1, tup._2, tup._3, tup._4) 

    println(Vector4D(1,2,3,4).length()) 
    println(Vector4D(1,2,3,4.5).length()) 
    println((1,2,3,4).length()) 
} 
+0

虽然此链接可以回答这个问题,最好是在这里有答案的主要部件,并提供链接以供参考。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/ review/low-quality-posts/16747601) – stevieb

+0

感谢您的反馈! –

+0

对于像((1f,1))这样的情况,这是失败的,因为它们具有不同的数字类型。解决方法虽然是声明多个泛型参数。 –

1

当你有目标或源型Vector2D,编译器会在Vector2D同伴对象;在val x: Float = (1f, 1f).length()它没有。寻找所有可能的隐式转换类型会使编译速度变慢,而Scala编译器已经很慢了(尽管有所改进)。

您需要通过导入它带来fromFloatTuple到范围:

import your.package.Vector2D._ // or just fromFloatTuple instead of _