热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

枚举如何使用堆或堆栈类型处理其子类型?

问题标题可能有点误导,因为我不知道如何正确表达我的意思。这是问题所在。我有这段代码,它按预期工作。enumAnswer{Yes,

问题标题可能有点误导,因为我不知道如何正确表达我的意思。

这是问题所在。我有这段代码,它按预期工作。

enum Answer {
Yes,
No(i32),
}
pub struct QnA {
question: String,
answer: Answer,
}
fn check(qna: &QnA) {
match qna.answer {
Answer::Yes => println!("positive"),
Answer::No(why) => println!("negative cause {}", why),
}
}

我感兴趣的是那match部分。假设我将枚举更改为Answer这样的内容,

enum Answer {
Yes,
No(String),
}

比赛将不再有效。它说它不能移出引用后面的东西。为了使它工作,我必须&qna.answer在比赛中使用引用。

我知道错误只发生在堆使用的类型上。所以我可以得到一个提示,这是因为所有权系统,但我无法直观地弄清楚枚举和结构之间的关系。我不知道枚举如何使用堆或堆栈处理其子类型。

回答



我知道错误只发生在堆使用的类型上。

这是不真实的。错误发生在没有实现的类型上Copy,这意味着它们必须被移动。i32和大多数其他原语实现Copy,这意味着您可以自由地对引用进行模式匹配并隐式复制非引用值。但是,对于Copy像 那样的非值String,隐式复制不再发生,并且您尝试将值移出引用,这是不允许的。

看:


  • Rust 编程语言:什么是所有权?

  • Rust by example:所有权和移动

  • Rust 文档:我的类型Copy什么时候可以是?(以及随后的“我的类型何时不能Copy?”和“我的类型何时应该Copy?”)

顺便提一下,Rust 的类型系统没有区分堆类型和堆栈类型,因为它们是不必要的区别。堆只是一块内存,就像某些内存分配器决定使用的堆栈一样,而在核心库中,没有堆分配器。通常,只有堆栈上的类型才能实现Copy,因为这些类型复制起来很便宜,而堆内存必须重新分配。然而,这并不是说栈上的每个类型都实现了Copy(你可以在栈上创建一个结构体而不在它上面实现 Copy),或者堆上没有类型实现Copy(你可以有一个自定义的分配器或垃圾收集器) )。



  • I think that the OP confusion comes from the Book saying (in that chapter you link): "Rust has a special annotation called the Copy trait that we can place on types like integers that are stored on the stack". It seems to equal stack-allocated with `Copy`.





推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • 2021年最详细的Android屏幕适配方案汇总
    1Android屏幕适配的度量单位和相关概念建议在阅读本文章之前,可以先阅读快乐李同学写的文章《Android屏幕适配的度量单位和相关概念》,这篇文章 ... [详细]
  • dp[i][j]+dp[i-1][k],match(j,k). 与其说是DP,不如说是模拟题。第一个和最后一个数字要单独讨论,中间的要符合剩下的条件:中间一列和剩下的两 ... [详细]
  • 5G新空口关键技术之信道编码
    信道编码概念  信道编码过程包括添加循环冗余校验码(CRC,CyclicRedundancyCheck)、码块分割(Code ... [详细]
  • jdk 1.7 ConcurrentHashmap的底层原理
    ConcurrentMashmap与HashTable的区别ConcurrentMashmap和HashTable都是线程安全的。HashTable内部通过一个table[]来存 ... [详细]
author-avatar
or70woo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有