如何施展和使用u8

时间:2015-12-26 00:10:22

标签: casting rust

我正在研究Rust中的一些编码挑战,其中一个问题是确定一个短语是否是一个pangram。我见过以下实现:

// Copy chars into a vector, sort and remove duplicates
let mut chars: Vec<char> = pangram.chars().collect();
chars.sort();
chars.dedup();

然而,由于排序,此解决方案的时间为O(nlogn)。我可以在O(n)时间内完成,但我遇到了问题。

以下是我试过写的代码:

fn is_pangram(s: String) -> bool {
    let mut num_seen = 0;
    let mut seen: [bool; 26] = [false; 26];

    for c in s.to_lowercase().as_bytes() {
        // ASCII 10 is newline character
        if c as usize == 10 {
            break;
        }

        // Lowercase ASCII is 97 to 122
        if !seen[122 - c as usize] {
            seen[122 - c as usize] = true;
            num_seen += 1;
        }
    }
    return num_seen == 26;
}

我收到以下错误:

  

18:55 $ rustc pangram.rs

     

pangram.rs:10:12:10:22错误:施放&u8usize无效

     

pangram.rs:10如果c as usize == 10 {   pangram.rs:10:12:10:22帮助:首先通过原始指针投射

     

pangram.rs:14:24:14:34错误:施放&u8usize无效

     

pangram.rs:14 if!see [122 - c as usize] {   pangram.rs:14:24:14:34帮助:首先通过原始指针投射

     

pangram.rs:15:24:15:34错误:施放&u8usize无效

     pangram.rs:15见[122 - c as usize] = true;

     

pangram.rs:15:24:15:34帮助:先通过原始指针投射

     

错误:由于之前的3个错误导致中止

我尝试过投放c as *mut usizec as *const usize,但都没有效果。我做了多少这个工作?

1 个答案:

答案 0 :(得分:5)

这是一个非常简单的改变 - 实际上是一个角色:

MissingOverride

您正在尝试将引用(这是 for &c in s.to_lowercase().as_bytes() { ^ 导致的结果)视为常规值,但这不起作用。

您可以执行上面的操作(将as_bytes更改为for c in)或将for &c in循环内的所有c替换为for ;他们基本上做同样的事情。