Rust的布尔值和其他原始类型在哪里实现?

lje*_*drz 12 primitive types rust

我会通过后面的一些鲁斯特的基本类型的代码,例如惊喜简单实现Option<T>怪异的宏观神奇的背后tuple,我能找到所有我在想要的类型libcore.除了一个 - bool.我在其他任何地方都找不到它.

boolRust 背后的代码在哪里?我知道这不是最新颖的类型,但我很惊讶我找不到它.

感谢Francis和rodrigo的回答,我注意到我为其他原语找到的代码只是它们的特征和相关的宏,而不是实际的实现.

Rust书中指出原语是内置于语言中的,但我对这种解释并不满意.他们什么时候建成?它可以追溯到Rust编译器最初使用Rust构建的时候还是在它仍然在OCaml中构建时发生的?是否存在任何相关代码?

sgr*_*rif 13

所以这里有关于编译器中发生了什么的更多信息.对于初学者,正如已经提到的,布尔值发生的实际操作完全由LLVM处理,并直接转换为相应的CPU指令.虽然在某些情况下代码会因为自举而神奇地出现,但这不是其中之一.编译器专门用于处理这些类型并发出正确的LLVM指令.

对于编译的最早部分(例如在宏扩展期间),类型bool并不特殊.它只是标识符的一些路径bool.最终在这里它将转换为原始类型.这里有类型的实际定义.

现在让我们来看看!运营商的运作方式.正如我之前提到的,libcore中的代码impl Not for bool永远不会被使用.表单中的代码!expr转换为<T as Not>::not(expr) 此处.但是,您会注意到它会检查这个特定表达式是否实际上是一个方法调用,并且只是将它留下来就!expr好像它不是一个方法调用.怎么知道的?MIR中的调用只是缓存查找.在类型检查过程中填充了缓存.是缓存插入发生的地方 - 基本上检查Not特征是否在任何时候看到特定类型的特征!.你会注意到这一行特别排除了布尔值和整数类型,最终直接编译成LLVM指令.

这是它如何定义的粗略画面.您可以在其他基元的相同文件中找到类似的代码.从理论上讲,某个地方可能存在某条线enum bool { true, false }- 但最终这个相同的代码仍然需要覆盖它并发出适当的LLVM内在函数,并且整数不能用这种方式表示.


Fra*_*gné 11

bool是一种原始类型.它们上的原始类型和操作由编译器实现,即编译器发出专用代码来对原始类型执行操作.

你会看到它bool实现了许多特征.这些实现来自libcore,但它们通常通过使用相应的运算符来实现.例如,Not::not通过返回来实现!self.对于任何非基本类型,这将以Not::not递归方式调用并导致堆栈溢出,但对于基本类型,编译器以不同方式解析运算符,并且仅为了通用代码的利益而提供这些特征实现.

  • 您将找到原始类型的_traits_实现(事实上,您可以在包中定义特征并自己为原始类型实现它),但您永远不会在任何库中找到原始类型的_definition_. (2认同)