Я пару раз пытался решить проблему в функции 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");
Это связано с полем 'dir: Option <&'a Path>' 'ProcessOptions <'a>'. Структуры, содержащие ссылки, не могут быть «Отправить». Остается вопрос, почему это '& Path', а не' Path'. Ответ на этот вопрос заключается в том, что 'std :: io :: process :: ProcessConfig' использует в основном ссылки, в том числе' cwd: Option <&str> ', который может поступать из' ProcessOptions.dir'. –
ОК. Спасибо за объяснение. Я вижу, почему эти ограничения установлены, но это делает его наземным мином при попытке выполнить многопоточное/запрограммированное программирование. – quux00
@ quux00: На самом деле, я бы сказал, что это будет наземная мина на C++ (так как она иногда взрывается в вашем лице), в то время как в Rust все, что вы получаете, является суровым отказом от продолжения. –