使用 Rust 編寫簡單計算器

在編程語言的世界中,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…