2个不稳定版本
0.2.0 | 2022年1月8日 |
---|---|
0.1.0 | 2017年5月30日 |
在过程宏中排名280
每月下载量26,765
用于28 个crates(5个直接使用)
27KB
481 行
derive-into-owned
Rust过程宏,用于派生方法以帮助处理包含Cow
字段的类型。请注意,此派生在某种程度上与鸭子类型化工作,至少目前是这样。它最初是为了帮助我减少与Cow
类型相关的样板代码而创建的。
[derive(IntoOwned)]
生成类似于以下的方法
use std::borrow::Cow;
struct Foo<'a> {
field: Cow<'a, str>,
}
impl<'a> Foo<'a> {
/// This method would be derived using #[derive(IntoOwned)]
pub fn into_owned(self) -> Foo<'static> {
Foo {
field: Cow::Owned(self.field.into_owned()),
}
}
}
最初基于deep-clone-derive示例,但支持
- 元组结构体
- 普通的结构体
- 带有元组变体的枚举 元组枚举
- 类似于
IntoOwned
的字段(实际上假定所有具有生命周期类型的字段都是类似于IntoOwned
的) - Cow或类似Cow的类型选项
Option<Cow<'a, str>>
和Option<Foo<'a>>
- Cow或类似Cow的类型向量
但是还有更多![derive(Borrowed)]
生成当前可能有些受限的方法,类似于
impl<'a> Foo<'a> {
pub fn borrowed<'b>(&'b self) -> Foo<'b> {
Foo {
field: Cow::Borrowed(self.field.as_ref()),
}
}
}
具有生命周期的类型
如果你的结构体有一个类型为 Bar<'a>
的字段,则假定 Bar
具有方法 fn into_owned(self) -> Bar<'static>
。
注意,不需要实现 trait,因为我当时没有找到,也没有想到创建自己的,假设 Cow::into_owned
可能会在标准库中扩展,但从未发生。
限制
目前派生(deriving)将失败,至少但不限于以下情况:
IntoOwned
:借用的字段,如&'a str
Borrowed
:结构体/枚举有多个生命周期- 两者:不支持数组
- 两者:向量内部的元组中的 into_owned/borrowed 类型
使用不兼容的类型会导致难以理解的错误信息。例如,给定一个结构体
#[derive(IntoOwned)]
struct Foo<'a> {
field: &'a str,
}
编译器错误将是
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
--> tests/does_not_compile.rs:4:10
|
4 | #[derive(IntoOwned)]
| ^^^^^^^^^
|
note: first, the lifetime cannot outlive the lifetime 'a as defined on the impl at 4:10...
--> tests/does_not_compile.rs:4:10
|
4 | #[derive(IntoOwned)]
| ^^^^^^^^^
note: ...so that reference does not outlive borrowed content
--> tests/does_not_compile.rs:4:10
|
4 | #[derive(IntoOwned)]
| ^^^^^^^^^
= note: but, the lifetime must be valid for the static lifetime...
note: ...so that expression is assignable (expected Foo<'static>, found Foo<'_>)
--> tests/does_not_compile.rs:4:10
|
4 | #[derive(IntoOwned)]
| ^^^^^^^^^
error: aborting due to previous error(s)
依赖关系
~1.5MB
~36K SLoC