std :: ops :: Add或core :: ops :: Add?

Fil*_*erg 10 standard-library rust

这两个特征(std :: ops :: Add,core :: ops :: Add)提供相同的功能,并且它们都使用相同的示例(两者都使用std::ops::Add).他们的实施者有所不同.

应该默认使用std::ops::Add吗?为什么两者相对而存在呢?

huo*_*uon 15

它们实际上完全相同,尽管实现者的列表略有不同.

core库专为裸机/低级任务而设计,因此比std假设存在操作系统所能提供的更准分.然而,人们使用std会想是这样的东西在core太(如AddOption或其他),并因此避免必须同时加载stdcore,std从一切重导出core,通过pub use.也就是说,std为其提供别名/导入路径core.

一些不幸的错误消息,编译器指向项目的原始源,而不是reexport,这可能不在您正在的箱子中extern crate.


小智 14

没有两个特征.有一个特征是以几个可互换的名称导出的.这远非独一无二.实际上,所有内容core都是从std,并且几乎总是在完全相同的路径下导出(即,您可以用"std"替换"核心"前缀).

至于你应该使用哪一个:如果你有理由不链接到标准库(#![no_std]),那么std::*一个不可用,所以很明显你使用core::*.如果在另一方面,你使用标准库,你应该使用std::*再出口.这是更习惯的,需要更少的打字.

  • @LukasKalbertodt关于此的惯例仍不清楚.你不能使用`no_std`中的`std` crate,即使它碰巧使用了`core`中的`std`的子集,这也是一个自由应用它的理由.但是如果一个'no_std`箱后来找到了依赖于'std`开始的理由,这将是一个突破性的变化,所以有些人会担心太过于"不快乐". (3认同)