В документации по быстрой проверке Rust отмечается, что для любого типа реализации Arbitrary
Они также должны быть доступными для отправки и статическими, поскольку каждый тест запускается в своем собственном потоке с использованием thread::Builder::spawn, что требует статических границ Send +.
Если мне нужно сгенерировать данные для структуры, содержащей ссылку, как мне это сделать? Например:
#![cfg_attr(test, feature(plugin))]
#![cfg_attr(test, plugin(quickcheck_macros))]
#[cfg(test)]
extern crate quickcheck;
#[cfg(test)]
use quickcheck::{Arbitrary,Gen};
#[allow(dead_code)]
#[derive(Debug,Clone)]
pub struct C<'a> {
s: &'a str,
b: bool
}
#[cfg(test)]
impl<'a> Arbitrary for C<'a> {
fn arbitrary<G: Gen>(g: &mut G) -> C<'a> {
let s = g.gen::<&str>();
C{s: s, b: (s.len() > 0)}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[quickcheck]
fn len_checks_out(c: C) -> bool {
(c.s.len() > 0) == c.b
}
}
терпит неудачу с
cargo test
Compiling qcq v0.1.0 (file:///Users/blt/projects/us/troutwine/qcquestion)
src/lib.rs:18:10: 18:19 error: the type `C<'a>` does not fulfill the required lifetime [E0477]
src/lib.rs:18 impl<'a> Arbitrary for C<'a> {
^~~~~~~~~
note: type must outlive the static lifetime
error: aborting due to previous error
Build failed, waiting for other jobs to finish...
error: Could not compile `qcq`.
Это несколько надуманный пример, но он в том же духе, что и исходная проблема. Аннотации времени жизни работают, но тестируются.
'static
означает, что реализацииArbitrary
не могут содержать заимствованные данные. Это ограничение может быть снято, как толькоpanic::recover
(или любое другое имя, которое оно получит) будет стабилизировано, но я не уверен. - person BurntSushi5   schedule 03.04.2016impl Arbitrary for C<'statc>
не сработает? В любом случае экземплярArbitrary
для нестатических данных в любом случае не имеет особого смысла. Рассмотрим вызовg.gen::<&str>()
, который не будет компилироваться, поскольку нет реализацииRand
для&str
(что это может быть за &str, кроме статической строки?). - person Mar   schedule 04.04.2016parse . format
должно быть идентификатором, немного копируя синтаксис Haskell. Вам нужно генерировать произвольные экземпляры структур, которые содержат &str. Однако предположим, что это в корне ошибочно, так как они все равно не будут одними и теми же ссылками. - person troutwine   schedule 04.04.2016