gpt4 book ai didi

enums - 如何在给定特征的枚举关联方法上匹配 Self

转载 作者:行者123 更新时间:2023-11-29 08:25:51 24 4
gpt4 key购买 nike

开始之前,我都无法适应 how to match on data type in Rust也没有更新版本的 Shepmaster 到 another question我有。


我希望能够为枚举 BinOp 的每个变体实现 Token 特性。

#[derive(Debug, std::cmp::PartialEq)]
enum BinOp {
Add,
Sub
}

trait Token {
fn regex() -> &'static str;
}

这都行不通(这是我想写的)

编辑:修复错字:impl Token for BinOp 而不是 impl Token for BinOp::Add

impl Token for BinOp {
fn regex() -> &'static str{
match Self {
BinOp::Add => "\\+",
BinOp::Sub => "-"
}
}
}
        match Self {
^^^^
the `Self` constructor can only be used with tuple or unit structs


the `Self` constructor can only be used with tuple or unit structs

也不是那个

impl Token for BinOp::Add {
fn regex() -> &'static str{
"\\+"
}
}
impl Token for BinOp::Add {
^^^^^^^^^^ not a type
expected type, found variant `BinOp::Add`

如果可以写出上面的代码,我也希望可以这样使用

let add: BinOp = BinOp::Add;
let regex: &str = BinOp::Add::regex();

有没有比执行以下操作更好的方法(女巫太冗长了)?

#[derive(Debug, std::cmp::PartialEq)]
struct Add;
#[derive(Debug, std::cmp::PartialEq)]
struct Sub;
#[derive(Debug, std::cmp::PartialEq)]
enum BinOp {
Add(Add),
Sub(Sub)
}

trait Token {
fn regex() -> &'static str;
}

impl Token for Add {
fn regex() -> &'static str{
"\\+"
}
}
impl Token for Sub {
fn regex() -> &'static str{
"-"
}
}
let add: BinOp = BinOp::Add(Add);
let regex: &str = Add::regex();

不幸的是,这是 Rust 的当前限制吗?有解决方法吗?

最佳答案

不幸的是,枚举变体不是 Rust 中的类型,因此您必须坚持使用“详细”版本。

an RFC这将使变体成为类型,但即使它被实现,(如果我没看错的话)你也无法让它们实现一个特征。


但是,在您的情况下,由于您的变体没有任何值(value),您可以这样写:

#[derive(Debug, std::cmp::PartialEq, Clone, Copy)]
enum BinOp {
Add,
Sub
}

trait Token {
fn regex(self) -> &'static str;
}

impl Token for BinOp {
fn regex(self) -> &'static str {
match self {
BinOp::Add => "\\+",
BinOp::Sub => "-",
}
}
}

fn main() {
assert_eq!(BinOp::Add.regex(), "\\+");
assert_eq!(BinOp::Sub.regex(), "-");
}

关于enums - 如何在给定特征的枚举关联方法上匹配 Self,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58891643/

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