【问题标题】:How to cast &u8 to usize如何将 &u8 转换为使用
【发布时间】:2015-12-26 00:10:22
【问题描述】:

我正在处理 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 错误:将 &amp;u8 转换为 usize 无效

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

pangram.rs:14:24: 14:34 错误:将 &amp;u8 转换为 usize 无效

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

pangram.rs:15:24: 15:34 错误:将 &amp;u8 转换为 usize 无效

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

pangram.rs:15:24: 15:34 帮助:首先通过原始指针进行转换

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

我尝试过投射c as *mut usizec as *const usize,但都没有成功。我做了多少?

【问题讨论】:

  • 去掉评论,改写if c == '\n' as u8 { break; }
  • @Veedrac 感谢您的建议。我更改了该行以考虑所有标点符号、空格等。现在是if c &gt; 122 || c &lt; 97 { continue; }

标签: casting rust


【解决方案1】:

这是一个非常简单的变化——实际上是一个字符:

    for &c in s.to_lowercase().as_bytes() {
        ^

您试图将 reference(这是 as_bytes 的结果)视为常规值,这是行不通的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    • 2021-03-18
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多