Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 夹在一辈子和一个外国金融机构的地方之间_Rust_Ffi_Lifetime - Fatal编程技术网

Rust 夹在一辈子和一个外国金融机构的地方之间

Rust 夹在一辈子和一个外国金融机构的地方之间,rust,ffi,lifetime,Rust,Ffi,Lifetime,我夹在两个不同的问题/错误之间,无法想出一个像样的解决方案。任何帮助都将不胜感激 上下文、FFI和调用大量C函数,并将C类型包装到rust结构中 第一个问题是 这迫使我使用&references进行所有结构包装,如中所示: pub struct CassResult<'a> { result:&'a cql_ffi::CassResult } 否则代码如下: pub fn first_row(&self) -> Result<CassRow,Ca

我夹在两个不同的问题/错误之间,无法想出一个像样的解决方案。任何帮助都将不胜感激

上下文、FFI和调用大量C函数,并将C类型包装到rust结构中

第一个问题是

这迫使我使用&references进行所有结构包装,如中所示:

pub struct CassResult<'a> {
    result:&'a cql_ffi::CassResult
}
否则代码如下:

pub fn first_row(&self) -> Result<CassRow,CassError> {unsafe{
    Ok(CassRow{row:*cql_ffi::cass_result_first_row(self.result)})
}}
所以,我继续使用生命周期管理的引用来包装所有内容,在我尝试实现迭代器之前,一切都不可怕。在这一点上,我看不到任何办法

因此,考虑到这两个相互冲突的问题,我完全陷入困境,无法找到任何方法围绕FFI迭代器之类的构造实现适当的rust迭代器

编辑:根据谢普的建议,我得到:

pub struct CassResult {
    pub result:cql_ffi::CassResult
}


有没有办法让这种模式起作用?这在FFI包装代码中反复出现。

只有一个部分答案:使用

我在使用C mysql API进行生锈绑定时也遇到过类似的问题。结果是这样的代码,而不是语法的本机代码:


回答我自己的问题。唯一合适的答案是绕过原始版本,但正如PowersGang评论的那样,现在正确的方法是使用:std::ptr::read,因此使用这种方法,没有ICE,希望能够取得进展。

如果您提供了您想要使用的完整代码,就更容易对此进行评论。我怀疑堆栈溢出也不是解决这个问题的好地方;我建议您尝试Rust IRC频道。作为解决第一个bug的方法,您可能需要先查看参考资料。不要使用foo:T=safe{*ptr},而是尝试使用foo:&mut T=safe{&mut*ptr}为清晰起见添加的冗余类型注释。我想我遇到了类似的情况,在我的特殊情况下,我能够解决它,通过为类型实现副本是有意义的,我想对您来说,这就是casseult.Ding。考虑到我的困境,我相信Shep的ICE解决方案是理想的答案。FWIW,正在进行的工作代码是否完全正确。添加了一个编辑。虽然我真的希望ICE得到修复,但我确实喜欢流式迭代器的想法。我会尝试一下,如果这个答案有效的话,我会接受的。tyvm
error: internal compiler error: this path should not cause illegal move
Ok(CassRow{row:*cql_ffi::cass_result_first_row(self.result)})
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
method next has an incompatible type for trait: expected concrete lifetime, found bound lifetime parameter
pub struct CassResult {
    pub result:cql_ffi::CassResult
}
pub fn get_result(&mut future:future) -> Option<CassResult> {unsafe{
    let result:&cql_ffi::CassResult = &*cql_ffi::cass_future_get_result(&mut future.future);
    Some(CassResult{result:*result})
}}
error: cannot move out of borrowed content
Some(CassResult{result:*result}
let query = format!("SELECT id_y, value FROM table_x WHERE id = {}", id_x);
let res = try!(db::run_query(&query));
streaming_for!( row, res.into_iter(), {
    let id_y: usize = try!(row.convert::<usize>(0));
    let value: f64 = try!(row.convert::<f64>(1));
});
/// Res has an attached lifetime to guard an internal pointer.
struct Res<'a>{ p: *mut c_void }
/// Wrapper created by into_iter()
struct ResMoveIter<'a>{ res: Res<'a> }
impl<'a> /*StreamingIterator<'a, Row<'a>> for*/ ResMoveIter<'a>{
    /// Get the next row, or None if no more rows
    pub fn next(&'a mut self) -> Option<Row<'a>>{
        ...
    }
}
#[unsafe_destructor]
impl<'a> Drop for Res<'a>{
    fn drop(&mut self){
        ...
    }
}