Closed yatesco closed 2 years ago
I see that Arbitrary is implemented on std::ops::Range (https://docs.rs/quickcheck/1.0.3/quickcheck/trait.Arbitrary.html#impl-Arbitrary-for-Range%3CT%3E) but I can't get the syntax right.
The implementation of Arbitrary
you're referring to will generate ranges themselves, not items in that range. For example, you'll get values like (0..17)
rather than, say, 5
.
Currently, AFAIK the only choice you (currently) have is to generate a value of an appropriate type and then restrict/transform that value to fit into your target range. For example:
let value: u32 = Arbitrary::arbitrary(g) % 10;
Plus maybe applying a few tricks to make the distribution completely uniform, but that's usually not necessary.
Should I expect something like Arbitrary::<(0..10)>generate(g) or Arbitrary::generate<(0..10)>(g) to work? I assume (0..10) becomes an actual type?
Not sure what you did want to express. Arbitrary::generate<(0..10)>(g)
would make sense if Arbitrary::generate
would be a generic function (and generic over a std::ops::Range
value rather than a type), but it's not. If you want to invoke a function declared in a trait (e.g. Arbitrary::arbitrary
) for a specific type T
implementing that trait, you just substitute that type for the trait name (e.g. u32::arbitrary()
). For example, you can write the above snippet as:
let value = u32::arbitrary(g) % 10;
https://doc.rust-lang.org/book/appendix-02-operators.html#non-operator-symbols provides more details (table B-3 and B-4 at the time of writing).
thanks @neithernut - my poor brain was getting befuddled and you've clarified it for me perfectly. I'm currently doing the (i32::arbitrary(g) % 9) + 1
because I want 1..=10
trick so will continue with that.
Hi - I am sure I am missing something obvious, but how can I ask for a number within a Range? I see that
Arbitrary
is implemented onstd::ops::Range
(https://docs.rs/quickcheck/1.0.3/quickcheck/trait.Arbitrary.html#impl-Arbitrary-for-Range%3CT%3E) but I can't get the syntax right.Should I expect something like
Arbitrary::<(0..10)>generate(g)
orArbitrary::generate<(0..10)>(g)
to work? I assume(0..10)
becomes an actual type?I know I'm missing something but I can't figure it out :-)
Thanks