2010-08-16 78 views
1

我正在使用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。

更新

只需切换到斯卡拉2.8.0.final与ScalaCheck 2.8.0-1.7。问题确实消失了。

回答

3

我刚刚尝试过这与Scala 2.8.0.final和ScalaCheck 1.7建立相同。无论进口的工作,这意味着第二生产线所需的结果都为进口:

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

你用什么版本Scala和ScalaCheck的?

+0

我正在使用Scala 2.7.7final和ScalaCheck 2.7.7-1.6。这是这些版本中的错误吗?我应该升级吗? – lindelof 2010-08-19 20:03:02

+0

它可能是2.7.7的限制,但升级到2.8是一个很大的步骤,所以只有当你准备好了。 – 2010-08-21 23:52:22

+0

@lindelof:2.7是死路一条,没有被维护。我强烈建议升级到2.8 ASAP。这不像你想象的那么重要。 – 2010-08-26 13:41:00

0

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

纠错/澄清:

Gen.value(这是object Gen,不trait Gen[+T])是用于在(实施匿名类)的实例包任意值的隐式trait Gen[T](其中T是一个函数从Gen.Params该参数应用Gen.value)。 Gen.sampletrait Gen[T]的一种方法,它调用其(具体的Gen子类)apply方法来获取合成值。

不幸的是,仔细一看,我不得不承认,我不明白为什么代码在object Gen的其余成员没有导入时不起作用。