【rCore OS 开源操作系统】Rust 练习题题解: Structs

news/2024/12/21 20:05:01/

OS_Rust__Structs_0">【rCore OS 开源操作系统】Rust 练习题题解: Structs

摘要

rCore OS 开源操作系统训练营学习中的代码练习部分。
在此记录下自己学习过程中的产物,以便于日后更有“收获感”。
后续还会继续完成其他章节的练习题题解。

正文

structs1

题目
rust">// structs1.rs
//
// Address all the TODOs to make the tests pass!
//
// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a
// hint.// I AM NOT DONEstruct ColorClassicStruct {// TODO: Something goes here
}struct ColorTupleStruct(/* TODO: Something goes here */
);#[derive(Debug)]
struct UnitLikeStruct;#[cfg(test)]
mod tests {use super::*;#[test]fn classic_c_structs() {// TODO: Instantiate a classic c struct!// let green =assert_eq!(green.red, 0);assert_eq!(green.green, 255);assert_eq!(green.blue, 0);}#[test]fn tuple_structs() {// TODO: Instantiate a tuple struct!// let green =assert_eq!(green.0, 0);assert_eq!(green.1, 255);assert_eq!(green.2, 0);}#[test]fn unit_structs() {// TODO: Instantiate a unit-like struct!// let unit_like_struct =let message = format!("{:?}s are fun!", unit_like_struct);assert_eq!(message, "UnitLikeStructs are fun!");}
}
题解

参考《定义和举例说明结构体 - Rust 程序设计语言 中文版》第五章

structs 的基本如下:

rust">// 定义
struct User {age: i32,active: bool,username: String,email: String,sign_in_count: u64,
}
// 实现方法
impl User{fn info(&self) -> i32 {&self.age + 1 // 不加分号,就是 tail exp, 自带 return}
}
// 实例化
let rect1 = Rectangle {width: 30,height: 50,
};rect1.area()// 元组结构体定义struct User2(i32, i32, i32);let user = User2(1, 1, 1);// 类单元结构体定义struct User3;let user3 = User3;

所以答案也就是呼之欲出了:

rust">// structs1.rs
//
// Address all the TODOs to make the tests pass!
//
// Execute `rustlings hint structs1` or use the `hint` watch subcommand for a
// hint.struct ColorClassicStruct {// TODO: Something goes herered: i32,green: i32,blue: i32,
}struct ColorTupleStruct(/* TODO: Something goes here */ i32, i32, i32);#[derive(Debug)]
struct UnitLikeStruct;#[cfg(test)]
mod tests {use super::*;#[test]fn classic_c_structs() {// TODO: Instantiate a classic c struct!let green = ColorClassicStruct {red: 0,green: 255,blue: 0,};assert_eq!(green.red, 0);assert_eq!(green.green, 255);assert_eq!(green.blue, 0);}#[test]fn tuple_structs() {// TODO: Instantiate a tuple struct!let green = ColorTupleStruct(0, 255, 0);assert_eq!(green.0, 0);assert_eq!(green.1, 255);assert_eq!(green.2, 0);}#[test]fn unit_structs() {// TODO: Instantiate a unit-like struct!let unit_like_struct = UnitLikeStruct;let message = format!("{:?}s are fun!", unit_like_struct);assert_eq!(message, "UnitLikeStructs are fun!");}
}

Structs2

题目
rust">// structs2.rs
//
// Address all the TODOs to make the tests pass!
//
// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a
// hint.// I AM NOT DONE#[derive(Debug)]
struct Order {name: String,year: u32,made_by_phone: bool,made_by_mobile: bool,made_by_email: bool,item_number: u32,count: u32,
}fn create_order_template() -> Order {Order {name: String::from("Bob"),year: 2019,made_by_phone: false,made_by_mobile: false,made_by_email: true,item_number: 123,count: 0,}
}#[cfg(test)]
mod tests {use super::*;#[test]fn your_order() {let order_template = create_order_template();// TODO: Create your own order using the update syntax and template above!// let your_order =assert_eq!(your_order.name, "Hacker in Rust");assert_eq!(your_order.year, order_template.year);assert_eq!(your_order.made_by_phone, order_template.made_by_phone);assert_eq!(your_order.made_by_mobile, order_template.made_by_mobile);assert_eq!(your_order.made_by_email, order_template.made_by_email);assert_eq!(your_order.item_number, order_template.item_number);assert_eq!(your_order.count, 1);}
}
解析

第二章节主要是考察结构体方法的实现。
参考:https://doc.rust-lang.org/stable/book/ch05-01-defining-structs.html#creating-instances-from-other-instances-with-struct-update-syntax

这里提到的update语法,是类似 JS 中的对象展开+字段覆盖的操作。

但是这里的覆盖是有固定优先级的,和字段书写顺序无关

rust">// structs2.rs
//
// Address all the TODOs to make the tests pass!
//
// Execute `rustlings hint structs2` or use the `hint` watch subcommand for a
// hint.#[derive(Debug)]
struct Order {name: String,year: u32,made_by_phone: bool,made_by_mobile: bool,made_by_email: bool,item_number: u32,count: u32,
}fn create_order_template() -> Order {Order {name: String::from("Bob"),year: 2019,made_by_phone: false,made_by_mobile: false,made_by_email: true,item_number: 123,count: 0,}
}#[cfg(test)]
mod tests {use super::*;#[test]fn your_order() {let order_template = create_order_template();// TODO: Create your own order using the update syntax and template above!let your_order = Order {name: String::from("Hacker in Rust"),count: 1,..order_template};assert_eq!(your_order.name, "Hacker in Rust");assert_eq!(your_order.year, order_template.year);assert_eq!(your_order.made_by_phone, order_template.made_by_phone);assert_eq!(your_order.made_by_mobile, order_template.made_by_mobile);assert_eq!(your_order.made_by_email, order_template.made_by_email);assert_eq!(your_order.item_number, order_template.item_number);assert_eq!(your_order.count, 1);}
}

Structs3

题目
rust">// structs3.rs
//
// Structs contain data, but can also have logic. In this exercise we have
// defined the Package struct and we want to test some logic attached to it.
// Make the code compile and the tests pass!
//
// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a
// hint.// I AM NOT DONE#[derive(Debug)]
struct Package {sender_country: String,recipient_country: String,weight_in_grams: i32,
}impl Package {fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package {if weight_in_grams <= 0 {panic!("Can not ship a weightless package.")} else {Package {sender_country,recipient_country,weight_in_grams,}}}fn is_international(&self) -> ??? {// Something goes here...}fn get_fees(&self, cents_per_gram: i32) -> ??? {// Something goes here...}
}#[cfg(test)]
mod tests {use super::*;#[test]#[should_panic]fn fail_creating_weightless_package() {let sender_country = String::from("Spain");let recipient_country = String::from("Austria");Package::new(sender_country, recipient_country, -2210);}#[test]fn create_international_package() {let sender_country = String::from("Spain");let recipient_country = String::from("Russia");let package = Package::new(sender_country, recipient_country, 1200);assert!(package.is_international());}#[test]fn create_local_package() {let sender_country = String::from("Canada");let recipient_country = sender_country.clone();let package = Package::new(sender_country, recipient_country, 1200);assert!(!package.is_international());}#[test]fn calculate_transport_fees() {let sender_country = String::from("Spain");let recipient_country = String::from("Spain");let cents_per_gram = 3;let package = Package::new(sender_country, recipient_country, 1500);assert_eq!(package.get_fees(cents_per_gram), 4500);assert_eq!(package.get_fees(cents_per_gram * 2), 9000);}
}
解析

根据意思,补全结构体的方法实现,对比是否为同一个地区,判断是否相同,以及计算费用,比较简单。

rust">// structs3.rs
//
// Structs contain data, but can also have logic. In this exercise we have
// defined the Package struct and we want to test some logic attached to it.
// Make the code compile and the tests pass!
//
// Execute `rustlings hint structs3` or use the `hint` watch subcommand for a
// hint.#[derive(Debug)]
struct Package {sender_country: String,recipient_country: String,weight_in_grams: i32,
}impl Package {fn new(sender_country: String, recipient_country: String, weight_in_grams: i32) -> Package {if weight_in_grams <= 0 {panic!("Can not ship a weightless package.")} else {Package {sender_country,recipient_country,weight_in_grams,}}}fn is_international(&self) -> bool {// Something goes here...&self.sender_country != &self.recipient_country}fn get_fees(&self, cents_per_gram: i32) -> i32 {// Something goes here...&self.weight_in_grams * cents_per_gram}
}#[cfg(test)]
mod tests {use super::*;#[test]#[should_panic]fn fail_creating_weightless_package() {let sender_country = String::from("Spain");let recipient_country = String::from("Austria");Package::new(sender_country, recipient_country, -2210);}#[test]fn create_international_package() {let sender_country = String::from("Spain");let recipient_country = String::from("Russia");let package = Package::new(sender_country, recipient_country, 1200);assert!(package.is_international());}#[test]fn create_local_package() {let sender_country = String::from("Canada");let recipient_country = sender_country.clone();let package = Package::new(sender_country, recipient_country, 1200);assert!(!package.is_international());}#[test]fn calculate_transport_fees() {let sender_country = String::from("Spain");let recipient_country = String::from("Spain");let cents_per_gram = 3;let package = Package::new(sender_country, recipient_country, 1500);assert_eq!(package.get_fees(cents_per_gram), 4500);assert_eq!(package.get_fees(cents_per_gram * 2), 9000);}
}

http://www.ppmy.cn/news/1534786.html

相关文章

kubernets资源类型service详细介绍

文章目录 什么是Service?Kubernetes Service详细介绍相关配置文件详细解释 什么是Endpoint一、Endpoint的定义与功能二、Endpoint的组成与结构三、Endpoint的工作原理四、Endpoint的使用场景与优势 Service底层实现原理一、Service的创建二、服务发现三、流量路由 其他 什么是…

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时

Spring Gateway学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

忘记 MySQL 密码怎么办:破解 root 账户密码

忘记 MySQL 密码怎么办&#xff1a;破解 root 账户密码 目录 忘记 MySQL 密码怎么办&#xff1a;破解 root 账户密码1、修改 MySQL 配置文件2、不使用密码登录 MySQL3、重置 root 用户密码4、修改 MySQL 配置文件并重启 MySQL 服务5、使用新密码登录 MySQL 如果忘记密码导致无法…

在 VSCode IDE 中,使用 ESP32-S3 的 USB 接口进行调试

使用 USB 管脚进行 JTAG 调试&#xff0c;在 VSCode 环境中的使用请阅读官方说明&#xff1a;Configuration for Visual Studio Code Debug 1、先编译工程并烧录固件 2、打开 OpenOCD 环境&#xff1a; 键 F1 —> OpenOCD 板配置 —> USB-JTAG键 F1 —> OpenOCD 管理…

技术美术百人计划 | 《5.1.3 PBR-基于物理的灯光》笔记

1. 辐射度学 定义&#xff1a;辐射度学是一门以整个电磁波段的电磁辐射能测量为研究的科学。 而计算机图形学中涉及的辐射度学&#xff0c;则集中于整个电磁波普中光学谱段中的可见光谱段的辐射能的计算。 1.1. 立体角 概念&#xff1a;单位球体上的一块区域对应的球面部分的…

electron-builder 首次执行报错问题解决

假日想研究一下 react electron 的使用&#xff0c;结果发现首次打包疯狂报错&#xff0c;研究了一下之后才发现是第一次的话 electron-builder 会从外面下载依赖包到我们系统中&#xff0c;由于某种力量导致压缩包无法下载或者是下载过慢导致失败&#xff0c;要解决其实也简单…

开发能够抵御ICS对抗性攻击的边缘弹性机器学习集成

论文标题&#xff1a;《Development of an Edge Resilient ML Ensemble to Tolerate ICS Adversarial Attacks》 作者信息&#xff1a; Likai Yao, NSF Center for Cloud and Autonomic Computing, University of Arizona, Tucson, AZ 85721 USAQinxuan Shi, School of Elect…