Rust 学习

Rust 官网:https://www.rust-lang.org/zh-CN/

1、Rust 简介

Rust 是一门注重安全(safety)、速度(speed)和并发(concurrency)的现代系统编程语言。Rust 通过内存安全来实现以上目标,但不使用垃圾回收机制(garbage collection, GC)。

Rust 特点

  • 高性能:Rust 速度惊人且内存利用率极高。由于没有运行时和垃圾回收,它能够胜任对性能要求特别高的服务,可以在嵌入式设备上运行,还能轻松和其他语言集成。
  • 可靠性:Rust 丰富的类型系统和所有权模型保证了内存安全和线程安全,让您在编译期就能够消除各种各样的错误。
  • 生产力:Rust 拥有出色的文档、友好的编译器和清晰的错误提示信息, 还集成了一流的工具——包管理器和构建工具, 智能地自动补全和类型检验的多编辑器支持, 以及自动格式化代码等等。

Rust 相关概念

  • channel:Rust 会发布3个不同版本:stable、beta、nightly。
            stable:Rust 的稳定版本,每 6 周发布一次。
            beta:Rust 的公开测试版本,将是下一个 stable 版本。
            nightly:每天更新,包含以一些实验性的新特性。
  • toolchain:一套 Rust 组件,包括编译器及其相关工具,并且包含 channel,版本及支持的平台信息。
  • target:指编译的目标平台,即:编译后的程序在哪种操作系统上运行。
  • component (组件):toolchain 是由 component 组成的。查看所有可用和已经安装的组件命令如下:rustup component list。rustup 默认安装的组件:
            rustc:Rust 编译器。
            rust-std:Rust 标准库。
            cargo:包管理和构建工具。
            rust-docs:Rust 文档。
            rustfmt:用来格式化 Rust 源代码。
            clippy:Rust 的代码检查工具。
  • profile:为了方便对 component 进行管理,使用 profile 定义一组 component。不同的 profile 包含不同的组件,安装 rustup 时有三种 profile 可选,修改 profile 命令如下:rustup set profile minimal
  • Rustup 是什么Rustup 是 Rust安装器和版本管理工具安装 Rust 的主要方式是通过 Rustup 这一工具,它既是一个 Rust 安装器又是一个版本管理工具。Rust 的升级非常频繁。运行 rustup update 获取最新版本的 Rust。文档:https://rust-lang.github.io/rustup/
  • Cargo 是什么Cargo 是 Rust 的 构建工具 和 包管理器。安装 Rustup 时会自动安装。Cargo 可以做很多事情:
            cargo build      可以构建项目
            cargo run        可以运行项目
            cargo test       可以测试项目
            cargo doc       可以为项目构建文档
            cargo publish 可以将库发布到 crates.io。
    检查是否安装了 Rust 和 Cargo,可以在终端中运行:cargo --version

下载、安装

下载:https://www.rust-lang.org/tools/install
安装:https://www.rust-lang.org/zh-CN/learn/get-started

默认情况,Rust 依赖 C++ build tools,没有安装也关系。安装过程需要保证网络正常。

在 Rust 开发环境中,所有工具都安装在 ~/.cargo/bin 目录中,可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链。在安装过程中,rustup 会尝试配置 PATH,如果 rustup 对 PATH 的修改不生效,可以手动添加路径到 PATH

~/.cargo/bin

~/.rustup/bin

以下是一些常用的命令:

rustup 相关

rustup -h                # 查看帮助
rustup show              # 显示当前安装的工具链信息
rustup update            # 检查安装更新
rustup self uninstall    # 卸载
rustup default stable-x86_64-pc-windows-gnu    # 设置当前默认工具链

rustup toolchain list    # 查看工具链
rustup toolchain install stable-x86_64-pc-windows-gnu    # 安装工具链
rustup toolchain uninstall stable-x86_64-pc-windows-gnu  # 卸载工具链
rustup toolchain link <toolchain-name> "<toolchain-path>"    # 设置自定义工具链

rustup override list    # 查看已设置的默认工具链
rustup override set <toolchain> --path <path>    # 设置该目录以及其子目录的默认工具链
rustup override unset --path <path>    # 取消目录以及其子目录的默认工具链

rustup target list               # 查看目标列表
rustup target add <target>       # 安装目标
rustup target remove <target>    # 卸载目标
rustup target add --toolchain <toolchain> <target>    # 为特定工具链安装目标

rustup component list                 # 查看可用组件
rustup component add <component>      # 安装组件
rustup component remove <component>   # 卸载组件

rustc 相关

rustc --version    # 查看rustc版本

cargo 相关

cargo --version    # 查看cargo版本
cargo new <project_name>    # 新建项目
cargo build    # 构建项目
cargo run      # 运行项目
cargo check    # 检查项目
cargo -h       # 查看帮助

配置工具链安装位置

在系统环境变量中添加如下变量:
CARGO_HOME 指定 cargo 的安装目录
RUSTUP_HOME 指定 rustup 的安装目录
默认分别安装到用户目录下的.cargo 和.rustup 目录

配置国内镜像

配置 rustup 国内镜像。在系统环境变量中添加如下变量(选一个就可以,可以组合):

# 清华大学
RUSTUP_DIST_SERVER:https://mirrors.tuna.tsinghua.edu.cn/rustup
RUSTUP_UPDATE_ROOT:https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup

# 中国科学技术大学
RUSTUP_DIST_SERVER:https://mirrors.ustc.edu.cn/rust-static
RUSTUP_UPDATE_ROOT:https://mirrors.ustc.edu.cn/rust-static/rustup

配置 cargo 国内镜像。在 cargo 安装目录下新建 config 文件(注意 config 没有任何后缀),文件内容如下:

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'tuna'

# 清华大学
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

# 中国科学技术大学
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
# 设置代理
[http]
proxy = "127.0.0.1:8889"
[https]
proxy = "127.0.0.1:8889"

Windows 交叉编译 Linux 程序。目标服务器是 Linux(CentOS 7) 64bit, 所以我们添加的 target 应该是x86_64-unknown-linux-gnu(动态依赖) 或者x86_64-unknown-linux-musl(静态依赖)

  • 动态依赖:目标服务器需要包含动态依赖的相关库(用户共享库)
  • 静态依赖,目标服务器不需要包含相应的库,但是打包文件会更大些

1). 添加需要的 target
rustup target add  x86_64-unknown-linux-musl
2). 在 cargo 安装目录下新建 config 文件(注意 config 没有任何后缀),添加的文件内容如下:
[target.x86_64-unknown-linux-musl]
linker = "rust-lld"
3). 构建
cargo build --target x86_64-unknown-linux-musl

示例:

创建新项目

用 Cargo 创建一个新项目。在终端中执行:cargo new hello-rust,会生成一个名为 hello-rust 的新目录,其中包含以下文件:

  • Cargo.toml 为 Rust 的清单文件。其中包含了项目的元数据和依赖库。
  • src/main.rs 为编写应用代码的地方。

进入新创建的目录中,执行命令运行此程序:cargo run

添加 依赖

现在来为程序添加依赖。可以在 crates.io,即 Rust 包的仓库中找到所有类别的库。在 Rust 中通常把 "包" 称作 "crates"。在本项目中,使用了名为 ferris-says 的库。

在 Cargo.toml 文件中添加以下信息(从 crate 页面上获取):

[dependencies]
ferris-says = "0.3.1"

下载 依赖

运行:cargo build  , Cargo 就会安装该依赖。运行 build 会创建一个新文件 Cargo.lock,该文件记录了本地所用依赖库的精确版本。

使用 依赖

使用该依赖库:可以打开 main.rs,删除其中所有的内容(它不过是个示例而已),然后在其中添加下面这行代码:use ferris_says::say;

这样就可以使用 ferris-says crate 中导出的 say 函数了。

完整 Rust 示例

现在用上面的依赖库编写一个小应用。在 main.rs 中添加以下代码:

use ferris_says::say; // from the previous step
use std::io::{stdout, BufWriter};

fn main() {
    let stdout = stdout();
    let message = String::from("Hello fellow Rustaceans!");
    let width = message.chars().count();

    let mut writer = BufWriter::new(stdout.lock());
    say(&message, width, &mut writer).unwrap();
}

保存完毕后,执行命令运行程序:cargo run

成功执行后,会打印一个字符形式的螃蟹图案。

Ferris ( 费理斯 ) 是 Rust 社区的非官方吉祥物。

2、Rust 相关文档

:https://www.rust-lang.org/zh-CN/learn

核心文档

以下所有文档都可以用 rustup doc 命令在本地阅读,它会在浏览器中离线打开这些资源!

标准库

详尽的 Rust 标准库 API 手册。:https://doc.rust-lang.org/std/index.html

版本指南

Rust 版本指南。:https://doc.rust-lang.org/edition-guide/index.html

CARGO 手册

Rust 的包管理器和构建系统。:https://doc.rust-lang.org/cargo/index.html

RUSTDOC 手册

学习如何为 crate 编写完美的文档。:https://doc.rust-lang.org/rustdoc/index.html

RUSTC 手册

熟悉 Rust 编译器中可用的选项。:https://doc.rust-lang.org/rustc/index.html

编译错误索引表

深入解释遇到的编译错误。:https://doc.rust-lang.org/error_codes/error-index.html

Rust 程序

命令行 程序

用 Rust 构建高效的命令行应用。:https://rust-cli.github.io/book/index.html

WEBASSEMBLY 手册

通过 WebAssembly 用 Rust 构建浏览器原生的库。:https://rustwasm.github.io/docs/book/

嵌入式手册

Rust 编写嵌入式程序。:https://doc.rust-lang.org/stable/embedded-book/

3、Rust 程序设计语言

英文文档:https://doc.rust-lang.org/book/

中文文档:https://kaisery.github.io/trpl-zh-cn/

《Rust 程序设计语言》被亲切地称为“圣经”。给出了 Rust 语言的概览。在阅读的过程中构建几个项目,读完后,就能扎实地掌握 Rust 语言。

  1. 1. 入门指南
    1. 1.1. 安装
    2. 1.2. Hello, World!
    3. 1.3. Hello, Cargo!
  2. 2. 写个猜数字游戏
  3. 3. 常见编程概念
    1. 3.1. 变量与可变性
    2. 3.2. 数据类型
    3. 3.3. 函数
    4. 3.4. 注释
    5. 3.5. 控制流
  4. 4. 认识所有权
    1. 4.1. 什么是所有权?
    2. 4.2. 引用与借用
    3. 4.3. Slice 类型
  5. 5. 使用结构体组织相关联的数据
    1. 5.1. 结构体的定义和实例化
    2. 5.2. 结构体示例程序
    3. 5.3. 方法语法
  6. 6. 枚举和模式匹配
    1. 6.1. 枚举的定义
    2. 6.2. match 控制流结构
    3. 6.3. if let 简洁控制流
  7. 7. 使用包、Crate 和模块管理不断增长的项目
    1. 7.1. 包和 Crate
    2. 7.2. 定义模块来控制作用域与私有性
    3. 7.3. 引用模块项目的路径
    4. 7.4. 使用 use 关键字将路径引入作用域
    5. 7.5. 将模块拆分成多个文件
  8. 8. 常见集合
    1. 8.1. 使用 Vector 储存列表
    2. 8.2. 使用字符串储存 UTF-8 编码的文本
    3. 8.3. 使用 Hash Map 储存键值对
  9. 9. 错误处理
    1. 9.1. 用 panic! 处理不可恢复的错误
    2. 9.2. 用 Result 处理可恢复的错误
    3. 9.3. 要不要 panic!
  10. 10. 泛型、Trait 和生命周期
    1. 10.1. 泛型数据类型
    2. 10.2. Trait:定义共同行为
    3. 10.3. 生命周期确保引用有效
  11. 11. 编写自动化测试
    1. 11.1. 如何编写测试
    2. 11.2. 控制测试如何运行
    3. 11.3. 测试的组织结构
  12. 12. 一个 I/O 项目:构建命令行程序
    1. 12.1. 接受命令行参数
    2. 12.2. 读取文件
    3. 12.3. 重构以改进模块化与错误处理
    4. 12.4. 采用测试驱动开发完善库的功能
    5. 12.5. 处理环境变量
    6. 12.6. 将错误信息输出到标准错误而不是标准输出
  13. 13. Rust 中的函数式语言功能:迭代器与闭包
    1. 13.1. 闭包:可以捕获其环境的匿名函数
    2. 13.2. 使用迭代器处理元素序列
    3. 13.3. 改进之前的 I/O 项目
    4. 13.4. 性能比较:循环对迭代器
  14. 14. 更多关于 Cargo 和 Crates.io 的内容
    1. 14.1. 采用发布配置自定义构建
    2. 14.2. 将 crate 发布到 Crates.io
    3. 14.3. Cargo 工作空间
    4. 14.4. 使用 cargo install 安装二进制文件
    5. 14.5. Cargo 自定义扩展命令
  15. 15. 智能指针
    1. 15.1. 使用Box<T> 指向堆上数据
    2. 15.2. 使用Deref Trait 将智能指针当作常规引用处理
    3. 15.3. 使用Drop Trait 运行清理代码
    4. 15.4. Rc<T> 引用计数智能指针
    5. 15.5. RefCell<T> 与内部可变性模式
    6. 15.6. 引用循环会导致内存泄漏
  16. 16. 无畏并发
    1. 16.1. 使用线程同时地运行代码
    2. 16.2. 使用消息传递在线程间通信
    3. 16.3. 共享状态并发
    4. 16.4. 使用Sync 与 Send Traits 的可扩展并发
  17. 17. Rust 的面向对象编程特性
    1. 17.1. 面向对象语言的特点
    2. 17.2. 为使用不同类型的值而设计的 trait 对象
    3. 17.3. 面向对象设计模式的实现
  18. 18. 模式与模式匹配
    1. 18.1. 所有可能会用到模式的位置
    2. 18.2. Refutability(可反驳性): 模式是否会匹配失效
    3. 18.3. 模式语法
  19. 19. 高级特征
    1. 19.1. 不安全的 Rust
    2. 19.2. 高级 trait
    3. 19.3. 高级类型
    4. 19.4. 高级函数与闭包
    5. 19.5. 宏
  20. 20. 最后的项目:构建多线程 web server
    1. 20.1. 建立单线程 web server
    2. 20.2. 将单线程 server 变为多线程 server
    3. 20.3. 优雅停机与清理
  21. 21. 附录
    1. 21.1. A - 关键字
    2. 21.2. B - 运算符与符号
    3. 21.3. C - 可派生的 trait
    4. 21.4. D - 实用开发工具
    5. 21.5. E - 版本
    6. 21.6. F - 本书译本
    7. 21.7. G - Rust 是如何开发的与 “Nightly Rust”

4、通过例子学 Rust

英文文档:https://doc.rust-lang.org/rust-by-example/

中文文档:https://rustwiki.org/zh-CN/rust-by-example/

查看更多 Rust 官方文档中英文双语教程,包括双语版《Rust 程序设计语言》(出版书名为《Rust 权威指南》), Rust 标准库中文版。

《通过例子学 Rust》(Rust By Example 中文版)翻译自 Rust By Example,中文版最后更新时间:2022-1-26。查看此书的 Github 翻译项目和源码。

开始学习吧!

  • Hello World - 从经典的 “Hello World” 程序开始学习。

  • 原生类型 - 学习有符号整型,无符号整型和其他原生类型。

  • 自定义类型 - 结构体 struct 和 枚举 enum

  • 变量绑定 - 变量绑定,作用域,变量遮蔽。

  • 类型系统 - 学习改变和定义类型。

  • 类型转换

  • 表达式

  • 流程控制 - if/elsefor,以及其他流程控制有关内容。

  • 函数 - 学习方法、闭包和高阶函数。

  • 模块 - 使用模块来组织代码。

  • Crate - crate 是 Rust 中的编译单元。学习创建一个库。

  • Cargo - 学习官方的 Rust 包管理工具的一些基本功能。

  • 属性 - 属性是应用于某些模块、crate 或项的元数据(metadata)。

  • 泛型 - 学习编写能够适用于多种类型参数的函数或数据类型。

  • 作用域规则 - 作用域在所有权(ownership)、借用(borrowing)和生命周期(lifetime)中起着重要作用。

  • 特性 trait - trait 是对未知类型(Self)定义的方法集。

  • 错误处理 - 学习 Rust 语言处理失败的方式。

  • 标准库类型 - 学习 std 标准库提供的一些自定义类型。

  • 标准库更多介绍 - 更多关于文件处理、线程的自定义类型。

  • 测试 - Rust 语言的各种测试手段。

  • 不安全操作

  • 兼容性

  • 补充 - 文档和基准测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237968.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

YB5212A高输入耐压2A单节/双节锂电池充电芯片

YB5212A高输入耐压2A单节/双节锂电池充电芯片 概述&#xff1a; YB5212A 是一种5-18V输入&#xff0c;2A电流可支持单节和双节锂电池的同步Buck锂离子电池充电器&#xff0c;适用于便携式应用。选择引脚方便多单元充电。800khz同步降压调节器集成MOS&#xff0c;超低导通电阻&a…

聚焦中国—东盟大健康产业峰会 点靓广西“长寿福地”品牌

12月8-10日2023中国—东盟大健康产业峰会暨大健康产业博览会在南宁国际会展中心成功举办&#xff0c;本次峰会由国家中医药管理局、广西壮族自治区人民政府联合主办&#xff0c;中国老年学和老年医学学会、自治区党委宣传部、自治区民政厅、广西壮族自治区外事办公室、广西壮族…

vue 实现点击复制文本到剪贴板

vue 实现点击复制文本到剪贴板 共四种方法 1. navigator.clipboard.writeText该方法需要在安全域下才能够使用&#xff0c;比如&#xff1a;https 协议的地址、127.0.0.1、localhost <template><div><el-button type"primary" click"btn1"…

Dockerfile创建镜像介绍

1.介绍 Docker 提供了一种更便捷的方式&#xff0c;叫作 Dockerfile&#xff0c;docker build命令用于根据给定的Dockerfile构建Docker镜像。 docker build语法&#xff1a; # docker build [OPTIONS] <PATH | URL | -> 常用选项说明 --build-arg&#xff0c;设置构建时的…

命名空间 嵌套类和局部类

命名空间 命名空间可以不连续 未命名空间 命名空间的别名 using声明和using指示 嵌套类 访问嵌套类成员 嵌套类的名称查找 嵌套类中名称查找失败会在外围中查找 局部类 局部类可以访问外围函数枚举 静态对象 局部类可以定义函数但是函数必须在类内定义 局部类内不能定义静态成…

【Jeecg Boot 3 - 第二天】1.2、jar 包和 lib 依赖分离,部署包缩小100倍

一、场景 二、思路 三、实战 ▶ 2.1、项目 jar 包解压获取 lib config Stage 1&#xff1a;正常打包获取 jeecg-system-start-3.6.0.jar Stage 2&#xff1a;解压 获取如下文件 Stage 3&#xff1a;获取 lib config ▶ 2.2、获取简化版项目jar包 Stage 1&#xff1…

gitlab动态流水线

文章目录 1. 说明2. 官方样例2.1 在作业中生成配置文件&#xff0c;保存为产物2.2 将触发器作业配置为在生成配置文件的作业之后运行。 3. 实战应用3.1 背景介绍3.2 项目介绍3.3 公共项目配置3.4 测试项目配置3.5 测试 4. 总结 1. 说明 顾名思义&#xff0c;动态流水线就是一种…

Altman作了多少恶?排挤首席科学家出GPT5开发、离间董事会、PUA员工

在山姆奥特曼&#xff08;Sam Altman&#xff09;被OpenAI董事会突然解职后的几天里&#xff0c;这个消息在科技圈引发轰动&#xff0c;该公司内部员工和许多科技界人士甚至将此举比作一场政变。 奥特曼被解雇后立即传出的说法是&#xff0c;OpenAI的广大员工都很喜欢他&#x…

治疗复发或难治性多发性骨髓瘤:2期MagnetisM-3试验结果

今天给同学们分享一篇实验文章“Elranatamab in relapsed or refractory multiple myeloma: phase 2 MagnetisMM-3 trial results”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 试验设计和患者 MagnetisMM-3是一项正在进行的…

以csv为源 flink 创建paimon 临时表相关 join 操作

目录 概述配置关键配置测试启动 kyuubi执行配置中的命令 bug解决bug01bug02 结束 概述 目标&#xff1a;生产中有需要外部源数据做paimon的数据源&#xff0c;生成临时表&#xff0c;以使用与现有正式表做相关统计及 join 操作。 环境&#xff1a;各组件版本如下 kyuubi 1.8…

c语言->自定义类型联合体和枚举类型

系列文章目录 文章目录 前言 ✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青_C语言,函数,指针-CSDN博客 目的&#xff1a;学习联合体和枚举类型的…

深度学习 Day12——P1实现mnist手写数字识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

伪原创API,一文快速了解伪原创API

伪原创API&#xff0c;听起来可能对许多人来说是一个陌生的术语。然而&#xff0c;在当今数字化时代&#xff0c;尤其是在内容创作和网络营销领域&#xff0c;伪原创API正逐渐崭露头角。在本文中&#xff0c;我将向您深入介绍伪原创API是什么&#xff0c;以及它如何在实际应用中…

LED透镜粘接UV胶是一种特殊的UV固化胶

LED透镜粘接UV胶是一种特殊的UV固化胶&#xff0c;用于固定和粘合LED透镜。 它具有以下特点&#xff1a; 1. 高透明度&#xff1a;LED透镜粘接UV胶具有高透明度&#xff0c;可以确保光线的透过性&#xff0c;不影响LED的亮度和效果。 2. 快速固化&#xff1a;经过UV紫外线照射…

c语言二维数组之浮点型数组

介绍&#xff1a; 本篇文章讲解c语言二维数组之浮点型数组 其实和小编上一篇文章 c语言二维数组之整型数组 差不多 只不过就是数组里存储的数的类型不一样了 所以这里 仅仅提供代码和执行结果就不多说了 OK 下面进入正文 代码和执行结果&#xff1a; 大家放心好了 这次的…

带你玩转 Vite + Vue3 高低版本常用玩法

一、首先来个 Vite 的通用简介 Vite 是一种新型前端构建工具,在我们保险前端项目中已经推动并应用很久了,Vite 能够显著降低构建时间,提升前端开发效率。 它主要由两部分组成: 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(…

靠谱的车- 华为OD统一考试(C卷)

靠谱的车- 华为OD统一考试(C卷) OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇…

微信小程序:模态框(弹窗)的实现

效果 wxml <!--新增&#xff08;点击按钮&#xff09;--> <image classimg src"{{add}}" bindtapadd_mode></image> <!-- 弹窗 --> <view class"modal" wx:if"{{showModal}}"><view class"modal-conten…

深入Docker命令行:探索常用命令和实用技巧

Docker命令行界面是每个容器开发者的得力工具。在这篇文章中&#xff0c;将深入探讨一系列常用的Docker命令&#xff0c;以及一些实用技巧&#xff0c;通过更丰富的示例代码&#xff0c;帮助大家更全面地理解和运用Docker命令行工具。 1. Docker基本命令 1.1 镜像操作 深入了…

【打印机如何设置只打印黑色】

目录 1. Window X 打开&#xff0c;选择“设置” 2. 选择“打印机和扫描仪” 3. 选择对应的“打印机” 4. 选择“打印首选项” 5. 选择“页设置”&#xff0c;并选择“打印选项” 6. 用于打印的墨水&#xff0c;改为“仅黑色” 7. 点击“确定”&#xff0c;关闭即可 1. Wi…