专注于在 Rust 中重用

Specialize to reuse in Rust

我有一个分词器超类,可以对任意字符串进行分词 _string。我想实现一些 "simple" 分词器,它们可以对 space、换行符等常见分隔符进行分词

我有以下代码:

api.rs

pub struct StringTokenizer { _string: &'static str }

我要实现的第一个子类是 space 分词器,因此 _string 将是 " ".

我尝试以下:

simple.rs

use api::StringTokenizer;

impl StringTokenizer for SpaceTokenizer {
    let _string = " ";
}

并出现以下错误:

error: expected one of const, extern, fn, pub, type, unsafe, or }, found let

如何在 StringTokenizer 的子类中给 _string" "

Rust 中没有 "superclasses" 和 "subclasses"(从 1.4.0 开始)。我们拥有的最好的是特质。

对于你的情况,我看到两个选项。如果 tokenizer "classes" 之间的唯一区别是定界符字符串,那么我将有一个结构,并且为每个可能的定界符简单地提供各种构造函数方法:

struct StringTokenizer {
    string: &'static str,
}

impl StringTokenizer {
    fn new_space() -> StringTokenizer {
        StringTokenizer { string: " " }
    }
}

如果 类 需要能够实现不同的行为,那么您应该改用特征。您将使用 returns 用于每个特定实现的分隔符字符串的方法来定义特征。然后您可以根据需要添加其他方法。

trait StringTokenizer {
    fn delimiter() -> &'static str;
}

struct SpaceTokenizer;

impl StringTokenizer for SpaceTokenizer {
    fn delimiter() -> &'static str {
        " "
    }
}

请注意,这里的delimiter方法没有self&self&mut self参数,因此它是一个"static"方法。对于其他方法,您可能需要添加其中一个作为第一个参数。

要了解有关特征的更多信息,请阅读 the section on Traits in The Rust Programming Language