Rust学习1

Rust入门, 更偏向底层的学习

Rust与C/C++拥有相同的性能,是无运行时语言,可以保证内存安全。Rust最初是Mozilla公司的研究型项目,Firefox是Rust产品的重要例子。

Rust的安装

别的不说咱们直接冲官网就vans了, 下载一个rustup-init.exe, 运行安装

但是翻安装信息的时候发现安装位置不咋对,看看原文是怎么说的:我们可以改环境变量来保证安装位置,那敢情好。

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  C:\Users\40629\.rustup

This can be modified with the RUSTUP_HOME environment variable.

我们按照要求设置好环境变量之后就可以选择默认安装了。安装后按照官网的说法会自动为我们安装Carco, 一个Rust 的构建工具和包管理器。验证安装完成的方法:

# 安装完的提示
Rust is installed now. Great!
# 检验是否安装
cargo --version
cargo 1.60.0 (d1fd9fe2c 2022-03-01)

RUST学习

第一个(命途多舛的)Helloworld

工欲善其事,必先利其器。开发工具的话最近我对JetBrains家产生了很大的依赖,用它家的CLion既可以为日后C++大侠基础又可以学Rust, 何乐而不为是吧。

使用CLion需要安装Rust的插件,不过那也是后话了。我们直接在Settings -> plugins 总搜索插件(实际上第一个蹦出来的就是他),安装一下即可。

OK接下来我们接下来直接开启第一个Rust: 直接新建一个基础的Rust项目即可,他会自动的给你新建HelloWorld程序哒:

// 主函数, 没有参数也没有返回值。main函数是Rust可执行程最先运行的函数
fn main() {
    // 这里的缩进应该用空格而不是tab, rust无法识别tab
    // 宏。println!是一个宏而不是函数,函数没有!
    println!("Hello, world!");
}

运行,我敲报错 error: linker link.exe not found。我上网查了一下,是因为我没有装VS的一个东西,毕竟官网上也说要:您可能需要安装 Microsoft C++ 生成工具。不过大佬总是那么强大:https://blog.csdn.net/jimo_lonely/article/details/122013975,用这两条命令就可以避免VS的烦恼了

rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu

最后运行一下:

# 虽然有一个warning但是成功的跑出来了
warning: `HelloWorld` (bin "HelloWorld") generated 1 warning
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target\debug\HelloWorld.exe`
Hello, world!

这里要讲一下Rust的运行原理。虽然我们用插件跳过了这一步,但本质上Rust和C一样都是先编译成exe正在运行的.在CLion中它把这个可执行文件放在/taget/debug下面的exe中。

rustc main.rs # 在统计目录下生成同名.exe
main.exe

Hello Cargo

Cargo是Rust中的包管理器,在管理比较复杂的项目或者说管理冗杂的多文件的时候是不二选择。我们创建CLion创建项目就是使用Cargo创建的,我们展开文件结构:

G:.
│  .gitignore
   # Cargo创建项目自动生成的文件,负责追踪项目依赖的精确版本,不需要手动更改
│  Cargo.lock
|  # Cargo配置文件,使用Toml格式,配置文件的新秀
│  Cargo.toml
│      
├─src  # 生成一个带main函数的代码文件
│      main.rs
└─target
    │  .rustc_info.json
    │  CACHEDIR.TAG
    └─debug
#carlo.toml
[package]
# 项目名
name = "HelloWorld"
# 项目版本
version = "0.1.0"
#authors = XXX  项目作者
# 使用的Rust版本
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
#另一个区域的开始,会列出项目的依赖项
[dependencies]
# crate 在RUST中代码的包被称作crate

创建Cargo项目的命令:

1. cargo build   # 生成可执行文件,在default下面生成可执行文件。 可选参数--release, 编译时会优化:代码会更快,但是编译时间更长。
2. cargo run     # 生成可执行文件并运行
3. cargo check   # 检查代码确保能通过编译,不生成科执行文件, 比1快很多

一个Random游戏

  • 了解变量以及声明:

    //let就是声明变量。这里和C不同的是不需要限定变量的类型(int, str.....)
    // 在这我们声明了变量foo并给他赋值1
    let foo = 1;
    // mut: mutable可变。首先, RUST的所有变量是immutable不可变的(保证内存安全)。RUST人为应该显式地区分可不可变。因为根据统计,一般不被修改的变量必备修改的变量要多。像上面的foo, 就无法变值。
    // String是Rust的标准类型, 编码格式为utf8
    // 在这里的 :: 是用的String里面的静态方法创建的实例
    // 声明一个可变变量guess, 是一个字符串的实例(new()直接说明了一切)
    let mut guess = String::new();
    
  • 读取传参

    // 在rust中的分级操作并不是用. 比如说引用a文件中的b类或者函数我们会使用a.b。儿砸rust中我们使用::来代替.
    // use指引用库, std是标准库。我们需要读取数据所需需要引用Io库着没什么好说的
    use std::io
    // 将io读取到的东西放到字符串变量guess中(这个&引用有C内味道了)、
    //.except是指发生异常后所做的处理,一般是会打印一句话比如下面这样
    // 这里的guess必须是已经声明自身为String类型的变量,否则会报错(因为找不到类型不知道分配多少空间。)
    io::stdin().read_line(&mut guess).expect(XXXX);
    // 当然我们可以通过match更优雅的处理
    loop{
        match io::stdin().read_line(&mut guess){
        OK(guess) => guess,
        // 通过continue跳入下一次的循环
        Err(_) => continue,
        }
    }
    
  • println读参

    // 利用{}读取值。{}是占位符,有几个{}就会向后读取几个变量
    println!("你传递的参数为{}",input)
    
  • 随机数:RUST本身不支持生成随机数的基本库。但是我们可以去Rust的库文件网址那里去寻找相应库:https://crates.io/.。找到Rand库。

    使用方法也很简单,设置不需要下载,按照官网更改cargo.toml, 直接在dependencies加上相应的包即可

    # Usage
    # Add this to your Cargo.toml:
    [dependencies]
    # 这里我的calio也很友好的直接直接可以访问文档,简直不要太爽
    rand = "0.8.4"
    
    // 我们看了官方文档后(说实话,我看不下去,看来以后想要函数只能上网查了)
    // 这个Range和python感觉竟然一样,包括1, 但是不包括101
    let mut rands = rand::thread_rng().gen_range(1..101);
    println!("This is a rand {}", rands);
    
  • 枚举类型判断

    //引入Ordering枚举类型,自带Less(小于), Greater(大于), Equal(等于) 
    use std::cmp::Ordering
    // 在进行比较之前需要进行guess转换为数字,用trim().parse().预读取一样返回枚举类型所以我们要补全except.
    let guess:i8 = guess.trim().parse().expect("The input is not a int");
    // 将guess与rands作比较,利用Cmp并获得结果的三个变体.cmp就是compaire比较
    match guess.cmp(&rands){
    	Ordering::Less => println!("Too Less");
        Ordering::Greater => println!("Too big");
        Ordering::Greate => println!("Congratulations");
    }
    
  • 允许多次猜测,循环Loop

    loop{
      xxx
      match(XXX){
        break;
      }
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值