我正在學習Rust,我試圖轉換一個簡單的Ruby例子,它的作用是:
我正在學習Rust,我試圖轉換一個簡單的Ruby例子。
下面是 Ruby 的例子:
output_path = '~/Documents'
pattern = File.expand_path(File.join(output_path, '*'/span>, '**'/span>, '*.txt'/span>)
Dir.glob(pattern) do |path|
將路徑
結束
獎勵Nim的例子:
import os
import strformat
import glob
var outputPath = expandTilde("~/Documents"/span>)
var pattern = joinPath(outputPath, "*"/span>, "**"/span>, "*. txt")
for path in walkGlob(pattern):
echo path
這是我目前為Rust準備的東西,但是,它并沒有構建:
我在Rust中的表現是這樣的
use std::io;
use std::fs;
use std::path::PathBuf;
use glob::glob;
fn main() {
let output_path: io::Result<PathBuf> = fs。 :canonicalize("~/Documents") 。
let pattern: PathBuf = [output_path, "*"/span>, "**"/span>, "*. txt"].iter().collect()。
for entry in glob(pattern)。 expect("Failed to read glob pattern"/span>) {
match entry {
Ok(path) => println!("{:?}", path.display() 。)
Err(e) => println!("{:?}", e) 。
}
}
}
我已經嘗試了不同的變化,但沒有成功。
我不確定fs::canonicalize是否真的能夠擴展傾斜符號路徑。我發現一個較早的板條箱可以做到。shellexpand::tilde。 然而,我不知道如何處理它的輸出。 它不是一個str或String。
我也不確定我是否需要對其中一些Result和Option的回傳值進行多層次的match。 最終glob想要一個str,而在我所有的變化中,第一個output_path值把它弄亂了,或者我不知道如何把它轉換成str。
我錯過了什么?有什么習慣性的方法可以做到這一點?到目前為止,我所嘗試的方法似乎過于冗長。是否有一個簡單的方法可以做到這一點?
更新
如果我硬編碼擴展的路徑,我最終得到了它的作業:
span class="hljs-keyword">use std::path::PathBuf;
use glob::glob;
fn main() {
let pattern_path_buf: PathBuf = ["", "/Users", "ejstembler", "Documents", "*", "**", "*. txt"].iter().collect()。
match pattern_path_buf.to_str() {
Some(pattern) => {
println!("{:?}", pattern) 。
for entry in glob(pattern). expect("Failed to read glob pattern"/span>) {
match entry {
Ok(path) => println!("{:?}", path.display() 。)
Err(e) => println!("{:?}", e) 。
}
}
},
None => println!("no pattern_path_buf")
}
}
一個奇怪的細微差別,是我不得不在PathBuf""的開頭添加一個空白字串,以使它包括一個領先的正斜杠,否則它就會丟失。我發現有std::path::MAIN_SEPARATOR,然而,我不知道如何將char轉換成&str。
無論如何,@Joe_Jingyu提供了公認的答案,shellexpand::tilde作業。 謝謝Joe!
uj5u.com熱心網友回復:
這是我使用shellexpand::tilde來擴展tilde的代碼。
use std::path::PathBuf;
use glob::glob;
使用 shellexpand。
fn main(){
let expanded_path = shellexpand::tilde("~/Documents/">)。
let pattern : PathBuf = [&expanded_path, "*"/span>, "**"/span>, "*. txt"].iter().collect()。
for entry in glob( pattern.to_str()。 unwrap().expect("Failed to read glob pattern"/span>) {
match entry {
Ok(path) => println!("{:?}", path.display() 。)
Err(e) => println!("{:?}", e) 。
}
}
}
這里有一個帖子,介紹了如何從shellexpand::tilde回傳的Cow中獲取&str。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/323819.html
標籤:
上一篇:我如何提取一個短語(第十五個)后面的數字,并用"組-"替換該短語?
下一篇:用Ruby和R創建Docker
