什么是与C++;? 锈迹中的P说他们从C++中借用了这个属性。我找不到关于这个话题的任何东西。有人能解释一下单态化是什么意思吗?
对此不太清楚;你能链接到演讲吗?这可能是一句不假思索的话什么是与C++;? 锈迹中的P说他们从C++中借用了这个属性。我找不到关于这个话题的任何东西。有人能解释一下单态化是什么意思吗?,c++,rust,C++,Rust,对此不太清楚;你能链接到演讲吗?这可能是一句不假思索的话 Herman可能创造了一个类似模板专门化的术语,它从模板生成相互不相关的类型/对象(不是多态的或“单态的”),模板是多态结构。单态化意味着生成泛型函数的专门版本。如果我编写一个函数来提取任意对的第一个元素: fn first<A, B>(pair: (A, B)) -> A { let (a, b) = pair; return a; } 编译器将生成两个版本的first(),一个专用于整数对,另一个专
Herman可能创造了一个类似模板专门化的术语,它从模板生成相互不相关的类型/对象(不是多态的或“单态的”),模板是多态结构。单态化意味着生成泛型函数的专门版本。如果我编写一个函数来提取任意对的第一个元素:
fn first<A, B>(pair: (A, B)) -> A {
let (a, b) = pair;
return a;
}
编译器将生成两个版本的first()
,一个专用于整数对,另一个专用于字符串对
这个名字来源于编程语言术语“多态性”——意思是一个可以处理多种类型数据的函数。单形化是从多态代码到单形代码的转换。不确定是否有人还在看这个,但Rust文档确实提到了如何通过这个过程实现无成本抽象。发件人: 您可能想知道,当您 使用泛型类型参数。好消息是生锈的工具 泛型,使您的代码不会使用 泛型类型要比具体类型好 Rust通过对生成的代码执行单植根来实现这一点 正在编译时使用泛型。单晶化是指 通过填充混凝土将通用代码转换为特定代码 编译时使用的类型 在此过程中,编译器执行与我们使用的步骤相反的操作 创建清单10-5中的泛型函数:编译器查看 调用泛型代码并为 调用泛型代码时使用的具体类型 让我们通过一个使用该标准的示例来了解它是如何工作的 库的选项枚举:
let integer=Some(5);
让浮动=一些(5.0);
当Rust编译此代码时,它执行单晶化。在期间
在该过程中,编译器读取已在中使用的值
选项实例并标识两种类型的选项:一种是i32
另一个是f64。因此,它扩展了
选项转换为选项_i32和选项_f64,从而替换
一般定义和具体定义
代码的单形态版本如下所示。这个
通用选项将替换为由创建的特定定义
编译器:
//文件名:src/main.rs
枚举选项_i32{
一些(i32),
没有一个
}
枚举选项\u f64{
有些(f64),
没有一个
}
fn main(){
设integer=Option_i32::Some(5);
让float=Option_f64::Some(5.0);
}
因为Rust将泛型代码编译成指定类型的代码
在每个实例中,我们都不为使用泛型支付运行时成本。当
代码运行时,它的性能与我们复制每个代码时的性能一样
手工定义。单晶化过程使锈菌的
泛型在运行时非常有效
有一个很好的解释单晶在 单变体是通过填充编译时使用的具体类型,将泛型代码转换为特定代码的过程 从书本示例中,如果您已使用以下内容定义变量:
let integer=Some(5);
让浮动=一些(5.0);
当Rust编译此代码时,它执行单晶化。其间
过程中,编译器读取已在选项中使用的值
实例并标识两种选项
:一种是i32
,另一种是
isf64
。因此,它将选项的一般定义扩展为
Option_i32
和Option_f64
,从而将通用定义替换为
具体的
代码的单形态版本如下所示。泛型
选项
替换为编译器创建的特定定义:
文件名:src/main.rs
enum选项\u i32{
一些(i32),
没有一个
}
枚举选项\u f64{
有些(f64),
没有一个
}
fn main(){
设integer=Option_i32::Some(5);
让float=Option_f64::Some(5.0);
}
这是静态调度的另一个名称吗?@ TSePangNo不是,它更像C++模板和Java泛型之间的区别。在我看来,与在C++中java调用的(隐式)模板专长是一样的。不要与单态性混淆,单态性在逻辑上与多态性相反,即通过其父接口处理子类型。@tshepang静态调度是单态性的一种形式,特别是即席多态性的单态性。Ad Hoc多态性是C++和java中的锈迹和接口中的特征。这里的每个人都是指参数多态性的单形化,在C++中java和“模板”中称为“泛型”,这与静态调度非常不同,因为参数多态性与ad hoc多态性有很大的不同。注意java没有任何单一化,只有锈和C++。具体而言,(继续)(Read)(Read)和C++使用“专业化”来进行单态化参数多态性,如所接受的答案讨论的,默认情况下使用静态调度来单态化Ad Hoc多态性。它们还允许你在C++中使用生锈或虚拟方法来选择动态调度。相比之下,Java对所有东西都使用动态调度,甚至泛型(又称参数多态性)。欢迎来到Stack Overflow,谢谢你的回答。当提供主要由链接组成的aswer时,它是gen
first((1, 2));
first(("a", "b"));