Re[22]: Развитие Rust
От: cl-user  
Дата: 10.02.14 12:21
Оценка:
Почти всё заработало. Остался один косяк.
Сейчас есть вот такой код:
        pub type Callback<'a> = 'a |~[~str]|: -> ~str;
        ...
        pub fn registr_callback(&mut self, name: ~str, callback: Callback<'a>) {
            self.callbacks.insert(name.clone(), callback); // вставка в хеш-таблицу
            unsafe {
                let callback = self.callbacks.find(&name); // а здесь достаём указатель...
                match callback {
                    Some(cc) => {
                        name.with_c_str(|s| {
                                 // чтобы вот здесь передать
                                _ext_createcommand(to_unsafe_ptr(cc),...);
                            });
                    }
                    None => {}
                }
            }
        }

И никак не могу из этого костыля сделать так:
        pub fn registr_callback(&mut self, name: ~str, callback: Callback<'a>) {
            self.callbacks.insert(name.clone(), callback); // вставка в хеш-таблицу
            unsafe {
                        name.with_c_str(|s| {
                                // вот здесь передаём ссылку на регистрацию
                                _ext_createcommand(to_unsafe_ptr(&callback),...);
                            });
                    }
        }

всё время получаю
note: `callback` moved here because it has type `'a |~[~str]| -> ~str`, which is 
a non-copyable stack closure (capture it in a new closure, e.g. `|x| f(x)`, to override)


И будет ли правильным, если я не буду клонировать ~str, а получу &str и вставлю в хеш-таблицу name.into_owned()?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.