struct - 我将如何创建一个函数局部静态 `HashSet<char>` 并初始化一次?

标签 struct static initialization rust

<分区>

我已经通读了这本书的前半部分second edition以及this chapter在第一版中。我仍然对如何初始化静态变量感到困惑。

最后我想要一个函数 local static HashSet<char>包含所有数字字符。

尝试 1:

fn is_digit(c: char) -> bool {
    static set: std::collections::HashSet<char> =
        ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
            .iter()
            .cloned()
            .collect();

    return set.contains(&c);
}

编译器产生:

error[E0015]: calls in statics are limited to struct and enum constructors
 --> src/main.rs:3:9
  |
3 | /         ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
4 | |             .iter()
  | |___________________^
  |
note: a limited form of compile-time function evaluation is available on a nightly compiler via `const fn`
 --> src/main.rs:3:9
  |
3 | /         ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
4 | |             .iter()
  | |___________________^

尝试 2:(没有数据,只有构造)

static set: std::collections::HashSet<char> = std::collections::HashSet::new();

编译器产生:

error[E0015]: calls in statics are limited to struct and enum constructors
 --> src/main.rs:1:47
  |
1 | static set: std::collections::HashSet<char> = std::collections::HashSet::new();
  |                                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |

另一方面,这是可行的:

let set: std::collections::HashSet<char> = std::collections::HashSet::new();

HashSetstruct .

这就是为什么我不理解尝试 2 的错误。我正在尝试调用结构的构造函数,但编译器说我只能调用结构或枚举的构造函数。

我猜 new()毕竟不是构造函数调用...?

最佳答案

要像在其他语言(例如 C++)中一样使用 static 变量,您可以使用 this crate .它进行惰性初始化来模拟这种行为。

但是 IMO,在您的示例中,这样的功能有点矫枉过正。你可以简单地这样做:

fn is_digit(c: char) -> bool {
    match c {
        '0'...'9' => true,
        _ => false,
    }
}

fn main() {
    assert_eq!(is_digit('0'), true);
    assert_eq!(is_digit('5'), true);
    assert_eq!(is_digit('9'), true);
    assert_eq!(is_digit('a'), false);
}

或者更好的是,使用标准:

fn is_digit(c: char) -> bool {
    c.is_digit(10)
}

关于结构,你是对的:Rust 中不存在构造函数。编译器谈论的枚举构造函数与其他对象语言中的构造函数不同。如果您想了解更多信息,最好继续阅读本书。

关于struct - 我将如何创建一个函数局部静态 `HashSet<char>` 并初始化一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44776591/

相关文章:

asynchronous - 如何将异步函数存储在结构中并从结构实例中调用它?

c++ - C++中的结构继承

c - 为什么这个包含指向自身的指针的结构不能正常工作?

java - 为什么我的处理程序引用空 Activity ?

Python 列表在类实例初始化时应该为空,但事实并非如此。为什么?

c++ - 非静态数据成员的成员初始值设定项列表和默认成员初始值设定项之间有什么区别?

arrays - 如何创建包含大型数组的结构体数组?

Python:同名的常规方法和静态方法

php - 为什么 PHP 5.2+ 不允许抽象静态类方法?

c++ - 测试静态局部对象的初始化是否线程安全