Я сейчас реализую шаблон декоратора в Rust.
В Scala мы можем реализовать цепочку методов с помощью таких черт, как:
new Scanner
with Whitespaces
with Keywords
Я хочу сделать то же самое в Rust. Итак, разные черты для сканера:
pub struct Lexer();
pub trait Scan {
fn scan(&self, start: &String) -> DomainTags;
}
pub struct Keywords<T> {
decorated: T
}
impl<T: Scan> Scan for Keywords<T> {
fn scan(&self, start: &String) -> DomainTags {
...
}
}
pub struct Whitespaces<T> {
decorated: T
}
impl<T: Scan> Scan for Whitespaces<T> {
fn scan(&self, start: &String) -> DomainTags {
...
}
}
Но так как я хочу создавать свои лексеры с помощью метода:
pub fn build() -> ??? {
let lex = Lexer();
let lex = Keyword {
decorated: Whitespaces {
decorated: lex
}
};
lex
}
Я не знаю, возможно ли статически вывести тип возвращаемого значения что-то вроде decltype(lex)
. Каков общий подход к реализации метода? Что можно улучшить?
Чтобы уточнить: Я хочу вернуть decltype(lex)
, потому что у меня также может быть несколько черт для одного Лексера, например:
pub trait Load {
fn load<T : Load>(&self, keywords: &String);
}
impl Load for Lexer {
fn load<Lexer>(&self, keyword : &String) {
...
}
}
И я надеюсь вернуть украшенный объект с реализацией черты Load. Оба метода загрузки и сканирования должны быть доступны.