generics - 如何在不重复的情况下以相同的方式为多种类型实现特征?

标签 generics rust

给定一个特征,我们可能希望为多种类型实现它。

pub trait RTypeUnit {
    fn zero() -> Self;
    fn one() -> Self;
}

impl RTypeUnit for usize { fn zero() -> usize { 0 } fn one() -> usize { 1 } }
impl RTypeUnit for isize { fn zero() -> isize { 0 } fn one() -> isize { 1 } }
impl RTypeUnit for u64 { fn zero() -> u64 { 0 } fn one() -> u64 { 1 } }
impl RTypeUnit for i64 { fn zero() -> i64 { 0 } fn one() -> i64 { 1 } }
impl RTypeUnit for u32 { fn zero() -> u32 { 0 } fn one() -> u32 { 1 } }
impl RTypeUnit for i32 { fn zero() -> i32 { 0 } fn one() -> i32 { 1 } }
impl RTypeUnit for u16 { fn zero() -> u16 { 0 } fn one() -> u16 { 1 } }
impl RTypeUnit for i16 { fn zero() -> i16 { 0 } fn one() -> i16 { 1 } }
impl RTypeUnit for u8 { fn zero() -> u8 { 0 } fn one() -> u8 { 1 } }
impl RTypeUnit for i8 { fn zero() -> i8 { 0 } fn one() -> i8 { 1 } }

避免为每种类型写出函数的惯用方法是什么?我应该使用默认实现还是宏?

我知道这些特定方法的 num 包,但我很想知道在一般情况下如何执行此操作。

最佳答案

根据 Rust reference :

An implementation is an item that implements a trait for a specific type.

看看 docsZeroOne 的实现(自 Rust 1.11 起已弃用,为简洁起见,我删除了弃用属性):

pub trait Zero: Sized {
    fn zero() -> Self;
}

pub trait One: Sized {
    fn one() -> Self;
}

macro_rules! zero_one_impl {
    ($($t:ty)*) => ($(
        impl Zero for $t {
            #[inline]
            fn zero() -> Self { 0 }
        }
        impl One for $t {
            #[inline]
            fn one() -> Self { 1 }
        }
    )*)
}
zero_one_impl! { u8 u16 u32 u64 usize i8 i16 i32 i64 isize }

如果标准文档使用宏来完成,我怀疑是否存在更好的方法。

关于generics - 如何在不重复的情况下以相同的方式为多种类型实现特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40212998/

相关文章:

typescript :函数返回类型取决于输入函数返回类型

multithreading - 如何将通用 T 发送到另一个线程?

delphi - 将<T>类型的值转换为Variant,可能吗?

generics - kotlin - 删除类属性中的可为空性

generics - Fortran 运算符

import - 如何在另一个 bin 中重用主 bin 中的代码?

rust - 有没有办法在文档注释中内联常量(由 cargo 文档呈现)?

arrays - Rust:初始化二维数组

rust - Rust打印选项自定义结构

rust - 传递给 reqwest::multipart::Part::reader 的内容