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。

更新

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

4

2 回答 2

3

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

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

您使用的是哪个版本的 Scala 和 ScalaCheck?

于 2010-08-17T00:43:08.227 回答
0

简单:您没有导入隐式转换(无论它的名称是什么),您只导入了value从 object调用的东西org.scalacheck.Gen

更正/澄清:

Gen.value(即object Gen, not trait Gen[+T])是用于将任意值包装在(实现的匿名类)的实例中的隐式trait Gen[T](其中T是从应用Gen.Params到参数的函数Gen.value)。Gen.sample是一种trait Gen[T]调用其(具体Gen子类)apply方法来获取合成值的方法。

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

于 2010-08-16T22:49:13.087 回答