Generics 在不使用关联类型的情况下简化类型签名

Generics 在不使用关联类型的情况下简化类型签名,generics,rust,traits,Generics,Rust,Traits,这里有没有简化类型签名的方法 pub struct OrderBook<T: PriceLevel, U: PriceLadder<T>> { levels: U, phantom: PhantomData<T>, } pub-struct-OrderBook{ 级别:U, 幻影:幻影数据, } 以致 type HashBook = OrderBook<LinkedHashLevel, HashmapLadder<LinkedH

这里有没有简化类型签名的方法

pub struct OrderBook<T: PriceLevel, U: PriceLadder<T>> {
    levels: U,
    phantom: PhantomData<T>,
}
pub-struct-OrderBook{
级别:U,
幻影:幻影数据,
}
以致

type HashBook = OrderBook<LinkedHashLevel, HashmapLadder<LinkedHashLevel>>;
类型HashBook=OrderBook;
可以这样写吗

type HashBook = OrderBook<LinkedHashLevel, HashmapLadder>;
类型HashBook=OrderBook;
我知道相关的类型,但希望能够使用具有不同价格级别实现的单个价格阶梯

下面是完整的可编译代码

use std::marker::PhantomData;
use std::collections::HashMap;

pub struct OrderBook<T: PriceLevel, U: PriceLadder<T>> {
    levels: U,
    phantom: PhantomData<T>,
}

impl<T: PriceLevel, U: PriceLadder<T>> OrderBook<T, U> {}

type HashBook = OrderBook<LinkedHashLevel, HashmapLadder<LinkedHashLevel>>;

pub trait PriceLevel {
    fn new() -> Self where Self: Sized;
}

pub trait PriceLadder<T: PriceLevel> {
    fn new() -> Self;
}

pub struct LinkedHashLevel {
}

impl PriceLevel for LinkedHashLevel {
    fn new() -> Self {
        LinkedHashLevel {}
    }
}

pub struct HashmapLadder<T: PriceLevel> {
    levels: HashMap<u64, T>,
}

impl<T: PriceLevel> PriceLadder<T> for HashmapLadder<T> {
    fn new() -> Self {
        HashmapLadder { levels: HashMap::new() }
    }
}

fn main() {}
使用std::marker::PhantomData;
使用std::collections::HashMap;
发布结构订单簿{
级别:U,
幻影:幻影数据,
}
impl订单簿{}
类型HashBook=OrderBook;
价格水平{
fn new()->Self,其中Self:大小;
}
酒吧价格阶梯{
fn new()->Self;
}
发布结构LinkedHashLevel{
}
LinkedHashLevel的impl PriceLevel{
fn new()->Self{
LinkedHashLevel{}
}
}
发布结构HashmapLadder{
级别:HashMap,
}
HashmapLadder的impl PriceLadder{
fn new()->Self{
HashmapLadder{levels:HashMap::new()}
}
}
fn main(){}

我认为没有必要更改类型签名。考虑到你的悲伤:

我知道相关类型,但希望能够使用单个价格阶梯和不同的价格级别实现

也许创建一个由价格级别实现参数化并具有固定价格阶梯的类型别名就足够了:

type HashBook<Level> = OrderBook<Level, HashmapLadder<Level>>;
类型HashBook=OrderBook;

这缺少许多其他类型。那里例如,这里没有定义HashMapLadder。添加了可编译代码。