Rust:ssh2 ::会话生存期错误

时间:2015-08-30 15:40:46

标签: rust lifetime libssh2 borrow-checker

更新:相关问题有助于了解问题所在而非解决问题。

我现在明白,我无法将Sftp对象与Session保存在同一个结构中,并且在需要时更好地生成Sftp。 新守则是:

use std::io::prelude::*;
use std::io;
use ssh2;
use std::net::TcpStream;
use std::net::ToSocketAddrs;
use std::path::Path;
use ssh2::{Session, Sftp, File};

pub enum SftpClientError {
    Ssh(ssh2::Error),
    Io(io::Error)
}

pub struct SftpClient {
    session: Session,
    stream: TcpStream,
}

impl SftpClient {
    pub fn new<A: ToSocketAddrs>(addr: A) -> SftpClient {
        let mut s = Session::new().unwrap();
        let mut t = TcpStream::connect(addr).unwrap();

        s.handshake(&t).unwrap();

        SftpClient {
            session: s,
            stream: t,
        }
    }

    pub fn get_file(&self, path: &Path) -> Result<(File, Sftp), SftpClientError>  {
        let sftp = self.session.sftp().unwrap();
        let file = match sftp.create(path) {
            Ok(o) => o,
            Err(e) => return Err(SftpClientError::Ssh(e)),
        };

        Ok((file, sftp))
    }
}

哪个输出稍有不同的错误。新错误是sftp方法中的get_file,活动时间不够长。 那么我怎样才能让它活得足够长以返回File并在呼叫方使用它?

旧问题

以下代码尝试创建一个结构,其中包含生锈库ssh2中SFTP连接的所有必需数据。结构以SftpClient给出,new函数应该生成它。

use std::io::prelude::*;
use std::io;
use std::net::TcpStream;
use std::net::ToSocketAddrs;
use ssh2::{Session, Sftp, File};

pub struct SftpClient<'s> {
    session: Session,
    stream: TcpStream,
    connection: Sftp<'s>,
}

impl<'s> SftpClient<'s> {
    pub fn new<A: ToSocketAddrs>(addr: A) -> SftpClient<'s> {
        let mut s = Session::new().unwrap();
        let mut t = TcpStream::connect(addr).unwrap();

        s.handshake(&t).unwrap();

        let sftp = s.sftp().unwrap();
        SftpClient {
            session: s,
            stream: t,
            connection: sftp,
        }
    }
}

当我编译此代码时,rustc会抱怨s的活动时间不够长:

src/sftp.rs:20:20: 20:21 error: `s` does not live long enough
src/sftp.rs:20         let sftp = s.sftp().unwrap();
                                  ^
src/sftp.rs:14:61: 26:6 note: reference must be valid for the lifetime 's as defined on the block at 14:60...
src/sftp.rs:14     pub fn new<A: ToSocketAddrs>(addr: A) -> SftpClient<'s> {
src/sftp.rs:15         let mut s = Session::new().unwrap();
src/sftp.rs:16         let mut t = TcpStream::connect(addr).unwrap();
src/sftp.rs:17 
src/sftp.rs:18         s.handshake(&t).unwrap();
src/sftp.rs:19 
               ...
src/sftp.rs:15:45: 26:6 note: ...but borrowed value is only valid for the block suffix following statement 0 at 15:44
src/sftp.rs:15         let mut s = Session::new().unwrap();
src/sftp.rs:16         let mut t = TcpStream::connect(addr).unwrap();
src/sftp.rs:17 
src/sftp.rs:18         s.handshake(&t).unwrap();
src/sftp.rs:19 
src/sftp.rs:20         let sftp = s.sftp().unwrap();

我不明白为什么s不能活得足够长,因为SftpClient就像Sftp结构一样。根据我的理解,他们应该过着幸福的生活,直到SftpClient被放弃。

0 个答案:

没有答案