小编isp*_*ava的帖子

访问&str as&[u8]

我正在用自己的方式驾驶自己,因为根据文档判断它应该是无痛的:如何将字符串转换成一个字符串,&[u8]以便通过TCP或UDP将其发送到线路上?该bytes!()宏只出现对文字直接工作.

这是TCP应用程序的框架,完全来自其他来源.现在它作为回声服务器工作.我正在遇到的绊脚石是弄清楚如何在终端上打印&[u8]作为字符串,或者如何将字符串io::stdin().read_line()转换为&[u8]以通过电线发送,聊天风格.

这无法编译error: mismatched types: expected `&[u8]` but found `&str` (expected vector but found &str):

fn run_tcp_test_server(listen_addr: SocketAddr) {
    let mut acceptor = TcpListener::bind(listen_addr).listen().unwrap();
    println("[ INFO ] listener is ready.");

    loop {
        let stream = Cell::new(acceptor.accept().unwrap());
        do spawn {
            println("[ INFO ] got a request.");

            let mut stream = stream.take();

            let mut my_read_buff = ~[0, ..1024];
            match stream.read(my_read_buff) {
                Some(n) => {
                    stream.write(my_read_buff.slice_to(n));
                },
                _ => ()
            }

            let out_msg = "Hello …
Run Code Online (Sandbox Code Playgroud)

tcp rust

4
推荐指数
1
解决办法
1352
查看次数

在Rust中使用stdin数据实例化struct

我对Rust非常非常新,并试图实现一些简单的东西来感受语言.现在,我绊倒了实现类似类的结构的最佳方法,该结构涉及将字符串转换为int.我正在使用全局命名空间的函数,我觉得我的红宝石大脑感觉不对.

这样做的乡村方式是什么?

use std::io;

struct Person {
  name: ~str,
  age: int
}

impl Person {  
  fn new(input_name: ~str) -> Person {
    Person { 
      name: input_name, 
      age: get_int_from_input(~"Please enter a number for age.")
    }
  }

  fn print_info(&self) {
    println(fmt!("%s is %i years old.", self.name, self.age));
  }

}

fn get_int_from_input(prompt_message: ~str) -> int {
  println(prompt_message);
  let my_input = io::stdin().read_line();
  let my_val =
    match from_str::<int>(my_input) {
      Some(number_string)   => number_string,
      _                     => fail!("got to put in a number.")
  };

  return my_val;
}


fn main() …
Run Code Online (Sandbox Code Playgroud)

closures rust

3
推荐指数
1
解决办法
761
查看次数

在Rust hashmap中分配/实例化字符串/向量的向量?

我正试图从头开始在Rust中实现一个玩具hashmap,并且实际上正在初始化我需要的桶.我已经使用了一系列与其他原语(如u8)相关的存储桶(如下面的代码段中的注释所示).

我无法弄清楚的是如何告诉编译器为我分配一个包含其他向量的可变向量 - 在这种情况下,~str.此代码编译,但在运行时因index out of bounds错误而失败.

static DEFAULT_NUMBER_OF_BUCKETS: uint = 64;
static DEFAULT_VALUE_LENGTH: uint = 32; //unused

struct NaiveHashMap {
    hashmap_size: uint, //unused.
    string_capacity: uint, //unused.
    //contents: ~[ u8 ]
    contents: ~[ ~str ]
}

impl NaiveHashMap {

    fn new(hash_size: uint, string_size: uint) -> NaiveHashMap {
        NaiveHashMap {
            hashmap_size: hash_size, //unused
            string_capacity: string_size, //unused
            //contents: ~[ 0, ..DEFAULT_NUMBER_OF_BUCKETS ]
            contents: std::vec::with_capacity::<~str>(DEFAULT_NUMBER_OF_BUCKETS)
        }
    }

    fn get_hash(&self, key: &str) -> u32 {
        let hash: u32 = jenkins_hash(key); …
Run Code Online (Sandbox Code Playgroud)

string vector rust

3
推荐指数
1
解决办法
1041
查看次数

Rust中的Rudimentary Tree和Pointers

来自脚本语言背景和一些C,试图"学习"Rust让我质疑我的能力.我正在试图找出如何更改自有指针,并努力做到这一点.

除了从额外的lib中复制之外,我无法弄清楚我在二叉树上需要的递归.特别是,我不知道如何换出指针分支.虽然使用链表我可以作弊并使用临时向量来返回一个新列表,或者在列表头前添加一个新的Cons(值,~Cons),但是分支让我感到困惑.

enum NaiveTreeNode {
    NNil,
    NNode(~NaiveTreeNode, ~NaiveTreeNode, int, char) 
    //         left            right          key   val
}

impl NaiveTreeNode {
  fn eq(first_node: &NaiveTreeNode, second_node: &NaiveTreeNode) -> bool {
      match (first_node, second_node) {
          (&NNil, &NNil)              => true,
          ( &NNode( ~ref left_lval, ~ref left_rval, left_leafkey, left_leafval ),
            &NNode( ~ref right_lval, ~ref right_rval, right_leafkey, right_leafval )
          ) if left_leafkey == right_leafkey && left_leafval == right_leafval => {
              NaiveTreeNode::eq(left_lval, right_lval) && NaiveTreeNode::eq(left_rval, right_rval)
          },
          _                           => false
      }
  }

  fn add_branch(&mut self, node_to_add: ~NaiveTreeNode) { …
Run Code Online (Sandbox Code Playgroud)

recursion binary-tree rust

3
推荐指数
1
解决办法
1270
查看次数

正确的锈匹配成语

我意识到语言是0.9/0.10并且仍在进行重大改变(比如do本周下降?),但很想知道我是否在这里使用声音惯用语.我已经实现了两个版本的变更算法,一个是天真的,一个在我看来看起来"更好".

这是0.9.两个片段编译并在一对夫妇得到相同的结果assert!

fn count_change_naive(cents: int, coins: &[int]) -> int {
    if (cents == 0) {
        1
    } else if (cents < 0) {
        0
    } else {
        if coins.iter().len() > 0 {
            let new_amount: int = cents - coins[0];
            let coins_tailed: &[int] = coins.tail();
            count_change_naive(cents, coins_tailed) + count_change_naive(new_amount, coins)
        } else {
            0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是非常笨拙的IMO.我试图实现以下内容:

fn count_change_idiomatic(cents: int, coins: &[int]) -> int {
    match cents {
        n if cents == 0                     => 1,
        n …
Run Code Online (Sandbox Code Playgroud)

recursion switch-statement rust

2
推荐指数
2
解决办法
828
查看次数