2014-02-07 1 views
3

Я пару раз пытался решить проблему в функции spawn (чтобы создать новый поток/задачу), и компилятор сообщит мне error: cannot capture variable of type "blah blah", which does not fulfill "Send", in a bounded closure.В Rust, есть ли способ изменить структуру/тип, который будет «Отправить»?

Есть ли способ трансформировать тип, способный выполнить «Отправить» или установленный на основе некоторого набора правил?

Например, я могу легко реализовать ToStr черту, используя директиву, как это:

#[deriving(ToStr, Rand)] 
struct Point { 
    x: int, 
    y: int, 
} 

Могу ли я сделать что-то подобное для Send черты? Или «добрые» черты трактуются по-разному?

Вот конкретный пример этой проблемы - есть ли способ преодолеть это?

fn create_process_options(cmdinfo: &CmdInfo) -> (ProcessOptions, Option<FileDesc>) { 
// ... omitted 
} 

// "po" is of type std::run::ProcessOptions 
let (po, filedesc_opt) = create_process_options(&cmdinfo); 
spawn(proc() { 
    let mut ps = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn"); 
    ps.finish(); 
}); 

Compiler ошибка:

error: cannot capture variable of type `std::run::ProcessOptions<>`, which does not fulfill `Send`, in a bounded closure 
let mut process = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn"); 
                   ^~ 
note: this closure's environment must satisfy `Send` 
let mut process = Process::new(cmdinfo.program, cmdinfo.args, po).expect("darn"); 
+3

Это связано с полем 'dir: Option <&'a Path>' 'ProcessOptions <'a>'. Структуры, содержащие ссылки, не могут быть «Отправить». Остается вопрос, почему это '& Path', а не' Path'. Ответ на этот вопрос заключается в том, что 'std :: io :: process :: ProcessConfig' использует в основном ссылки, в том числе' cwd: Option <&str> ', который может поступать из' ProcessOptions.dir'. –

+1

ОК. Спасибо за объяснение. Я вижу, почему эти ограничения установлены, но это делает его наземным мином при попытке выполнить многопоточное/запрограммированное программирование. – quux00

+0

@ quux00: На самом деле, я бы сказал, что это будет наземная мина на C++ (так как она иногда взрывается в вашем лице), в то время как в Rust все, что вы получаете, является суровым отказом от продолжения. –

ответ

4

Отправить ржавчина Kind, другие вещи, которые вы упомянули, являются Черты характера. Хотя оба могут использоваться для привязки дженериков, они на самом деле совершенно разные. Вы должны сделать выбор в Trait, но какие типы типов выведены на основе их содержимого - помимо изменения содержимого вы не можете изменить тип типа.

Для большинства видов правило «тип X имеет вид Y, если все члены X имеют вид Y».

В этом случае, поскольку при отправке требуется, чтобы вы выполнили 'static, это означает, что они не содержат ссылок, не относящихся к 'static. Поскольку ProcessOptions содержит нестатический срок службы Option<&'a Path>, как описано в его комментарии Крис Морган, ProcessOptions не выполняет отправки.