更新:相关问题有助于了解问题所在而非解决问题。
我现在明白,我无法将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
被放弃。