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
}