Generics 使用泛型(如构造)的子类型
我有一个结构,它正好有两个版本。也就是说,结构有一个属性,描述它是哪个版本(带有两个变量的Generics 使用泛型(如构造)的子类型,generics,types,rust,Generics,Types,Rust,我有一个结构,它正好有两个版本。也就是说,结构有一个属性,描述它是哪个版本(带有两个变量的bool或enum),该属性作为参数传递到构造函数中。结构将具有的版本在编译时是已知的。在该结构的大多数方法中,根据属性的值调用相应的方法(在此结构的属性上)。这导致在该结构的impl中出现许多if语句 我考虑将所有代码移动到一个trait中,但这似乎并不合适:不需要动态分派,几乎所有方法都不会有self参数,所有属性都需要setter/getter。我还剩下两个相同的结构声明。此外,该特性没有描述其他结构
bool
或enum
),该属性作为参数传递到构造函数中。结构将具有的版本在编译时是已知的。在该结构的大多数方法中,根据属性的值调用相应的方法(在此结构的属性上)。这导致在该结构的impl
中出现许多if语句
我考虑将所有代码移动到一个trait中,但这似乎并不合适:不需要动态分派,几乎所有方法都不会有self
参数,所有属性都需要setter/getter。我还剩下两个相同的结构声明。此外,该特性没有描述其他结构应该实现的任何通用行为
如果我可以创建此结构的通用版本,并实例化两个版本中的一个,那将是非常理想的。由于没有更好的词,我的struct有两个“子类型”,只有一个方法具有不同的行为。这可能吗
它涉及性能关键型应用程序,并且此结构上的方法将被多次调用。这不是为了可维护性,我只是复制所有代码。我将创建两个几乎相同的结构,其中在方法内部,调用的外部方法要么是一个版本,要么是另一个版本。用于具有多个实现的行为。您可以通过多种方式使用它们,这里有一种:
use std::marker::PhantomData;
trait Core {
fn print();
}
#[derive(Debug, Default)]
struct PrintA;
impl Core for PrintA {
fn print() {
print!("a")
}
}
#[derive(Debug, Default)]
struct PrintB;
impl Core for PrintB {
fn print() {
print!("b")
}
}
#[derive(Debug, Default)]
struct Thing<C>(PhantomData<C>);
impl<C: Core> Thing<C> {
fn common() {
print!(">");
C::print();
println!("<")
}
}
fn main() {
Thing::<PrintA>::common();
Thing::<PrintB>::common();
}
我考虑过将所有代码移到一个trait中,但这似乎并不合适:动态分派不是必需的,几乎所有方法都不会有self
参数
- 特征并不意味着动态调度。见单晶化
- 特质方法不需要
self
use std::marker::PhantomData;
trait Core {
fn print();
}
#[derive(Debug, Default)]
struct PrintA;
impl Core for PrintA {
fn print() {
print!("a")
}
}
#[derive(Debug, Default)]
struct PrintB;
impl Core for PrintB {
fn print() {
print!("b")
}
}
#[derive(Debug, Default)]
struct Thing<C>(PhantomData<C>);
impl<C: Core> Thing<C> {
fn common() {
print!(">");
C::print();
println!("<")
}
}
fn main() {
Thing::<PrintA>::common();
Thing::<PrintB>::common();
}
我考虑过将所有代码移到一个trait中,但这似乎并不合适:动态分派不是必需的,几乎所有方法都不会有self
参数
- 特征并不意味着动态调度。见单晶化
- 特质方法不需要
self
如果你不能处理traits,听起来可能是个合适的地方。l如果我可以创建此结构的通用版本,并实例化两个版本中的一个-是的,这样做。什么阻止了你?你回答了很多。我选择了你的第一个选择;它满足上述大多数要求和偏好。我没有想过要创建两个没有任何属性的全新结构(这对我来说还是有点奇怪,似乎这并不是结构的真正用途)。此外,还有一个缺点,就是这种特质不能描述任何一般行为。只能有两种变体。然而,通过保持特性对当前模块的私有性,这或多或少会有所缓解。谢谢l如果我可以创建此结构的通用版本,并实例化两个版本中的一个-是的,这样做。什么阻止了你?你回答了很多。我选择了你的第一个选择;它满足上述大多数要求和偏好。我没有想过要创建两个没有任何属性的全新结构(这对我来说还是有点奇怪,似乎这并不是结构的真正用途)。此外,还有一个缺点,就是这种特质不能描述任何一般行为。只能有两种变体。然而,通过保持特性对当前模块的私有性,这或多或少会有所缓解。谢谢
define i32 @_playground_l() {
start:
ret i32 101
}
define i32 @_playground_r() {
start:
ret i32 201
}