本文简要介绍rust语言中 Trait std::convert::Into
的用法。
用法
pub trait Into<T> {
fn into(self) -> T;
}
消耗输入值的value-to-value 转换。与 From
相反。
应该避免实施 Into
,而是实施 From
。由于标准库中的一揽子实现,实现 From
会自动提供 Into
的实现。
在指定泛型函数的 trait bound 时,优先使用 Into
而不是 From
,以确保也可以使用仅实现 Into
的类型。
注意:这个特质一定不能失败.如果转换可能失败,请使用TryInto
.
通用实现
在旧版本的 Rust 中实现Into
以转换为外部类型
在 Rust 1.41 之前,如果目标类型不是当前 crate 的一部分,那么你不能直接实现 From
。例如,使用以下代码:
struct Wrapper<T>(Vec<T>);
impl<T> From<Wrapper<T>> for Vec<T> {
fn from(w: Wrapper<T>) -> Vec<T> {
w.0
}
}
这将无法在旧版本的语言中编译,因为 Rust 的孤儿规则曾经更严格一些。为了绕过这个,你可以直接实现 Into
:
struct Wrapper<T>(Vec<T>);
impl<T> Into<Vec<T>> for Wrapper<T> {
fn into(self) -> Vec<T> {
self.0
}
}
重要的是要了解 Into
不提供 From
实现(就像 From
与 Into
一样)。因此,您应始终尝试实施 From
,如果无法实施 From
,则回退到 Into
。
例子
String
实现 Into
<
Vec
<
u8
>>
:
为了表达我们希望泛型函数采用可以转换为指定类型 T
的所有参数,我们可以使用 Into
<T>
的特征边界。例如:函数 is_hello
接受所有可以转换为 Vec
<
u8
>
的参数。
fn is_hello<T: Into<Vec<u8>>>(s: T) {
let bytes = b"hello".to_vec();
assert_eq!(bytes, s.into());
}
let s = "hello".to_string();
is_hello(s);
相关用法
- Rust IntoKeys用法及代码示例
- Rust IntoIter.as_mut_slice用法及代码示例
- Rust IntoInnerError.error用法及代码示例
- Rust IntoIter.new用法及代码示例
- Rust IntoValues用法及代码示例
- Rust IntoIterator.into_iter用法及代码示例
- Rust IntoInnerError.into_inner用法及代码示例
- Rust IntoInnerError.into_parts用法及代码示例
- Rust IntoIter.as_slice用法及代码示例
- Rust IntoIterator用法及代码示例
- Rust IntoIter用法及代码示例
- Rust IntoRawFd.into_raw_fd用法及代码示例
- Rust IntoInnerError.into_error用法及代码示例
- Rust IntoInnerError用法及代码示例
- Rust IntErrorKind用法及代码示例
- Rust Intersection用法及代码示例
- Rust Infallible用法及代码示例
- Rust Incoming用法及代码示例
- Rust Instant.checked_duration_since用法及代码示例
- Rust Index用法及代码示例
- Rust Instant.now用法及代码示例
- Rust Instant.saturating_duration_since用法及代码示例
- Rust Instant.duration_since用法及代码示例
- Rust Instant用法及代码示例
- Rust IndexMut用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Trait std::convert::Into。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。