2015-02-12 2 views
0

Итак, время от времени я смотрю на Rust, и на этот раз у меня есть простая задача, чтобы получить путь к моему файлу истории bash. Итак, вы придумали env :: var() и env :: home_dir() и хотели бы присоединиться к ним. Теперь, как 1 или 2 строки в Python и, возможно, в C, я пришел с этой отвратительной 3 лайнера:Как очистить путь к истории bash?

let h_file = env::var("HISTFILE").unwrap_or(OsString::from_string(".bash_history".to_string())).into_string().unwrap_or_else(|_| { panic!("the end is near!!!")}); 
let h_dir = env::home_dir().unwrap_or_else(|| { panic!("unable to get homedir!") }); 
let h_file_p = h_dir.join(h_file); 

Что бы быть лучше? Честно говоря, я обеспокоен тем, что, будучи новичком, просто используя документы, я придумал эту ужасную вещь.

Редактировать: Конечно, дело в том, что первая строка длинная, и я знаю, что я мог бы поместить все эти команды в несколько строк, следующих друг за другом, или использовать выражения gazillion match, все из которых на самом деле не сделают это хорошее решение для основной задачи.

+0

Сколько вы заботитесь об ошибках? Я думаю, что многие из этого кода имеют дело с обработкой ошибок, и я чувствую, что люди будут удивлены тем, сколько ошибок возможно с кодом при запуске программирования в Rust ... – Shepmaster

+0

Предыдущая версия была намного меньше ... https://github.com/buster/rrun/commit/d65bdffadb8391ac3f9adb648e617e2f20aea809#diff-93d0fcbc95e775bf2e023879c10a69e1R7 Так что большинство из этого связано с OsString, а что нет. Так что, по-видимому, старая версия больше не работает, а новая еще более уродливая – buster

ответ

1

Я думаю, что вы страдаете из-за перехода между std::old_path и std::path, а именно на возвращаемое значение home_dir(). После того, как он возвращает std::path::PathBuf, он будет выглядеть следующим образом:

#![feature(os,env,path)] 

use std::env; 
use std::ffi::OsString; 
use std::path::PathBuf; 

fn future_home_dir() -> Option<PathBuf> { 
    Some(PathBuf::new("/home/user")) 
} 

fn main() { 
    let filename = env::var_os("HISTFILE").unwrap_or(OsString::from_str(".bash_history")); 
    let home_dir = future_home_dir().expect("could not determine a home directory"); 
    let path = home_dir.join(&filename); 

    println!("{:?}", path); 
} 

Стабильная версия этого:

use std::env; 
use std::ffi::OsString; 

fn main() { 
    let filename = env::var_os("HISTFILE").unwrap_or_else(|| OsString::from(".bash_history")); 
    let home_dir = env::home_dir().expect("could not determine a home directory"); 
    let path = home_dir.join(&filename); 

    println!("{:?}", path); 
} 
Смежные вопросы