我有一个类型Foo
,其构造函数带有Int
。如何为implicit
定义Arbitrary
Foo
与scalacheck一起使用?
implicit def arbFoo: Arbitrary[Foo] = ???
我想出了以下解决方案,但是根据我的口味,它有点过于“手动”和低级别:
val fooGen = for (i <- Gen.choose(Int.MinValue, Int.MaxValue)) yield new Foo(i)
implicit def arbFoo: Arbitrary[Foo] = Arbitrary(fooGen)
理想情况下,我需要一个更高阶的函数,我只需要插入一个Int => Foo
函数。
我设法将其缩减为:
implicit def arbFoo = Arbitrary(Gen.resultOf((i: Int) => new Foo(i)))
但我仍然觉得必须有一个稍微简单的方法。
答案 0 :(得分:2)
好吧,您可以使用下划线表示法而不是定义整个Foo
- 创建函数(i: Int) => new Foo(i))
:
class Foo(i: Int)
(1 to 3).map(new Foo(_))
这很有效,因为Scala知道Foo
需要Int
,map
映射Int
,所以不需要明确拼写它。
所以这有点短:
implicit def arbFoo = Arbitrary(Gen.resultOf(new Foo(_)))