rust - 将 `Deref` 实现为返回复合结构的字段是惯用的吗?

标签 rust

我有:

struct Id;
struct Url;
struct IdAndUrl {
    id: Id,
    url: Url,
}

我希望能够使用 IdAndUrl在我需要的地方 Id .为了消除噪音,我可以使用 impl Deref<Id> for IdAndUrl .

这是一个好的做法/惯用语吗?

最佳答案

确实有与DerefDerefMut 相关的接近官方的指南。根据 Rust API 指南中的 C-DEREF“只有智能指针实现 DerefDerefMut。” 您建议使用 Deref 会导致多个问题,因此强烈不建议这样做。

Deref 没有类型参数,但是有关联类型。实现它必须按照下面的代码完成,但永远不能为其他属性实现。

// don't try this at home!
impl Deref for IdAndUrl {
    type Target = Id;

    fn deref(&self) -> &Self::Target { &self.id }
}

此外,Deref 实现通过 deref 强制公开目标类型的方法,用您可能不想在此处拥有的接口(interface)污染结构。

可以查看其他转换特征(即 FromAsRefBorrow)并查看它们是否有意义 (C-CONV-TRAITS) .但根据我的解释,这些都没有意义。正如另一个答案中已经建议的那样,一个简单的 setter/getter 在这里是理想的:

impl IdAndUrl {
    fn id(&self) -> &Id { &self.id }
}

关于rust - 将 `Deref` 实现为返回复合结构的字段是惯用的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52771722/

相关文章:

asynchronous - 在需要特征对象的上下文中使用借入参数的异步函数

python - Pyo3 中具有自引用的异步函数

dependency-injection - 在 Rust 中,依赖注入(inject)容器返回对本地函数中分配的值的引用根本不可能吗?

rust - 字符串连接错误 : expected a literal

generics - 有没有一种方法可以使用通用类型别名作为Rust中函数的通用类型

promise - Rust/Webassembly/wasm-bindgen - 从 `js_sys' Promise 获取值

windows - 我应该使用哪个版本的 gcc 来正确构建 ruSTLearn crate?

multithreading - 我如何使用 Rayon 将大范围拆分为多个范围 block ,并让每个线程在一个 block 中找到?

sqlite - 如何使用 rusqlite crate 打开带有标志的连接?

rust - `Cloned` 迭代器适配器如何与 `Iterator<T>` 一起工作?