更新:関連する質問は、問題が何であるかを理解するのに役立ちましたが、解決にはなりませんでした。
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
では、a を返して呼び出し側で使用できるようにするにはどうすればよいでしょうか?
古い質問
次のコードは、Rust ライブラリssh2の SFTP 接続に必要なすべてのデータを含む構造体の作成を試みます。構造体は as として与えられ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