我正在使用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。问题确实消失了。
答案 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.value
(object Gen
,而不是trait Gen[+T]
)隐含用于在(匿名类实现)trait Gen[T]
的实例中包装任意值(其中T
1}}是从Gen.Params
到应用Gen.value
的参数的函数。 Gen.sample
是trait Gen[T]
的一种方法,它调用其(具体的Gen
子类)apply
方法来获取合成值。
可悲的是,仔细观察后,我不得不承认,当object Gen
的其他成员未导入时,我不明白为什么代码不起作用。