隐含的奇怪行为

时间:2010-08-16 22:26:46

标签: scala implicit

我正在使用Scalacheck库来测试我的应用程序。在该库中有一个Gen对象,它定义了任何对象对该类对象生成器的隐式转换。

,导入Gen._可让您通过隐式转换为sample来调用任何对象上的Gen等方法:

scala> import org.scalacheck.Gen._
import org.scalacheck.Gen._

scala> "foo" sample
res1: Option[java.lang.String] = Some(foo)

在此示例中,隐式Gen.value()应用于"foo",从而产生始终返回Some(foo)的生成器。

但这不起作用:

scala> import org.scalacheck.Gen.value
import org.scalacheck.Gen.value

scala> "foo" sample                   
<console>:5: error: value sample is not a member of java.lang.String
       "foo" sample
             ^

为什么不呢?

更新

我正在使用Scala 2.7.7final和ScalaCheck 2.7.7-1.6。

更新

使用ScalaCheck 2.8.0-1.7切换到Scala 2.8.0.final。问题确实消失了。

2 个答案:

答案 0 :(得分:3)

我刚刚尝试使用Scala 2.8.0.final和ScalaCheck 1.7。两种导入都有效,这意味着第二行产生了两种导入的预期结果:

scala> "foo" sample
res1: Option[java.lang.String] = Some(foo)

您使用的是什么版本的Scala和ScalaCheck?

答案 1 :(得分:0)

简单:您没有导入隐式转换(无论其名称是什么),您只从对象value导入了一个名为org.scalacheck.Gen的内容。

更正/澄清:

Gen.valueobject Gen,而不是trait Gen[+T])隐含用于在(匿名类实现)trait Gen[T]的实例中包装任意值(其中T 1}}是从Gen.Params到应用Gen.value的参数的函数。 Gen.sampletrait Gen[T]的一种方法,它调用其(具体的Gen子类)apply方法来获取合成值。

可悲的是,仔细观察后,我不得不承认,当object Gen的其他成员未导入时,我不明白为什么代码不起作用。