2014-10-04 1 views
0

Я ожидал, что это работает:Почему ржавчина требует, чтобы передаваемые черты явно помечены как «Отправить»?

trait Foo: Send { fn ok(&self) -> int; } 
struct IsFoo; 
impl Foo for IsFoo { fn ok(&self) -> int { return 1; } } 
struct Bar { v: Option<Box<Foo>> } 

fn main() { 
    let bar = Bar { v: Some(box IsFoo as Box<Foo>) }; 
    spawn(proc() { 
    match bar.v { 
     Some(ref foo) => { 
     assert!(foo.ok() == 1); 
     } 
     _ => { fail!("Unreachable"); } 
    } 
    }); 
} 

манеж: http://is.gd/ORxeRL

... но это не так.

Вместо этого компилятор неловко требует отправки признака явно устанавливать на ссылки признака:

struct Bar { v: Option<Box<Foo + Send> + Send> } <--- + Send + Send much? 

fn main() { 
    let bar = Bar { v: Some(box IsFoo as Box<Foo + Send>) }; <--- 

Foo Foo является: Отправить; так что ... я, очевидно, хочу, чтобы он был отправимым. Зачем требовать явные + отправки?

ie. Это ошибка компилятора?

Или есть какое-то оправдание для требовательности этого многословия?

+0

Вам не нужно 'Option + Отправить>', но только 'Option >' в определении структуры. – Levans

ответ

2

Да, это ошибка, например #15155.

(В будущем, это был первый результат, когда searching for trait object send в репозитории rust-lang/rust, часто бывает, что перед запуском встретилось поведение с ошибкой/ошибкой, поэтому вы можете сэкономить время и путаницу, сделав быстрый поиск .)

Смежные вопросы