有沒有辦法根據泛型型別選擇常量的值?
例如,類似(無效的 Rust 代碼):
fn foo<T>() {
let b = match T {
u32 => 0x01234567u32,
u64 => 0x0123456789abcdefu64,
_ => panic!()
}
}
fn main() {
foo::<u32>();
foo::<u64>();
}
此函式僅設計為與u16,u32和u64型別一起使用。
uj5u.com熱心網友回復:
您可以使用特征的關聯常量:
trait MyTrait {
const SOME_CONST: Self;
}
impl MyTrait for u32 {
const SOME_CONST: Self = 0x01234567u32;
}
impl MyTrait for u64 {
const SOME_CONST: Self = 0x0123456789abcdefu64;
}
fn foo<T>() where T: MyTrait {
let _b: T = T::SOME_CONST;
}
fn main() {
foo::<u32>();
foo::<u64>();
}
在生銹的操場上試一試。
uj5u.com熱心網友回復:
如果你需要做的不僅僅是回傳一個值,你也可以匹配TypeId你的泛型,但你必須將你的回傳值包裝在一個列舉中,因為你不能從單個match陳述句回傳多個型別:
use std::any::TypeId;
#[derive(Debug)]
enum Value {
u32(u32),
u64(u64),
}
fn foo<T: 'static>() -> Value {
match TypeId::of::<T>() {
t if t == TypeId::of::<u32>() => {
// other stuff
Value::u32(0x01234567u32)
},
t if t == TypeId::of::<u64>() => {
// other stuff
Value::u64(0x0123456789abcdefu64)
},
_ => panic!(),
}
}
fn main() {
println!("{:?}", foo::<u32>());
println!("{:?}", foo::<u64>());
}
如果獲得一個常量值是您需要的唯一功能,那么已經提到的相關常量會更好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495757.html
