#cow #derive #macro-derive #fields #proc-macro #help #deriving

derive-into-owned

用于帮助包含Cow字段的类型自定义派生

2个不稳定版本

0.2.0 2022年1月8日
0.1.0 2017年5月30日

过程宏中排名280

Download history 6484/week @ 2024-03-14 6099/week @ 2024-03-21 5032/week @ 2024-03-28 5749/week @ 2024-04-04 6881/week @ 2024-04-11 7135/week @ 2024-04-18 6319/week @ 2024-04-25 6471/week @ 2024-05-02 6864/week @ 2024-05-09 7367/week @ 2024-05-16 5784/week @ 2024-05-23 6691/week @ 2024-05-30 6786/week @ 2024-06-06 6828/week @ 2024-06-13 6746/week @ 2024-06-20 5055/week @ 2024-06-27

每月下载量26,765
用于28 个crates(5个直接使用)

MIT 许可证

27KB
481

derive-into-owned

Build Status crates.io docs.rs

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示例,但支持

但是还有更多![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