gpt4 book ai didi

rust - 如何在 Rust 结构中存储动态类型变量?

转载 作者:行者123 更新时间:2023-12-02 15:54:31 24 4
gpt4 key购买 nike

我声明我是 Rust 的初学者,这是我的第一个项目。我正在尝试用 Rust 编写 SQL 编译器。我必须创建一个 Token 结构来表示 SQL 查询的语法单元。在 C/C++ 中,我会编写如下结构:

typedef unsigned long Value;

// Represents the type of the token (e.g. number, string, identifier...)
typedef enum class TokenType { ... }

struct Token {
TokenType type;
unsigned char priority;
Value value;
}

使用这种方法,我使用 Value 类型来存储任何类型的值。如果它是一个数字,value 被解释为一个整数,float...,而当 value 表示一个字符串或标识符时,它被转换为一个字符串指针,然后用于访问它指向的堆分配数据。
为了决定如何处理 Tokenvalue 属性,我使用了 type 字段。例如,如果 type 告诉我 token 是一个整数,我就将 value 转换为一个 int。如果 type 告诉我 token 是标识符,我会将 value 转换为字符串指针。

我的问题是,是否可以在安全的 Rust 中做类似的事情?如果不是,那么实现可以基于 TokenType 以多种方式解释的动态类型变量的好方法是什么?或者是否有更简洁的方法来创建在 Rust 中运行良好的语法标记?

提前致谢。

最佳答案

在 Rust 中,如果你有一组可能的类型,你应该使用 enum . Rust 中的枚举与 C 中的不同:它们可以携带有效负载(即它们是求和类型)。

enum TokenType {
Number(i32),
Identifier(String),
String(String),
Plus,
Minus,
// ...
}

然后对其进行匹配:

let e: TokenType = ...;
match e {
TokenType::Number(n) => println!("number: {n}"),
TokenType::String(s) => println!("string: {s}"),
TokenType::Plus => println!("plus"),
// ...
}

关于rust - 如何在 Rust 结构中存储动态类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71723848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com