【发布时间】:2018-09-14 22:04:09
【问题描述】:
我正在为包含Cow<str> 的结构实现std::convert::From 特征。有没有办法对所有不同类型的整数使用相同的实现(u8、u16、u32、usize 等等)?
use std::borrow::Cow;
pub struct Luhn<'a> {
code: Cow<'a, str>,
}
我可以使用绑定在ToString 特征上的特征轻松实现所有整数的代码,但是我不能对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()),
}
}
}
【问题讨论】: