gpt4 book ai didi

rust - Rust 中的 "fundamental type"是什么?

转载 作者:行者123 更新时间:2023-11-29 07:43:49 27 4
gpt4 key购买 nike

我在某处找到了术语“基本类型”(及其属性 #[fundamental]),而现在我想了解更多有关它的信息。我依稀记得是关于在某些情况下放宽一致性规则。我认为引用类型就是这样的基本类型。

不幸的是,网络搜索并没有带我走多远。 Rust 引用文献没有提到它(据我所知)。我刚找到 an issue about making tuples fundamental typesthe RFC that introduced the attribute .但是,RFC 中只有一段是关于基本类型的:

  • A #[fundamental] type Foo is one where implementing a blanket impl over Foo is a breaking change. As described, & and &mut are fundamental. This attribute would be applied to Box, making Box behave the same as & and &mut with respect to coherence.

我发现措辞相当难以理解,感觉我需要深入了解完整的 RFC 才能理解基本类型的这一点。我希望有人能用更简单的术语来解释基本类型(当然不要简化太多)。这个问题也可以作为一个容易找到的知识。

为了理解基本类型,我想回答这些问题(当然,除了主要的“它们甚至是什么?”问题之外):

  • 基本类型能否比非基本类型做更多的事情?
  • 作为库作者,我能否通过将某些类型标记为 #[fundamental] 以某种方式受益?
  • 核心语言或标准库中的哪些类型是基础的?

最佳答案

通常,如果库具有通用类型 Foo<T> , 下游 crate 无法在其上实现特征,即使 T是一些本地类型。例如,

( crate_a )

struct Foo<T>(pub t: T)

( crate_b )

use crate_a::Foo;

struct Bar;

// This causes an error
impl Clone for Foo<Bar> {
fn clone(&self) -> Self {
Foo(Bar)
}
}

对于在 Playground 上运行的具体示例(即给出错误),

use std::rc::Rc;

struct Bar;

// This causes an error
// error[E0117]: only traits defined in the current crate
// can be implemented for arbitrary types
impl Default for Rc<Bar> {
fn default() -> Self {
Rc::new(Bar)
}
}

(playground)


这通常使 crate 作者能够在不破坏下游 crate 的情况下添加(一揽子)特性的实现。这在最初不确定类型是否应该实现特定特征但后来很清楚它应该实现的情况下非常有用。例如,我们可能有某种最初不实现 num-traits 特征的数字类型。 .这些特性可以在以后添加而无需进行重大更改。

但是,在某些情况下,库作者希望下游 crate 能够自己实现特征。这是 #[fundamental] 的位置属性进来了。当放置在一个类型上时,任何当前没有为该类型实现的特征都不会被实现(除非有重大变化)。因此,只要类型参数是本地的,下游 crates 就可以为该类型实现特征(有一些复杂的规则来决定哪些类型参数对此起作用)。由于基本类型不会实现给定的特征,因此可以自由实现该特征而不会导致连贯性问题。

例如,Box<T>标记为 #[fundamental] ,因此以下代码(类似于上面的 Rc<T> 版本)有效。 Box<T>没有实现 Default (除非 T 实现了 Default )所以我们可以假设它将来不会因为 Box<T>是根本。请注意,实现 Default对于 Bar会引起问题,从那以后Box<Bar>已经实现 Default .

struct Bar;

impl Default for Box<Bar> {
fn default() -> Self {
Box::new(Bar)
}
}

(playground)


另一方面,特征也可以用#[fundamental]来标记。 .这对基本类型具有双重意义。如果任何类型当前未实现基本特征,则可以假定该类型将来不会实现它(同样,除非发生重大变化)。我不确定这在实践中是如何使用的。在代码中(链接如下),FnMut被标记为基础,并指出正则表达式需要它(关于 &str: !FnMut 的内容)。我找不到它在 regex 中的使用位置 crate 或其他地方使用。

理论上,如果 Add trait 被标记为基础(已经讨论过),这可用于在尚不具备它的事物之间实现加法。例如,添加 [MyNumericType; 3] (pointwise),这在某些情况下可能很有用(当然,使 [T; N] 成为基础也可以做到这一点)。


原始基本类型是 &T , &mut T (参见 here 以了解所有通用基本类型的演示)。在标准库中, Box<T> Pin<T> 也被标记为基础。

标准库中的基本特征是 Sized , Fn<T> , FnMut<T> , FnOnce<T> Generator .


请注意 #[fundamental]属性目前不稳定。跟踪问题是 issue #29635 .

关于rust - Rust 中的 "fundamental type"是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59022263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com