не могу поменять значение после первого использования

здраствуйте, решил сделать поиск определенного текста в файле, такой своеобразный grep, есть 2 режима: чувствительный поиск:

 pub fn search<'a>(_content: &'a str, _query: &str ) -> Vec<&'a str> {
    _content.lines().filter(|line| line.contains(_query)).collect()
}

а так же нечувствительный:

pub fn search_without_lowcase<'a>(_contaitner: &'a str, _query: &str) -> Vec<&'a str>{
    _contaitner.lines().filter(|line| line.to_lowercase().contains(&_query.to_lowercase())).collect()

}

выбор какой использовать осуществляется через:

 let mut _lowacase =  env::var("LOW").is_err();

так вот какая у меня проблема: я не могу осуществить (если это возможно, многоразовый выбор, если один раз я выбрал &env:LOW=0 то он уже не станет равен 1, а что бы воспользоваться нечувствительным поиском, придется перезапускать powershell.. вот весь код:

use std::{ env, fs, io};

pub struct Fileseach{
pub _filename: String,
pub _query: String,
pub _lowacase: bool

}

impl Fileseach {
pub fn new(mut args: env::Args) -> Result<Fileseach, &'static str>{
    args.next();
    
    let _filename = match args.next(){
        Some(arg) => arg,
        None => return Err("не удалось считать название файла"),
    };
    let _query = match args.next() {
        Some(arg) => arg,
        None => return Err("не удалось считать поисковый запрос"),
        
    };
    let mut _lowacase =  env::var("LOW").is_err();
    Ok(Fileseach{_filename, _query, _lowacase})

}
pub fn search<'a>(_content: &'a str, _query: &str ) -> Vec<&'a str> {
    _content.lines().filter(|line| line.contains(_query)).collect()
}
pub fn search_without_lowcase<'a>(_contaitner: &'a str, _query: &str) -> Vec<&'a str>{
    _contaitner.lines().filter(|line| line.to_lowercase().contains(&_query.to_lowercase())).collect()

}
pub fn run(_filesearch: Fileseach)-> Result<(), io::Error>{
 let _content = fs::read_to_string(_filesearch._filename).expect("не удалось счиатть файл");
if _filesearch._lowacase {
    for line in  Fileseach::search_without_lowcase(&_content, &_filesearch._query){
        println!("{}", line);
       };
}
else{
    for line in  Fileseach::search(&_content, &_filesearch._query){
    println!("{}", line);
   };}
   Ok(())
}
}

Ответы (1 шт):

Автор решения: vessd

Мне кажется, что ты не понимаешь, что делает строка

let mut _lowacase =  env::var("LOW").is_err();

Функция std::env::var имеет следующую сигнатуру

pub fn var<K: AsRef<OsStr>>(key: K) -> Result<String, VarError>

Т.е. она принимает любой тип, из которого можно получить ссылку на OsStr и возвращает Result<String, VarError>, который обозначает успех или ошибку в зависимости от того, есть такая переменная окружения или нет. Если переменная существует, то Result будет иметь значение Ok(String) и эта строка и будет значением переменной "LOW" (видимо в твоём случае "0" или "1").

Твоя строчка кода в итоге означает, что _lowacase всегда false, если переменная окружения "LOW" существует и при этом не важно, какое значение у этой переменной.

Если ты хочешь менять переменную _lowacase в зависимости от значения "LOW", то тебе нужно смотреть значение полученной строки. Например так

let _lowacase = env::var("LOW").map(|v| v != "0").unwrap_or_default();

Это означает, что если переменная "LOW" существует и она не равна "0", то _lowacase будет true, иначе false.

→ Ссылка