pub unsafe fn map_unchecked<U, F>(self, func: F) -> Pin<&'a U> where F: FnOnce(&T) -> &U, U: ?Sized,
FnOnce(&T) -> &U params是一个引用,所以它无论如何都不能移动T。为什么这个函数是unsafe?有一个同样的问题here,但不能理解这个例子:
FnOnce(&T) -> &U
T
unsafe
p8ekf7hl1#
Rust标准库中几乎所有的unsafe函数都有解释原因的文档。从Pin::map_unchecked的文档中:通过Map内部值来构造新接点。例如,如果你想获取某个字段的Pin,你可以使用它在一行代码中访问该字段。然而,这些“固定投影”有几个陷阱;请参阅pin模块文档以了解有关该主题的更多详细信息。
Pin::map_unchecked
Pin
pin
此功能不安全。你必须保证你返回的数据不会移动,只要参数值不移动(例如,因为它是该值的字段之一),并且你不会从你接收的参数中移出到内部函数。这与Pin::new_unchecked不安全的原因基本相同。固定一个值意味着它必须 * 永远不会再次移动 *,而不仅仅是在Pin保护的情况下。但是,仅此功能无法确保该保证,必须由使用它的开发人员提供。所链接的pin模块包括许多 * 结构固定 * 必须遵循的要求,即如果从Pin<&Self>获取一个字段需要该字段也被固定,这是使用map_unchecked的主要原因。要求包括:你不能给予&mut在其他地方访问它,它不能从甚至在Drop实现中被移动,它不能被释放,除非它被丢弃,等等。
Pin::new_unchecked
Pin<&Self>
map_unchecked
&mut
Drop
1条答案
按热度按时间p8ekf7hl1#
Rust标准库中几乎所有的
unsafe
函数都有解释原因的文档。从Pin::map_unchecked
的文档中:通过Map内部值来构造新接点。
例如,如果你想获取某个字段的
Pin
,你可以使用它在一行代码中访问该字段。然而,这些“固定投影”有几个陷阱;请参阅pin
模块文档以了解有关该主题的更多详细信息。安全
此功能不安全。你必须保证你返回的数据不会移动,只要参数值不移动(例如,因为它是该值的字段之一),并且你不会从你接收的参数中移出到内部函数。
这与
Pin::new_unchecked
不安全的原因基本相同。固定一个值意味着它必须 * 永远不会再次移动 *,而不仅仅是在Pin
保护的情况下。但是,仅此功能无法确保该保证,必须由使用它的开发人员提供。所链接的
pin
模块包括许多 * 结构固定 * 必须遵循的要求,即如果从Pin<&Self>
获取一个字段需要该字段也被固定,这是使用map_unchecked
的主要原因。要求包括:你不能给予&mut
在其他地方访问它,它不能从甚至在Drop
实现中被移动,它不能被释放,除非它被丢弃,等等。