簡體   English   中英

Rust:在 trait 實現上指定類型的便捷語法?

[英]Rust: Convenience syntax for specifying types on trait implementations?

考慮以下代碼,其結構S具有受約束的泛型類型參數IdxIdx的默認值。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM