- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在某处找到了术语“基本类型”(及其属性 #[fundamental]
),而现在我想了解更多有关它的信息。我依稀记得是关于在某些情况下放宽一致性规则。我认为引用类型就是这样的基本类型。
不幸的是,网络搜索并没有带我走多远。 Rust 引用文献没有提到它(据我所知)。我刚找到 an issue about making tuples fundamental types和 the RFC that introduced the attribute .但是,RFC 中只有一段是关于基本类型的:
- A
#[fundamental]
typeFoo
is one where implementing a blanket impl overFoo
is a breaking change. As described,&
and&mut
are fundamental. This attribute would be applied toBox
, makingBox
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)
}
}
这通常使 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)
}
}
另一方面,特征也可以用#[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/
简介 我正在开发一个代码生成器,它可以生成围绕 ctypes.cdll 的函数加载的函数。生成器将获取有关 ctypes 的信息。的参数和返回值,并生成一些行为(并且在某种程度上看起来)像这样的东西:
我是 c# 和 Unity 的新手,我有一个问题。我无法理解 OnCollisionEnter 的基本工作原理。 比如,如果我有一个地形和一个悬停在它上面的球体,它有刚体组件,我写:- void On
我有兴趣编写一个非常简约的编译器。 我想编写一个满足以下条件的小软件(用 C/C++): 以 ELF 格式输出 (*nix) 输入是一个文本文件 类C语法和句法 没有链接器 没有预处理器 非常小(最多
有人在 Delphi 2009 中使用/转换过“Delphi Fundamentals”吗? -http://fundementals.sourceforge.net/ 我在我的项目中使用字典(cAr
注意以下代码: Control foo = null; Control bar = null; int i = 0; protected void Page_Load(object sender, E
我在某处找到了术语“基本类型”(及其属性 #[fundamental]),而现在我想了解更多有关它的信息。我依稀记得是关于在某些情况下放宽一致性规则。我认为引用类型就是这样的基本类型。 不幸的是,网络
请考虑这两段代码(注意字符串和整数的区别): a = [] a[:] = '1' 和 a = [] a[:] = 1 在第一种情况下,a 是 ['1']。第二,我得到错误 TypeError: can
明年秋季,我将教授一门有关编程基础知识的类(class),即第一年的计算机科学类(class)。在这样的类(class)中教授指针的利弊是什么? (我的立场:应该教他们)。 编辑:我对“迎合你的听众”
在典型的业务应用程序中,用于搜索的表单是很常见的。 一些基本功能是: 包含搜索条件的 Pane 显示结果的网格 在网格上排序 在结果网格中选择项目时打开的详细信息页面 您希望业务应用程序的搜索功能有哪
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
在从 google gradle 插件 3.1.4 更新到现在最新的 3.2.1 后,我试图让我的应用程序重新构建,我认为我首先让我的 instantapp 工作的方法可能有问题,所以我发布这个问题是
Google 肯定会使用这些元标记。我测试了一个页面 here添加后,该工具会获取数据......因此 og(开放图谱)标签对于 Google 搜索非常重要。 因此我们需要深入了解它们。但是,访问 o
在书中Coders at Work (p355),Guy Steele 谈到 C++: I think the decision to be backwards-compatible with C i
在 MVC 中,一个模型可以有多个 View ,而在 WPF 中,XAML 代码隐藏模型严格限制为 1 个 XAML( View ),难道 WPF/XAML 从一开始就没有 MVC 方面的缺陷吗? 最
最近主流语言(如 perl 和 C#)转向匿名方法/函数是重要的事情,还是违反 OO 原则的奇怪功能? 最新版本的英特尔线程构建模块和微软的 PPL 和 Linq 等依赖于此类事物的库是好事还是坏事?
NumPy : import numpy as np nparr = np.array([[1, 5],[2,6], [3, 7]]) print(nparr) print(nparr[0])
我正在尝试理解 REST。在 REST 下,GET 不得在服务器上触发事务(这是每个人都同意的定义,它是 REST 的基础)。 假设您有一个网站像 stackoverflow.com(我说像 所以如果
我们正在将游戏从 C++ 移植到 Web;游戏大量使用STL。 您能否提供与以下 STL 容器等效的类的简短比较图表(如果可能,提供一些基本操作的代码示例,如插入/删除/搜索和(如果适用)equal_
我是一名优秀的程序员,十分优秀!