0

更新:相关问题有助于理解问题所在,但不能解决问题。

我现在明白我不能将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))
    }
}

输出略有不同的错误。新的错误是sftpget_file方法中,寿命不够长。那么我怎样才能让它活得足够长以返回 aFile并在调用方使用它呢?

老问题

以下代码尝试在 rust 库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被淘汰。

4

0 回答 0