Rust 如何将套接字作为参数传递给线程中正在调用的函数?

Rust 如何将套接字作为参数传递给线程中正在调用的函数?,rust,Rust,我将有多个功能,都需要访问一个主插座 是否最好: 将此套接字传递给需要访问它的每个函数 具有全局可访问的套接字 有人能举例说明最好的方法吗 我来自Python/Nim的背景,这样的事情很容易完成 编辑: 如何将套接字作为参数传递给线程中正在调用的函数。 前 更新问题的答案 我们可以使用: 原始答案 如果你能帮助的话,通常(比如说99.9%的时候)拥有任何全局可变状态都是个坏主意。照你说的做:将套接字传递给需要它的函数 use std::io::{self, Write}; use std::ne

我将有多个功能,都需要访问一个主插座

是否最好:

  • 将此套接字传递给需要访问它的每个函数
  • 具有全局可访问的套接字
  • 有人能举例说明最好的方法吗

    我来自Python/Nim的背景,这样的事情很容易完成

    编辑: 如何将套接字作为参数传递给线程中正在调用的函数。 前

    更新问题的答案 我们可以使用:

    原始答案 如果你能帮助的话,通常(比如说99.9%的时候)拥有任何全局可变状态都是个坏主意。照你说的做:将套接字传递给需要它的函数

    use std::io::{self, Write};
    use std::net::TcpStream;
    
    fn send_name(stream: &mut TcpStream) -> io::Result<()> {
        stream.write(&[42])?;
        Ok(())
    }
    
    fn send_number(stream: &mut TcpStream) -> io::Result<()> {
        stream.write(&[1, 2, 3])?;
        Ok(())
    }
    
    fn main() {
        let mut stream = TcpStream::connect("127.0.0.1:31337").unwrap();
    
        let r = send_name(&mut stream).and_then(|_| send_number(&mut stream));
    
        match r {
            Ok(..) => println!("Yay, sent!"),
            Err(e) => println!("Boom! {}", e),
        }
    }
    

    这些都不是真正特定于锈菌的,它们是普遍适用的编程实践

    多谢各位。现在,如果我可以进一步讨论这个问题,如何将套接字传递给线程中的函数:)@user3746744我不确定您的确切意思,但我只想在线程创建时将整个套接字移动到线程中。然后线程拥有套接字,类似于
    GameService
    struct在答案中拥有套接字的方式。如果这还不清楚,您应该阅读,然后根据需要提出新的澄清问题。现在我真的考虑过了,我可能可以使用该结构从线程访问套接字。
    use std::io::Read;
    use std::net::{TcpStream, Shutdown};
    use std::thread;
    
    fn main() {
        let mut stream = TcpStream::connect("127.0.0.1:34254").unwrap();
        let stream2 = stream.try_clone().unwrap();
    
        let _t = thread::spawn(move || {
            // close this stream after one second
            thread::sleep_ms(1000);
            stream2.shutdown(Shutdown::Read).unwrap();
        });
    
        // wait for some data, will get canceled after one second
        let mut buf = [0];
        stream.read(&mut buf).unwrap();
    }
    
    use std::io::{self, Write};
    use std::net::TcpStream;
    
    fn send_name(stream: &mut TcpStream) -> io::Result<()> {
        stream.write(&[42])?;
        Ok(())
    }
    
    fn send_number(stream: &mut TcpStream) -> io::Result<()> {
        stream.write(&[1, 2, 3])?;
        Ok(())
    }
    
    fn main() {
        let mut stream = TcpStream::connect("127.0.0.1:31337").unwrap();
    
        let r = send_name(&mut stream).and_then(|_| send_number(&mut stream));
    
        match r {
            Ok(..) => println!("Yay, sent!"),
            Err(e) => println!("Boom! {}", e),
        }
    }
    
    use std::io::{self, Write};
    use std::net::TcpStream;
    
    struct GameService {
        stream: TcpStream,
    }
    
    impl GameService {
        fn send_name(&mut self) -> io::Result<()> {
            self.stream.write(&[42])?;
            Ok(())
        }
    
        fn send_number(&mut self) -> io::Result<()> {
            self.stream.write(&[1, 2, 3])?;
            Ok(())
        }
    }
    
    fn main() {
        let stream = TcpStream::connect("127.0.0.1:31337").unwrap();
        let mut service = GameService { stream: stream };
    
        let r = service.send_name().and_then(|_| service.send_number());
    
        match r {
            Ok(..) => println!("Yay, sent!"),
            Err(e) => println!("Boom! {}", e),
        }
    }