не могу поменять значение после первого использования
здраствуйте, решил сделать поиск определенного текста в файле, такой своеобразный 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 шт):
Мне кажется, что ты не понимаешь, что делает строка
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
.