【问题标题】:Is there a way in rust to mark a type as non-droppable?有没有办法在 rust 中将类型标记为不可丢弃?
【发布时间】:2020-05-09 15:33:35
【问题描述】:

我想让它成为编译器错误以允许删除类型,而不是必须忘记它。我的用例是一种类型,它表示必须返回到其源进行清理的各种句柄。这样 API 的用户就不会意外泄漏句柄。他们将被要求要么将句柄返回到它的源,要么明确地忘记它。在源代码中,相关资源将被清理,并且句柄被显式遗忘。

【问题讨论】:

  • 为什么不在构造函数中抢先泄漏它并返回一个'static 引用,而不是按值构造它并依赖用户做正确的事情?

标签: rust


【解决方案1】:

文章The Pain Of Real Linear Types in Rust 提到了这一点。相关引用:

我见过的一个极端选择是将drop() 实现为 abort("this value must be used")。那么所有“适当的”消费者 mem::forget 值,防止这个“破坏性炸弹”发生 离开。这提供了严格的必须使用值的动态版本。 尽管它仍然容易受到析构函数泄漏的几种方式的影响, 这在实践中并不是一个重要的问题。大多数情况下它只是臭 因为它是动态的,Rust 用户想要静态验证。

最终,Rust 缺乏对这种类型的“适当”支持。

所以,假设您想要静态检查,答案是否定的。

【讨论】:

  • 我对 Rust 不是很流利,但是是否可以将句柄包装在一个虚拟的 struct 中并制作句柄源以从这个句柄结构中借用一些虚拟引用?这样如果一个句柄被丢弃,那么source会产生doesn't live long enough错误,这不是自描述的,但是这种行为可以在cmets中描述。
  • @AlexLarionov 是的,这一定是运行时错误。
  • 谢谢,我得出了同样的结论,即在 drop 中出现恐慌,希望有像 send 这样的特性可以将类型标记为不可丢弃。
【解决方案2】:

您可以要求用户传递一个返回句柄 (FnOnce(Handle) -> Handle) 的函数对象,只要没有其他方法可以创建句柄。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多