gpt4 book ai didi

rust - 我如何为所有实现特征的类型实现 From 特征,但对某些类型使用特定的实现?

转载 作者:行者123 更新时间:2023-11-29 08:26:49 24 4
gpt4 key购买 nike

我正在实现 std::convert::From包含 Cow<str> 的结构的特征.有没有办法对所有不同类型的整数( u8u16u32usize 等等)使用相同的实现?

use std::borrow::Cow;

pub struct Luhn<'a> {
code: Cow<'a, str>,
}

我可以使用 ToString 上的特征绑定(bind)轻松实现所有整数的代码特征,但我不能为 str 使用特定的实现和 String - 这样的好处Cow不能被利用。当我为 str 编写具体实现时和 String ,我得到一个编译错误:

error[E0119]: conflicting implementations of trait `std::convert::From<&str>` for type `Luhn<'_>`:
--> src/lib.rs:23:1
|
7 | impl<'a> From<&'a str> for Luhn<'a> {
| ----------------------------------- first implementation here
...
23 | impl<'a, T: ToString> From<T> for Luhn<'a> {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Luhn<'_>`

我知道这是因为 Rust 不提供函数重载。如何以优雅的方式解决这个问题?

impl<'a> From<&'a str> for Luhn<'a> {
fn from(input: &'a str) -> Self {
Luhn {
code: Cow::Borrowed(input),
}
}
}

impl<'a> From<String> for Luhn<'a> {
fn from(input: String) -> Self {
Luhn {
code: Cow::Owned(input),
}
}
}

impl<'a, T: ToString> From<T> for Luhn<'a> {
fn from(input: T) -> Self {
Luhn {
code: Cow::Owned(input.to_string()),
}
}
}

最佳答案

由于&strString 都实现了ToString,您可以使用不稳定的specialization特点:

#![feature(specialization)]

use std::borrow::Cow;

pub struct Luhn<'a> {
code: Cow<'a, str>,
}

impl<'a, T: ToString> From<T> for Luhn<'a> {
default fn from(input: T) -> Self {
// ^^^^^^^
Luhn {
code: Cow::Owned(input.to_string()),
}
}
}

impl<'a> From<&'a str> for Luhn<'a> {
fn from(input: &'a str) -> Self {
Luhn {
code: Cow::Borrowed(input),
}
}
}

impl<'a> From<String> for Luhn<'a> {
fn from(input: String) -> Self {
Luhn {
code: Cow::Owned(input),
}
}
}

也就是说,你不能为 Luhn 实现 Display,因为你会遇到 How is there a conflicting implementation of `From` when using a generic type?

关于rust - 我如何为所有实现特征的类型实现 From 特征,但对某些类型使用特定的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52339735/

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