Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Rust和match语句如何分配TcpListener?_Rust - Fatal编程技术网

使用Rust和match语句如何分配TcpListener?

使用Rust和match语句如何分配TcpListener?,rust,Rust,我在业余时间学习生锈,我很难找到这个问题的答案。下面的代码在Stack-O上出现了,它被稍微修改了一下,作为对另一个问题的回答。为了测试的目的,我将第9行和第14行分开,但这不是必需的 我想做的是使用match语句来分配第8/9行的变量,或者将第8/9行和第14行的变量组合起来也很合适 有没有人能告诉我如何使用匹配语句 001 use std::cell::Cell; 002 use std::rt::io::{Writer, Listener, Acceptor}; 003 use st

我在业余时间学习生锈,我很难找到这个问题的答案。下面的代码在Stack-O上出现了,它被稍微修改了一下,作为对另一个问题的回答。为了测试的目的,我将第9行和第14行分开,但这不是必需的

我想做的是使用match语句来分配第8/9行的变量,或者将第8/9行和第14行的变量组合起来也很合适

有没有人能告诉我如何使用匹配语句

001  use std::cell::Cell;
002  use std::rt::io::{Writer, Listener, Acceptor};
003  use std::rt::io::net::tcp::TcpListener;
004  use std::rt::io::net::ip::{SocketAddr, Ipv4Addr};
005
006  fn main() {
007
008      let o_listener =  TcpListener::bind(
009        SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123}).listen();   
010
011      print ("Listener opened : ");
012      std::io::stdin().read_line();      
013
014      let mut o_acceptor = o_listener.unwrap();
015
016      println("listener is ready");
017      loop {
018          let stream = Cell::new(o_acceptor.accept().unwrap());
019          do spawn {
020              let mut stream = stream.take();
021              stream.write(bytes!("Hello World\r\n"));
022          }
023      }
024  }
仅举个例子:例如,使用如下内容,但显然是针对上述问题:

extern mod sqlite;

fn db() {

    let database = match sqlite::open("test.db") {
        Ok(result) => result,
        Err(error) => {
            println(fmt!("Error opening test.db: %?", error));
            return;
        }
    };
编辑更新:发布问题12小时后*

我在Win8上使用0.8

以下是我非常希望解决的问题的一个例子:

001  use std::cell::Cell;
002  use std::rt::io::{Writer, Listener, Acceptor};
003  use std::rt::io::net::tcp::TcpListener;
004  use std::rt::io::net::ip::{SocketAddr, Ipv4Addr};
005
006  fn main() {
007  
008  //   This works :
009  //   let o_listener =  TcpListener::bind(
010  //      SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123}).listen();
011
012  // This doesn't work, and results in compile errors below: 
013  let o_listener =  match TcpListener::bind(
014    SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123}).listen() {
015        Some(result) => result,
016        None => fail!("Failed to open listener")
017    };
018
019  // this works in combination with lines 9/10    
020  let mut o_acceptor = match o_listener {
021      Some(result) => result,
022      None => fail!("Failed to open acceptor.")
023  };
尝试编译上述结果(仅部分):


您应该可以这样做:(我还没有尝试编译它,所以它可能需要一些更改)

选项
,也就是说,只有一个选项“层”需要展开
match
ing两次,或者
match
ing并调用
.unwrap()
(即
Option->T
),实际上是假定类型为
Option
。因此,应采取以下措施:

fn main() {
    let o_acceptor = TcpListener::bind(
       SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123}).listen();

    print ("Listener opened : ");
    std::io::stdin().read_line();

    match o_acceptor {
        Some(_) => println("listener is ready"),
        None => println("listener failed to bind")
    }

    println("possibly starting requests");

    match o_acceptor {
        // this will need to be `Some(ref acpt)` or possibly 
        // `Some(ref mut acpt)` to avoid moving `o_acceptor`
        // if you wish to use it later.
        Some(acpt) => {
            let mut acpt = acpt;
            loop {
                let stream = Cell::new(acpt.accept().unwrap());
                do spawn {
                    let mut stream = stream.take();
                    stream.write(bytes!("Hello World\r\n"));
                }
            }
        }
        None => {
            println("cannot accept because listener failed to bind");
        }
    }
}

谢谢你的回答,埃里克。然而,虽然它“起作用”,但并不能解决问题,因为如果侦听器不绑定,我就有问题了。这就是为什么我说我的例子的第8行和第9行或者8/9和第14行的组合。也许在现实中,它只需要8/9,而使用Some/None似乎对此不起作用。谢谢你的例子,没有告诉我RT7M。@BrianOh,你的问题不清楚:如果
bind
不起作用,那么它将返回
None
。发生这种情况时,您到底想做什么?我尝试在示例的第8/9行中使用“匹配”,但无法使其工作。也许我应该专注于这一点,但正如我所说,我正在努力学习,所以我是一个生锈的初学者。我在win8上使用0.8,当我在8/9上尝试“匹配”时,我得到“test_tcp_008.rs:15:8:15:20错误:不匹配的类型:预期
std::rt::io::net::tcp::TcpAcceptor
但找到
std::option::option
(预期结构std::rt::io::net::tcp::TcpAcceptor但找到enum std::option::option)test_tcp_008.rs:15部分(结果)=>结果,”(仅部分)。我该怎么办?我已经用更多的例子扩展了我的问题。对于我们这些刚刚在这个问题上绊倒的人来说,这是一个更新:恐慌!现在用于代替失败!谢谢,行得通。我还有一个“小”问题。我如何继续而不是失败?IE:而不是“None=>fail!(“未能打开侦听器”)。我不想失败。我想将一个变量(bool)设置为false,以指示我们没有“连接”到端口。这能解决吗?@BrianOh,当变量为
false
时,
o_-acceptor
的值是多少?好吧,dbaupp,恕我直言,我真的不知道在那种情况下o_-acceptor是什么。这是我绝望的、暂时的尝试,想让某些东西起作用。严格地说,我不会创建另一个冗余变量。在另一种语言中,我会测试nil或null,并且知道它没有被赋值。我在这方面到处寻找,想找到一个没有成功的例子。我所看到的仅有的几个稍微相似的例子就是失败了。Rust还有一点需要学习,我更愿意在一些帮助下让一些东西开始工作并逐渐获得知识。@BrianOh,这实际上是
选项的完美地方,因为该选项本质上将“IsThis valid”布尔值包装到类型本身中,因为它被定义为
枚举选项{None,some(T)}
,也就是说,它要么不保存任何内容(
None
,错误状态),要么保存类型为
T
的单个值(
Some(T)
,成功状态)。因此,在本例中,您只需避免完全展开,并执行
匹配
,在该匹配中,您将使用另一种语言测试null。(在本例中,
选项
实际上就像一个可为空的指针。)请注意,您仍然需要打开
Some
变量才能使用它。谢谢dbaupp。不要轻率,我会尝试了解所有这些。有时候,我认为最好只是展示一下它是如何完成的,最终,一切都会结合在一起。希望在几个月后我能回头看看我有多胖。然而,我认为我已经在这方面付出了足够的努力,需要知道答案。也许你已经回答了,但我的测试程序仍然不起作用。一幅画是千言万语,一个例子也是。
fn main() {
    let mut o_acceptor = match TcpListener::bind(
      SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123})
      .listen().unwrap() {
          Some(result) => result,
          None => fail!("Failed to open Listener/Acceptor.")
    };
let o_acceptor = match o_listener {
    Some(listener) => listener,
    None => fail!("Failed to open listener.")
};
fn main() {
    let o_acceptor = TcpListener::bind(
       SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 9123}).listen();

    print ("Listener opened : ");
    std::io::stdin().read_line();

    match o_acceptor {
        Some(_) => println("listener is ready"),
        None => println("listener failed to bind")
    }

    println("possibly starting requests");

    match o_acceptor {
        // this will need to be `Some(ref acpt)` or possibly 
        // `Some(ref mut acpt)` to avoid moving `o_acceptor`
        // if you wish to use it later.
        Some(acpt) => {
            let mut acpt = acpt;
            loop {
                let stream = Cell::new(acpt.accept().unwrap());
                do spawn {
                    let mut stream = stream.take();
                    stream.write(bytes!("Hello World\r\n"));
                }
            }
        }
        None => {
            println("cannot accept because listener failed to bind");
        }
    }
}