我正在通过阅读 ScalaCheck 的代码来学习 Scala,并发现许多组合器的后缀是 suchThat
.然而,在很多情况下,这样的事情看起来并不是很有必要。我想知道为什么它们是这样设计的。这是摘自 GitHub 的一些内容:
Example 1.
/** Picks a random value from a list */
def oneOf[T](xs: Seq[T]): Gen[T] =
choose(0, xs.size-1).map(xs(_)).suchThat(xs.contains)
map
从 xs 中选取一个元素,因此 xs.contains
似乎多余。——
Example 2.
def containerOfN[C[_],T](n: Int, g: Gen[T])
(implicit evb: Buildable[T,C], evt: C[T] => Traversable[T]): Gen[C[T]] =
sequence[C,T](Traversable.fill(n)(g)) suchThat { c =>
c.size == n && c.forall(g.sieveCopy)
}
为什么是
c.size == n
需要,鉴于成功 sequence
将返回 n 的长度?——
Example 3.
/** Generates a string of alpha characters */
def alphaStr: Gen[String] =
listOf(alphaChar).map(_.mkString).suchThat(_.forall(_.isLetter))
生成的字符串将由
alphaChar
的列表组成这是从大写和小写字母中选择的。为什么我们需要一个 suchThat
再次检查isLetter?——
最佳答案
见 https://github.com/rickynils/scalacheck/commit/2d92eb61a89a8ec2e16d0af8599f9baafc9b5418
基本上,这是 ScalaCheck 测试用例简化所需要的,以了解生成的值最初具有的界限。
关于scala - ScalaCheck 中的这种用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301666/