Rust 从原始库重构impl`use super`
我仍在学习Rust,并尝试使用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 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,
...
})
}
}