我在 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
}
}
我在一些帖子中發現一種解決方法是使用一個虛擬型別引數并這樣呼叫我的函式:
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());
}
uj5u.com熱心網友回復:
首先,你的設計看起來不對。如果型別是泛型的,那么擁有非泛型方法意味著什么?
無論如何,你可以使用一個哨兵型別(你不需要一個特征,我真的不明白你為什么把它放在首位):
impl A<()> {
fn get_val() -> i32 {
2
}
}
當您T呼叫.()A::get_val()
游樂場。
uj5u.com熱心網友回復:
您可能缺少的是方法接收器。
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而不僅僅是常量。
uj5u.com熱心網友回復:
好吧,我試過這個,生銹似乎沒問題:
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());
}
這里()是最好的選擇,因為你想表達這個引數對我們來說并不重要,但也不要為此宣告一個型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449175.html
上一篇:具有兩個引數的泛型類
下一篇:從通用容器類中對通用串列進行排序
