Updated 'src/io_project/env_variables.md'.

This commit is contained in:
Hector PENG
2026-03-29 15:37:10 +08:00
parent d0735670bb
commit 2bb70ecfa8
2 changed files with 22 additions and 20 deletions

View File

@@ -1,5 +1,5 @@
use std::{env, fs, process, error::Error};
use minigrep::search;
use minigrep::{search, search_case_insensitive};
fn main() {
let args: Vec<String> = env::args().collect();
@@ -23,10 +23,10 @@ fn run(config: Config) -> Result<(), Box<dyn Error>>{
let contents = fs::read_to_string(config.file_path)?;
let results: Vec<&str> = if config.ignore_case {
search_insensitive(&config.query, &contents)
search_case_insensitive(&config.query, &contents)
} else {
search(&config.query, &contents)
}
};
for line in results {
println! ("{line}");

View File

@@ -136,7 +136,7 @@ pub fn run(config: Config) -> Result<(), Box<dyn Error>>{
search_insensitive(&config.query, &contents)
} else {
search(&config.query, &contents)
}
};
for line in results {
println! ("{line}");
@@ -176,44 +176,46 @@ impl Config {
**清单 12-23**:检查名为 `IGNORE_CASE` 的环境变量中的是否有任何值
在这里,我们创建一个新变量 `ignore_case`。为了设置他的值,我们调用 `env::var` 函数并传递给他 `IGNORE_CASE` 环境变量的名字。`env::var` 函数返回 `Result` 值,当该环境变量设置为任何值时,返回的 `Result` 将是成功`Ok` 变种。当环境变量未设置时,他将返回 `Err` 变种。
在这里,我们创建一个新变量 `ignore_case`。为了获取他的值,我们调用 `env::var` 函数并传递给他 `IGNORE_CASE` 环境变量的名字。当该环境变量被设置了任何值时,`env::var` 函数返回一个 `Result` 值,其将是包含该环境变量的值`Ok` 变种。当环境变量未设置时,他将返回 `Err` 变种。
我们使用 `Result` 上的 `is_ok` 方法来检查环境变量是否设置,这意味着程序应执行不区分大小写的检索。当 `IGNORE_CASE` 环境变量未设置为任何内容时,`is_ok` 将返回 `false`,进而程序将执行区分大小写的检索。我们不关心该环境变量的 **,只关心他是已设置或未设置,因此我们检查 `is_ok`,而不是使用 `unwrap``expect` 或我们已经在 `Result` 上看到的任何其他方法。
我们使用 `Result` 上的 `is_ok` 方法来检查环境变量是否设置,这意味着程序应执行不区分大小写的检索。当 `IGNORE_CASE` 环境变量未设置为任何内容时,`is_ok` 将返回 `false`,进而程序将执行区分大小写的检索。我们不关心该环境变量的 **,只关心他是已设置或未设置,因此我们检查 `is_ok`,而不是使用 `unwrap``expect` 或我们已经在 `Result` 上看到的任何其他方法。
这里把在 `ignore_case` 变量中的值,传递给了那个 `Config` 实例,这样一来 `run` 函数可以读取到那个值,并定是调用 `search_case_insensitive` 还是 `search`就如同在清单 12-22 中所实现的那样。
我们传递 `ignore_case` 变量中的值 `Config` 实例,以便 `run` 函数可以读取到值,并定是调用 `search_case_insensitive` 还是 `search`正如我们在清单 12-22 中所实现的那样。
现在就来试着运行一下!首先,这里将在设置那个环境变量查询字串 `to` 之下,运行这个程序,这应匹配包含全部小写单词 “to” 的那些行:
我们来试一试!首先,我们将在设置环境变量,并以查询字`to` 运行程序,这应匹配任何包含全部小写单词 “to” 的行:
```rust
$ cargo run -- to poem.txt
Compiling minigrep v0.1.0 (/home/peng/rust-lang/minigrep)
Finished dev [unoptimized + debuginfo] target(s) in 0.55s
$ cargo run -- to poem.txt
Compiling minigrep v0.1.0 (/home/hector/rust-lang-zh_CN/projects/minigrep)
Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.10s
Running `target/debug/minigrep to poem.txt`
poem.txt to
poem.txt
to
Are you nobody, too?
How dreary to be somebody!
```
看起来那代码仍会工作!现在,就`IGNORE_CASE` 设置为 `1`,而查询字串同样为 `to` 之下,运行这个程序
看起来这仍然正常工作!现在我们来`IGNORE_CASE` 设置为 `1` 下,而以同样的查询字符串 `to` 运行程序
```console
$ IGNORE_CASE=1 cargo run -- to poem.txt  ✔
$ IGNORE_CASE=1 cargo run -- to poem.txt
```
使用的是 PowerShell 时,需要单独命令,来设置环境变量运行这个程序:
当咱们使用的是 PowerShell 时,咱们将需要单独命令分别设置环境变量运行程序:
```PowerShell
PS> $Env:IGNORE_CASE=1; cargo run -- to poem.txt
```
样就会令到 `IGNORE_CASE` 持续到本次 shell 会话终止为止。使用 `Remove-Item` cmdlet 其就可以被清除设置。
将使 `IGNORE_CASE` 在咱们的 shell 会话的剩余时间内持续存在。该环境变量可以使用 `Remove-Item` 这个 cmdlet 取消设置。
```PowerShell
PS> Remove-Item Env:IGNORE_CASE
```
这里应得到包含可能有大写字母 "to" 的那些行:
我们应得到包含可能有大写字母*to*行:
```console
Are you nobody, too?
@@ -222,11 +224,11 @@ To tell your name the livelong day
To an admiring bog!
```
非常好,这里还得到了包含着 “To” 的那些行了!这里`minigrep` 现在可以完成,由一个环境变量控制的不区分大小写检索。现在就清楚了怎样用命令行参数,或是环境变量来管理程序选项集
太棒了,我们还得到了包含 *To* 的行!我们`minigrep` 程序现在可以执行由环境变量控制的不区分大小写检索。现在咱们知道怎样使用命令行参数环境变量来管理选项集。
有的程序,同时实现同一配置的命令行参数 ** 环境变量。在这样的情形下,这些程序就会确定下其中之一有着较高优先级。好比你自己的另一代码练习中,就会尝试经由命令行参数,或同时经由环境变量,对是否区分大小写进行控制。就会在程序在一种设置下区分大小写,而另一种设置下不区分大小写时,对到底命令行参数优先,还是环境变量优先,加以确定
一些程序允许针对同一配置同时使用命令行参数 ** 环境变量。在这些情况下,程序会决定其中一个优先。对于咱们自己的其他练习,请尝试通过命令行参数或环境变量控制区分大小写。当程序以一组区分大小写和另一组忽略大小写时,请确定是命令行参数优先,还是环境变量优先。
这个 `std::env` 模组包含许多用于处理环境变量的其他有用特性:请查看文档来看看有哪些可用特性
`std::env` 模组包含许多用于处理环境变量的有用特性:请查看文档以了解哪些特性可用
End