gpt4 book ai didi

rust - 如何使用单个宏而不是使用泛型为所有数字类型(包括引用)实现特征?

转载 作者:行者123 更新时间:2023-11-29 08:28:23 25 4
gpt4 key购买 nike

我尝试为以下类型实现特征:i32&i32&mut i32std::num: :NonZeroI32 不使用泛型。因此,我使用了一个宏,但我不想重复代码。

我找不到允许将所有这些类型转换为纯粹的 i32 的公式。

我的尝试:

use std::borrow::Borrow;

trait Foo {
fn foo(self);
}

macro_rules! impl_foo {
( $t0:ty as $t:ty ) => {
impl Foo for $t0 {
fn foo(self) {
let _ = <$t>::from(*(self.borrow()));
}
}
}
}

impl_foo!(i32 as i32);
impl_foo!(std::num::NonZeroI32 as i32);
impl_foo!(&'_ i32 as i32);
impl_foo!(&'_ mut i32 as i32);

最佳答案

您可以将cloneinto 组合在一起,以支持引用和简单的转换。

macro_rules! impl_foo {
( $t0:ty as $t:ty ) => {
impl Foo for $t0 {
fn foo(self) {
let _: $t = self.clone().into();
}
}
}
}

Clone::clone 将是一个值的空操作,如果它是一个引用,它将揭示底层类型。 clone() 的结果是明确的,因此 into() 的输入类型也将被明确地推断出来。

对于简单的 Copy 类型,在大多数情况下,您应该期望 clone 被实现为 memcpy,所以这不应该是性能问题。

关于rust - 如何使用单个宏而不是使用泛型为所有数字类型(包括引用)实现特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58011670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com