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メソッド内の が十分に長く存続しないことです。Fileでは、a を返して呼び出し側で使用できるようにするにはどうすればよいでしょうか?

古い質問

次のコードは、Rust ライブラリssh2の SFTP 接続に必要なすべてのデータを含む構造体の作成を試みます。構造体は as として与えられSftpClientnew関数はそれを生成する必要があります。

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与えられているので、なぜ長生きしないのかわかりません。私の理解では、彼らは落とされるまで幸せな生活を送るべきです.SftpClientSftpSftpClient

4

0 に答える 0