【问题标题】:How to make Scalacheck arbString generate only readable Strings?如何让 Scalacheck arbString 只生成可读的字符串?
【发布时间】:2016-06-13 15:29:30
【问题描述】:

Postgres 不接受 Scalacheck arbString 生成的所有类型的符号。有没有办法用 Scalacheck 生成人类可读的字符串?

【问题讨论】:

    标签: scala scalacheck


    【解决方案1】:

    如果您查看the Gen object,您会看到一些生成器,包括alphaCharidentifier

    scala> import org.scalacheck.Gen._
    import org.scalacheck.Gen._
    
    scala> identifier.sample
    res0: Option[String] = Some(vxlgvihQeknhe4PolpsJas1s0gx3dmci7z9i2pkYlxhO2vdrkqpspcaUmzrxnnb)
    
    scala> alphaChar.sample
    res1: Option[Char] = Some(f)
    
    scala> listOf(alphaChar).sample
    res2: Option[List[Char]] = Some(List(g, n, x, Y, h, a, c, e, a, j, B, d, m, a, r, r, Z, a, z, G, e, i, i, v, n, Z, x, z, t))
    
    scala> listOf(alphaChar).map(_.mkString).sample
    res3: Option[String] = Some(oupwJfqmmqebcsqbtRxzmgnJvdjzskywZiwsqnkzXttLqydbaahsfrjqdyyHhdaNpinvnxinhxhjyzvehKmbuejaeozytjyoyvb)
    

    【讨论】:

    • 谢谢!正是我想要的!
    【解决方案2】:

    您可以通过添加案例类ReadableChar(c: Char) 并为其定义一个任意实例来实现。也许像

    case class ReadableChar(c: Char)
    implicit val arbReadable: Arbitrary[ReadableChar] = Arbitrary {
      val legalChars = Range('a', 'z').map(_.toChar)
      for {
        c <- Gen.oneOf(legalChars)
      } yield ReadableChar(c)
    }
    

    然后您可以使用Arbitrary[Array[ReadableChar]] 的实例生成可读字符数组,通过.map(_.c).toString 将其转换为字符串。

    如果您想通过允许包含的字符来定义“人类可读的字符串”,则此方法有效。如果您需要额外的限制,您可以编写第二个案例类 ReadableString(s: String) 并为其定义一个 Arbitrary 的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多