Rust 从原始库重构impl`use super`

Rust 从原始库重构impl`use super`,rust,Rust,我仍在学习Rust,并尝试使用Rust cssparser重新使用源库中定义的impl,但由于编译错误,无法为定义类型的板条箱之外的类型定义固有IML。当然,库使用use super::Token,但我需要使用cssparser::{Token},不知道如何解决 摘录: impl<'a> Token<'a> { /// Categorize a token into a type that determines when `/**/` needs to be in

我仍在学习Rust,并尝试使用
Rust cssparser
重新使用源库中定义的impl,但由于编译错误,
无法为定义类型的板条箱之外的类型定义固有IML
。当然,库使用
use super::Token,但我需要
使用cssparser::{Token},不知道如何解决

摘录:

impl<'a> Token<'a> {
    /// Categorize a token into a type that determines when `/**/` needs to be inserted
    /// between two tokens when serialized next to each other without whitespace in between.
    ///
    /// See the `TokenSerializationType::needs_separator_when_before` method.
    pub fn serialization_type(&self) -> TokenSerializationType {
        use self::TokenSerializationTypeVariants::*;
        TokenSerializationType(match *self {
            Token::Ident(_) => Ident,
            Token::AtKeyword(_) | Token::Hash(_) | Token::IDHash(_) => AtKeywordOrHash,
            ...
        })
    }
}

无法重新实现已在板条箱外部声明的类型。这是因为使用
令牌的任何其他板条箱都不知道您将在
impl
中添加的任何函数。通过重新实现,相同类型的实现在板条箱之间会有所不同,这就是为什么不允许这样做

解决方案

这里正确的做法是使用
serialization\u type
函数声明一个trait,比如说
SerializationType
,然后为
标记
实现
SerializationType

pub trait SerializationType<'a> {
    fn serialization_type(&self) -> TokenSerializationType;
}

impl<'a> SerializationType<'a> for Token<'a> {
    fn serialization_type(&self) -> TokenSerializationType {
        use self::TokenSerializationTypeVariants::*;
        TokenSerializationType(match *self {
            Token::Ident(_) => Ident,
            Token::AtKeyword(_) | Token::Hash(_) | Token::IDHash(_) => AtKeywordOrHash,
            ...
        })
    }
}
pub trait SerializationType SerializationType{
fn序列化类型(&self)->TokenSerializationType{
使用self::TokenSerializationTypeVariants:::*;
TokenSerializationType(匹配*self{
令牌::Ident()=>Ident,
Token::AtKeyword(|)Token::Hash(|)Token::IDHash(|)=>AtKeywordOrHash,
...
})
}
}
替代解决方案

另一种解决方案是创建一个新类型。请注意,别名类型不会创建新类型,因此会触发相同的错误

pub type CustomToken<'a> = Token<'a>;
pub类型CustomToken;

您应该封装
Token(Token customtoken请提供完整和完整的错误消息。请注意,根据您给我们的信息,我可以告诉您,问题不在于
use
语句,而在于某个地方的
impl
(可能是
impl Token
?)。您实际要做的事情并不明显。是否要对现有类型实现新方法?您可以通过定义自己指定该方法的特征,并为
标记
类型实现特征来实现。然后使用特征将用新方法丰富
标记
类型的所有值。@user4815162342回答了你的意思吗?谢谢。尝试透视是的,就是这样。如果你想在另一个模块中获得
Token
上的方法,你需要
使用你的trait。这很有效。谢谢!我尝试了另一种解决方案,得到了不匹配的类型错误w/Token。trait解决方案工作正常,没有问题。
pub type CustomToken<'a> = Token<'a>;
struct CustomToken<'a>(Token<'a>);

impl <'a> CustomToken<'a> {
    fn serialization_type(&self) -> TokenSerializationType {
        use self::TokenSerializationTypeVariants::*;
        TokenSerializationType(match *self {
            Token::Ident(_) => Ident,
            Token::AtKeyword(_) | Token::Hash(_) | Token::IDHash(_) => AtKeywordOrHash,
            ...
        })
    }
}