Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala将隐式函数应用于集合_Scala_Collections_Implicit - Fatal编程技术网

Scala将隐式函数应用于集合

Scala将隐式函数应用于集合,scala,collections,implicit,Scala,Collections,Implicit,编辑:我正在使用Scala 2.9.2 在Scala中,我定义了一个自定义类,它封装了一个双精度: class DoubleWrap( d : Double ) { def double( ) = d * 2 } 以及从Double到DoubleWrap的隐式转换: implicit def wrapDouble( d : Double ) = new DoubleWrap( d ) 这允许我执行以下操作: scala> 2.5.double res0: Double = 5.

编辑:我正在使用Scala 2.9.2

在Scala中,我定义了一个自定义类,它封装了一个双精度:

class DoubleWrap( d : Double ) {
    def double( ) = d * 2
}
以及从Double到DoubleWrap的隐式转换:

implicit def wrapDouble( d : Double ) = new DoubleWrap( d )
这允许我执行以下操作:

scala> 2.5.double
res0: Double = 5.0
scala> 2.double
res1: Double = 4.0
但是,由于Scala中存在从Int到Double的隐式转换,因此我还可以执行以下操作:

scala> 2.5.double
res0: Double = 5.0
scala> 2.double
res1: Double = 4.0
使用
map

scala> List( 1.0, 2.0, 3.0 ).map( _.double )
res2: List[Double] = List(2.0, 4.0, 6.0)
但是,如果尝试将该函数应用于整数集合的所有元素,则该函数无效:

scala> List( 1, 2, 3 ).map( _.double )
<console>:10: error: value double is not a member of Int
          List( 1, 2, 3 ).map( _.double )
scala>List(1,2,3).map(u2;.double)
:10:错误:值double不是Int的成员
列表(1,2,3).map(u.double)

有人知道为什么会这样吗?

在scala中,隐式转换不是自动链接的。换句话说,编译器将寻找一个单个隐式转换,使代码有意义,它永远不会尝试应用两个(或更多)连续的隐式转换

在您的示例中,您可以执行
2.double
Predef
中存在从
double
Int
的隐式转换无关。 作为证明,请在REPL中尝试以下内容:

scala> val i: Int = 2
i: Int = 2

scala> i.double
<console>:13: error: value double is not a member of Int
              i.double

这是一个很快就会出现的命令。

奇怪,这在2.8中起作用,您可以在simplyscala.com上尝试。我假设答案是被解释为
(1.)double
-即使用尾随符的命令。表示双精度和后缀法的应用。但您的测试表明情况并非如此(并且没有特性/弃用警告,我将对此进行解释)。这确实令人困惑。是的,我考虑过这种可能性,但事实上(在scala 2.10中)你可以看到
2.double
编译时没有警告,而
2.0double
发出警告说我们应该导入
scala.language.postfixOps
。这非常清楚地表明,第一个版本没有被视为后缀运算符,因此点不是文字的一部分。