在不使用关联类型的情况下简化类型签名
Simplifying a type signature without using associated types
有没有办法简化这里的类型签名
pub struct OrderBook<T: PriceLevel, U: PriceLadder<T>> {
levels: U,
phantom: PhantomData<T>,
}
这样
type HashBook = OrderBook<LinkedHashLevel, HashmapLadder<LinkedHashLevel>>;
可以这样写吗?
type HashBook = OrderBook<LinkedHashLevel, HashmapLadder>;
我知道关联类型,但希望能够使用具有不同价格水平实现的单一价格阶梯。
下面是完整的可编译代码...
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() {}
我认为没有必要更改类型签名。考虑到你的悲伤:
I'm aware of associated types but want to be able to use a single price ladder with different implementations of price level.
也许创建一个由价格水平实现参数化并具有固定价格阶梯的类型别名就足够了:
type HashBook<Level> = OrderBook<Level, HashmapLadder<Level>>;
有没有办法简化这里的类型签名
pub struct OrderBook<T: PriceLevel, U: PriceLadder<T>> {
levels: U,
phantom: PhantomData<T>,
}
这样
type HashBook = OrderBook<LinkedHashLevel, HashmapLadder<LinkedHashLevel>>;
可以这样写吗?
type HashBook = OrderBook<LinkedHashLevel, HashmapLadder>;
我知道关联类型,但希望能够使用具有不同价格水平实现的单一价格阶梯。
下面是完整的可编译代码...
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() {}
我认为没有必要更改类型签名。考虑到你的悲伤:
I'm aware of associated types but want to be able to use a single price ladder with different implementations of price level.
也许创建一个由价格水平实现参数化并具有固定价格阶梯的类型别名就足够了:
type HashBook<Level> = OrderBook<Level, HashmapLadder<Level>>;