不依赖于泛型类型的特征或方法

Trait or method that does not depend on generic type

我在 Rust 中有一个通用结构,它有一个通用字段,在本例中为 val 和一个类型特定字段:

struct A<T> {
    val: i32,
    t: T
}

我想要做的是让一个方法与结构相关联,而不管类型 T。我可以这样称呼的东西:

A::my_method()

而不是:

A::<T>::my_method()

我尝试在 A 上实现一个名为 Get 的特性,并按如下方式调用它:

struct A<T> {
    val: i32,
    t: T
}

trait Get {
    type ValType;
    fn get_val() -> Self::ValType;
}

impl<T> Get for A<T> {
    type ValType = i32;
    
    fn get_val() -> Self::ValType {
        2
    }
}

fn main() {
    let a = A {
        val: 2,
        t: 3.0
    };
    
    // This is the call I want, if possible
    println!("{:?}", A::get_val());
}

问题是它无法编译,这是预料之中的。我想要的结果是这样的:

impl<T> Get for A<any T> {
    type ValType = i32;
    
    fn get_val() -> Self::ValType {
        2
    }
}

我在一些帖子中发现解决方法是使用虚拟类型参数并按如下方式调用我的函数:

struct DummyType;

fn main() {
    let a = A {
        val: 2,
        t: 3.0
    };
    
    // This is the call I want, if possible
    println!("{:?}", A::<DummyType>::get_val());
}

您可能缺少的是方法接收器。


pub struct A<T> {
    pub field: usize,
    pub something: T,
}

pub trait Getter {
    type Output;
    fn get(&self) -> Self::Output;
}

impl<T> Getter for A<T> {
    type Output = usize;
    fn get(&self) -> Self::Output {
        self.field
    }
}

fn main() {
    let a = A { field: 10, something: 3.0 };
    assert_eq!(a.get(), 10);
}

在这里您可以 return A 的状态,而不仅仅是常量。

首先,你的设计看起来不对。如果类型是通用的,那么有一个 non-generic 方法意味着什么?

无论如何,你可以使用哨兵类型(而且你不需要特征,我真的不明白你为什么把它放在第一位):

impl A<()> {
    fn get_val() -> i32 {
        2
    }
}

当您调用 A::get_val().

时,编译器会自动将 T 推断为 ()

Playground.

很好,我试过了,生锈似乎没问题:

pub trait Get {
    type Output;
    fn get() -> Self::Output;
}

pub struct A<T>(T);

impl Get for A<()> {
    type Output = usize;
    fn get() -> Self::Output {
        2
    }
}

fn main() {
    println!("{}", A::get());
}

() 是这里的最佳选择,因为您想表达参数对我们在这里并不重要,但也不要为此声明类型。