[英]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<T>上实现一个名为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
}
}
我在一些帖子中发现解决方法是使用虚拟类型参数并将我的 function 称为:
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);
}
在这里您可以返回A
的 state 而不仅仅是常量。
首先,你的设计看起来不对。 如果类型是通用的,那么拥有非通用方法意味着什么?
无论如何,你可以使用一个哨兵类型(你不需要一个特征,我真的不明白你为什么把它放在第一位):
impl A<()> {
fn get_val() -> i32 {
2
}
}
当您调用A::get_val()
时,编译器会自动将T
推断为()
)。
游乐场。
好吧,我试过了,rust 似乎没问题:
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());
}
()
是这里的最佳选择,因为您想表达该参数在这里对我们并不重要,但也不要为此声明类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.