bli00 Asked: 2024-09-12 04:44:38 +0800 CST2024-09-12 04:44:38 +0800 CST 2024-09-12 04:44:38 +0800 CST `tokio::pin!` 和 `std::pin::pin!` 之间的区别? 772 我原本以为前者只是后者的重新导出,但看起来并非如此。这两个pin!宏有什么区别,如何决定使用哪一个? rust 1 个回答 Voted Best Answer Chayim Friedman 2024-09-12T04:55:28+08:002024-09-12T04:55:28+08:00 tokio::pin!()比较旧,所以如果您需要支持早于 1.68.0 的 Rust 版本,则必须使用它或来自其他包的类似宏(例如futures::pin_mut!())。 主要区别在于它比 std 的pin!()更舒适、更方便。所有第三方pin!()宏都有两种形式之一: pin!(let mut variable = value); // or let variable = todo!(); pin!(variable); (通常具有方便的功能,例如在一次宏调用中声明多个变量)。而 std 的pin!()形式为: let mut variable = pin!(value); 除了更好看(这看起来更像是一个函数调用而不是自定义宏)之外,它还具有放置在任何表达式位置的独特能力,例如在函数调用中: foo(pin!(value)); 尽管如果函数的返回值从固定位置借用,但这将无法编译。 Std 利用其特殊地位来实现这一点。除此以外,没有哪个 crate 可以创建这种既可用于变量声明又可用于表达式的宏(尽管可以创建两个单独的宏)。因此 crate 选择仅提供前者。
tokio::pin!()
比较旧,所以如果您需要支持早于 1.68.0 的 Rust 版本,则必须使用它或来自其他包的类似宏(例如futures::pin_mut!()
)。主要区别在于它比 std 的
pin!()
更舒适、更方便。所有第三方pin!()
宏都有两种形式之一:(通常具有方便的功能,例如在一次宏调用中声明多个变量)。而 std 的
pin!()
形式为:除了更好看(这看起来更像是一个函数调用而不是自定义宏)之外,它还具有放置在任何表达式位置的独特能力,例如在函数调用中:
尽管如果函数的返回值从固定位置借用,但这将无法编译。
Std 利用其特殊地位来实现这一点。除此以外,没有哪个 crate 可以创建这种既可用于变量声明又可用于表达式的宏(尽管可以创建两个单独的宏)。因此 crate 选择仅提供前者。