在Scala中通过隐式函数调用函数

在Scala中通过隐式函数调用函数,scala,implicit,Scala,Implicit,在Scala中,如果我有一个名为Vector2D的类,我想对它进行一些隐式转换。目前,我将此函数放置在Vector2D中:隐式def fromFloatTuple(tuple:(Float,Float)):Vector2D=new Vector2D(tuple.\u 1,tuple.\u 2) 我可以成功地执行以下操作valx:Vector2D=(1f,1f)。但是,我不能执行以下操作:valx:Float=(1f,1f).length()(显然,长度是为Vector2D定义的)。为什么这不起作

在Scala中,如果我有一个名为
Vector2D
的类,我想对它进行一些隐式转换。目前,我将此函数放置在
Vector2D
中:
隐式def fromFloatTuple(tuple:(Float,Float)):Vector2D=new Vector2D(tuple.\u 1,tuple.\u 2)

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

现在我想起来了,我怎么能让这个函数也接受其他数值类型,而不为所有数值类型的每个组合生成一个函数(对于2D向量来说不是问题,但是对于4D向量来说是不干净的)。

:

对于更一般的情况,您可能需要查看


当您有目标类型或源类型时,编译器会查找
Vector2D
;在
valx:Float=(1f,1f).length()中,它没有。为隐式转换寻找所有可能的类型会大大降低编译速度,Scala编译器已经很慢了(尽管有所改进)

您需要通过导入将
fromFloatTuple
引入范围:

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

虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,仅链接的答案可能无效。-谢谢你的反馈!对于类似于
(1f,1)
的情况,这是失败的,因为它们是不同的数字类型。不过,一个解决办法是声明多个泛型参数。啊,我误解了-你想每个参数有不同的类型吗?我怀疑这会有那么容易,因为Scala不会在一行中执行多个隐式搜索。
  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())
}
import your.package.Vector2D._ // or just fromFloatTuple instead of _