在编程语言的世界中,Rust 以其安全性和高性能而闻名。今天,我们将通过一个简单的项目来探索 Rust 的魅力 —— 编写一个简单的命令行计算器。这个计算器将支持基本的算术运算(加、减、乘、除),并且可以通过用户输入进行交互。

完整代码

以下是完整的 Rust 代码,用于实现一个简单的命令行计算器。代码中包含了详细的注释,帮助你理解每个部分的功能。

use std::io;
use std::io::Write;fn main() {// 创建一个 UserTyper 实例,使用 CommandLineComputer 作为计算机let mut typer = UserTyper::new(CommandLineComputer);loop {// 提示用户输入表达式typer.type_expr();// 如果用户输入了 "q",则退出程序if typer.expr.contains("q") {break;}// 计算并打印结果println!("Result:{}", typer.compute());}
}// 定义一个计算机 trait,所有计算机都必须实现这个 trait
trait Computer {fn compute(&self, expr: &str) -> i32;
}// 实现一个简单的命令行计算机
struct CommandLineComputer;// 为 CommandLineComputer 实现 Computer trait
impl Computer for CommandLineComputer {fn compute(&self, expr: &str) -> i32 {// 初始化两个数字和一个操作符let mut num1 = String::new();let mut num2 = String::new();let mut op: Option<char> = None;// 遍历表达式中的每个字符for chr in expr.trim().chars() {if chr.is_digit(10) {// 如果是数字,根据操作符是否已确定,将数字添加到 num1 或 num2if op.is_none() {num1.push(chr);} else {num2.push(chr);}continue;}// 匹配操作符match chr {'+' | '-' | '*' | '/' if op.is_none() => op = Some(chr),_ if chr.is_whitespace() => continue,_ => panic!("Invalid character: {}", chr),}}// 检查表达式是否有效if num1.is_empty() || num2.is_empty() || op.is_none() {panic!("Invalid expression: {}", expr);}// 将字符串转换为数字let num1: i32 = num1.parse().unwrap();let num2: i32 = num2.parse().unwrap();let op: char = op.unwrap();// 根据操作符进行计算match op {'+' => num1 + num2,'-' => num1 - num2,'*' => num1 * num2,'/' => num1 / num2,_ => unreachable!(),}}
}// 定义一个用户输入处理结构
struct UserTyper<T: Computer> {computer: T,expr: String,
}// 为 UserTyper 实现方法
impl<T: Computer> UserTyper<T> {// 创建一个新的 UserTyper 实例fn new(computer: T) -> Self {Self {computer,expr: String::new(),}}// 提示用户输入表达式fn type_expr(&mut self) {self.expr.clear();print!("Please type an expression: ");io::stdout().flush().unwrap();io::stdin().read_line(&mut self.expr).expect("Failed to read line");}// 调用计算机进行计算fn compute(&self) -> i32 {self.computer.compute(&self.expr)}
}

代码讲解

主函数

fn main() {let mut typer = UserTyper::new(CommandLineComputer);loop {typer.type_expr();if typer.expr.contains("q") {break;}println!("Result:{}", typer.compute());}
}
  • UserTyper::new(CommandLineComputer):创建一个 UserTyper 实例,使用 CommandLineComputer 作为计算机。
  • typer.type_expr():提示用户输入一个表达式。
  • if typer.expr.contains("q"):如果用户输入了 “q”,则退出程序。
  • typer.compute():调用计算机进行计算,并打印结果。

计算机 Trait

trait Computer {fn compute(&self, expr: &str) -> i32;
}
  • 定义了一个 Computer trait,所有计算机都必须实现这个 trait。compute 方法接受一个字符串表达式,并返回一个整数结果。

命令行计算机实现

struct CommandLineComputer;impl Computer for CommandLineComputer {fn compute(&self, expr: &str) -> i32 {// 初始化两个数字和一个操作符let mut num1 = String::new();let mut num2 = String::new();let mut op: Option<char> = None;// 遍历表达式中的每个字符for chr in expr.trim().chars() {if chr.is_digit(10) {// 如果是数字,根据操作符是否已确定,将数字添加到 num1 或 num2if op.is_none() {num1.push(chr);} else {num2.push(chr);}continue;}// 匹配操作符match chr {'+' | '-' | '*' | '/' if op.is_none() => op = Some(chr),_ if chr.is_whitespace() => continue,_ => panic!("Invalid character: {}", chr),}}// 检查表达式是否有效if num1.is_empty() || num2.is_empty() || op.is_none() {panic!("Invalid expression: {}", expr);}// 将字符串转换为数字let num1: i32 = num1.parse().unwrap();let num2: i32 = num2.parse().unwrap();let op: char = op.unwrap();// 根据操作符进行计算match op {'+' => num1 + num2,'-' => num1 - num2,'*' => num1 * num2,'/' => num1 / num2,_ => unreachable!(),}}
}
  • CommandLineComputer:一个简单的命令行计算机结构体。
  • compute 方法
    • 初始化两个数字字符串和一个操作符。
    • 遍历表达式中的每个字符,将数字和操作符分别存储。
    • 检查表达式是否有效。
    • 将字符串转换为数字。
    • 根据操作符进行计算并返回结果。

用户输入处理

struct UserTyper<T: Computer> {computer: T,expr: String,
}impl<T: Computer> UserTyper<T> {fn new(computer: T) -> Self {Self {computer,expr: String::new(),}}fn type_expr(&mut self) {self.expr.clear();print!("Please type an expression: ");io::stdout().flush().unwrap();io::stdin().read_line(&mut self.expr).expect("Failed to read line");}fn compute(&self) -> i32 {self.computer.compute(&self.expr)}
}
  • UserTyper:一个结构体,用于处理用户输入和调用计算机进行计算。
  • new 方法:创建一个新的 UserTyper 实例。
  • type_expr 方法:提示用户输入一个表达式,并将其存储在 expr 中。
  • compute 方法:调用计算机进行计算,并返回结果。

运行程序

  1. 将代码保存为 main.rs
  2. 使用以下命令编译并运行程序:
    rustc main.rs
    ./main
    
  3. 在命令行中输入表达式,例如 10 + 20,程序将输出结果 30。输入 q 退出程序。

通过这个简单的项目,你可以看到 Rust 的强大功能,包括类型安全、模式匹配和错误处理。希望这个项目能帮助你更好地理解 Rust 编程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/910521.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/910521.shtml
英文地址,请注明出处:http://en.pswp.cn/news/910521.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

清华大学:《AI赋能教育 :高考志愿填报工具使用指南》下载

志愿填报的认知革命已经到来 “分数出来了&#xff0c;但不知道能上什么学校……” “喜欢这个专业&#xff0c;但不知道就业前景怎么样&#xff1f;” “到底是选热门专业还是选兴趣爱好&#xff1f;” 这些让百万家庭彻夜难眠的问题&#xff0c;你是否正在经历&#xff1f; …

【科技公司的管理】

如何打造高效、人性化的目标驱动型公司&#xff1f;——OKR管理法绩效薪酬体系全指南 你希望公司目标清晰、员工高效、多劳多得&#xff0c;同时避免马斯克式的“冷血管理”&#xff0c;兼顾员工生活需求。以下是系统性解决方案&#xff0c;涵盖目标设定&#xff08;OKR&#x…

小白成长之路--nginx基础配置(一)

文章目录 一、概述1.1 Nginx 特点1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服务搭建2.1安装2.2 目录结构2.3 配置文件作用2.4 nginx,conf配置文件详解2.5 核心命令2.6 Nginx信号三.Nginx3.1启动 总结 一、概述 Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器&am…

从最基础的float布局开始学前端

前端学习其实不难&#xff0c;我们先从float布局讲起&#xff0c;写一个最简单的导航栏&#xff1a;Logo在左&#xff0c;导航链接在右。下面是示例代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"…

12. TypeScript 高级类型

TypeScript 中的高级类型包括映射类型、条件类型、字面量类型和递归类型等强大结构。这些特性使开发者能够表达类型之间更复杂的关系&#xff0c;从而处理边缘情况&#xff0c;并定义更动态、更灵活的类型系统。 一、映射类型 TypeScript 映射类型&#xff08;Mapped Types&a…

韩国证券交易所(KRX)全生态接入系统技术白皮书

核心价值&#xff1a;为全球最活跃的衍生品市场&#xff08;日均交易量480亿美元&#xff09;提供 5μs延迟引擎全合规认证&#xff0c;助力中资机构抢占韩国78%衍生品交易份额 一、KRX市场机遇与准入壁垒 1.1 核心数据锚定&#xff08;2025Q2&#xff09; 指标数值全球竞争力…

【Clickhouse系列】增删改查:对比mysql

目录 1. 写入操作 (INSERT) 2. 删除操作 (DELETE) 3. 更新操作 (UPDATE) 4. 查询操作 (SELECT) 5. 总结对比表&#xff1a; 6. 参考链接 核心哲学差异&#xff1a; MySQL&#xff1a; 面向在线事务处理。核心目标是保证数据的强一致性、原子性和低延迟的单行操作&#x…

低压电工作业中,如何正确选用熔断器的额定电流?

在低压电工作业中&#xff0c;正确选用熔断器额定电流需综合考虑负载类型、额定电流等因素&#xff0c;具体方法如下&#xff1a; 照明电路&#xff1a;对于白炽灯负载&#xff0c;熔体额定电流可按被保护电路上所有白炽灯工作电流之和的 1.1 倍选取。若是日光灯和高压水银荧…

MySQL:索引优化实战技巧

目录 一、前言 二、基础知识回顾 三、索引设计优化 1.遵循最左匹配原则&#xff0c;合理设计联合索引顺序 2.利用覆盖索引避免回表查询 3.针对字符串列使用前缀索引 4.合理使用复合索引替代多个单列索引 5.使用前缀索引优化模糊查询的左匹配 四、索引使用优化 1.避免在…

开关电源计算辅助软件SMPSKIT V10.3

资料下载地址&#xff1a;开关电源计算辅助软件SMPSKIT V10.3 SMPSKIT &#xff1a; 内置一些常见IC的计算 内置绝大多数磁芯数据 内置变压器分层计算器 可用户编程功能 包含绝大多数拓…

OpenHarmony应用开发-全量包的使用

文章目录 一、下载full-sdk二、替换本地对应版本的SDK1.查看本地SDK安装目录2.替换对应的SDK版本 三、升级APL权限为系统权限&#xff08;升级后便可使用系统接口&#xff09;四、重启IDE并重新进行应用签名总结 一、下载full-sdk 可以在官方提供的“每日构建”中搜索对应版本…

sudo安装pip包的影响

使用 sudo 安装的 pip 包和不使用 sudo 安装的 pip 包在 Ubuntu 20.04 上有以下几个主要区别&#xff1a; 1. 安装位置&#xff1a; 使用 sudo: 包会被安装到系统级别的 Python 环境中&#xff0c;通常是 /usr/local/lib/python3.8/dist-packages/ 或 /usr/lib/python3/dist-…

uniapp 多图上传,加水印功能(全平台通用)

多图上传和水印都是比较难得&#xff0c;特别是有的api只支持在小程序用&#xff0c;h5不给用 效果图 普通的多图上传 // 多图上传 // count&#xff1a;最大数量 export function headerUploads0(count 9, orderNumber , watermarkInfo) {return new Promise((resolve, r…

【appium】5. Appium WebDriver 支持的常用方法汇总

下面是一个完整的 Appium WebDriver 支持的常用方法汇总&#xff0c;并附上典型用法示例。 一、元素查找方法/元素操作方法 ✅ 使用 find_element() 和 find_elements() from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy# 单个元素查找 …

FreeRTOS 介绍、使用方法及应用场景

一、FreeRTOS 概述 FreeRTOS 是一款广泛应用于嵌入式系统的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;具有开源、可移植、可裁剪、轻量级等显著特点。它最初由 Richard Barry 开发&#xff0c;如今已成为全球开发者在物联网、工业控制、消费电子等领域的热门选择&a…

深度解析 Caffeine:高性能 Java 缓存库

1. Caffeine 简介 Caffeine 是一个基于 Java 8 的高性能本地缓存库&#xff0c;由 Ben Manes 开发&#xff0c;旨在替代 Google Guava Cache&#xff0c;提供更优的缓存策略、更高的吞吐量和更灵活的配置。 核心优势 ✅ 卓越的性能&#xff1a;采用优化的数据结构&#xff0…

创客匠人赋能创始人 IP 打造:健康行业知识变现案例深度解析

在知识服务行业蓬勃发展的当下&#xff0c;创始人 IP 打造已成为知识变现的核心驱动力。创客匠人近期披露的陪跑案例显示&#xff0c;通过系统化的线上线下联动运营&#xff0c;传统行业从业者可高效实现 IP 价值转化。以亓黄中医科技创始人吴丰言老师为例&#xff0c;其在创客…

64、最小路径和

题目&#xff1a; 解答&#xff1a; 简单dp。 定义&#xff1a;dp[i][j]为到达(i,j)所需要的最短路程 初始化&#xff1a;dp[0][0]grid[0][0]&#xff0c;同时对第一行和第一列的&#xff0c;第i个就是前i个之和加上自身 递归&#xff1a;dp[i][j]min(dp[i-1][j],dp[i][j-1…

获取连接通义千问大语言模型配置信息的步骤:api_key、api_url

一、注册并开通通义千问API服务 1. 注册阿里云账号 访问 阿里云官网点击右上角"免费注册"&#xff0c;按指引完成账号注册和实名认证 2. 开通通义千问API服务 进入 通义千问API产品页点击"立即开通"&#xff0c;按提示完成服务开通&#xff08;部分服务…

汽车加气站操作工考试题库含答案【最新】

1.天然气的主要成分是&#xff08;&#xff09;。 A. 乙烷 B. 乙烯 C. 甲烷 D. 乙炔 答案&#xff1a;C 2.CNG 加气站中&#xff0c;加气机的加气软管应&#xff08;&#xff09;进行检查。 A. 每天 B. 每周 C. 每月 D. 每季度 答案&#xff1a;A 3.储气罐的安全阀应&#xf…