作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
开始之前,我都无法适应 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/
我是一名优秀的程序员,十分优秀!