更新:相关问题有助于理解问题所在,但不能解决问题。
我现在明白我不能将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
方法中,寿命不够长。那么我怎样才能让它活得足够长以返回 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
被淘汰。