[英]Rust: Convenience syntax for specifying types on trait implementations?
考慮以下代碼,其結構S
具有受約束的泛型類型參數Idx
和Idx
的默認值。
use num::{PrimInt, Unsigned};
struct S<Idx = u32>
where
Idx: Unsigned + PrimInt, {
// ... Some fields
}
impl<Idx: Unsigned + PrimInt> Clone for S<Idx> {
fn clone(&self) -> Self {
S {}
}
}
impl<Idx: Unsigned + PrimInt> Eq for S<Idx> {
fn eq(&self, rhs: &Self) -> bool {
true
}
}
我想為S
實現一堆特征,但我發現總是為Idx
類型參數指定約束很乏味。 如果我沒有在 trait 實現上指定Idx
,則代碼會編譯,但只有Idx = u32
的實現。
是否有一些方便的語法,我不必一直指定Idx: Unsigned + PrimInt
但仍能正確實現特征?
沒有內置語法,但您可以使用宏自己制作:
macro_rules! s_impl {
( $($t:path => $i:tt)+ ) => {
$(impl<Idx: Unsigned + PrimInt> $t for S<Idx> $i)+
}
}
然后你可以這樣做:
s_impl!(
Clone => {
fn clone(&self) -> Self {
S {}
}
}
PartialEq => {
fn eq(&self, rhs: &Self) -> bool {
true
}
}
);
@cdhowie 的答案是正確的,但我想指出的是,有一個接受的(但截至撰寫本文時尚未實施)RFC 允許您省略此類界限 - RFC #2089 Implied Bounds 。
不過,目前尚不清楚該功能的形式是什么,因為它是一個semver 危險。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.