如何使Scalacheck arbString只生成可读的字符串?

时间:2016-06-13 06:38:20

标签: scala scalacheck

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

2 个答案:

答案 0 :(得分: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的实例。

答案 1 :(得分:2)

如果您查看the Gen object,可以看到一些生成器,包括identifierscala> 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)

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
int main() {
    cv::VideoCapture vcap("test.mp4");
    cv::Mat image;
//    const string address = "rtsp://root:pass@192.168.0.90/axis-media/media.amp?camera=1";
//    if(!vcap.open(address)){
//      std::cout << "Error opening video stream or file " << std::endl;
//      return -1;
//    }
    for(;;){
        if(!vcap.read(image)){
            std::cout << "No frame" << std::endl;
            cv::waitKey(0);
        }
        cv::imshow("Display", image);
        cv::waitKey(1);
    }
    return 0;
}