2016-05-25 5 views
3

私はRustに全く新しいです。私はドキュメントを読んでいて、基本的なファイルI/Oコードを車として使って学習するのを手伝っています。Vecを返す関数を書くには<Path>?

次はコンパイルされません:コンパイルエラーで

use std::path::Path; 
use std::fs; 
use std::io; 

pub fn read_filenames_from_dir<P>(path: P) -> Result<Vec<Path>, io::Error> 
    where P: AsRef<Path> 
{ 
    let paths = try!(fs::read_dir(path)); 
    Ok(paths.unwrap()) 
} 

を:

error: the trait `core::marker::Sized` is not implemented for the type `[u8]` [E0277] 

は私が渡されていますPath内部Pathのコレクションを返すために、この関数を記述する必要がありますどのように?

答えて

5

あなたはしません。 Pathは、サイズを持たないタイプであり、間接指定(&PathまたはBox<Path>など)でのみ使用できます。この意味では、タイプstrまたは[u8]のようなものです。いずれも間接的にしか使用できません。

PathBufは、が所有するパスを表します。 &strの場合はString&[u8]の場合はVec<u8>に相当します。 * *とにかくパスで何

use std::path::{Path, PathBuf}; 
use std::{fs, io}; 

pub fn read_filenames_from_dir<P>(path: P) -> Result<Vec<PathBuf>, io::Error> 
    where P: AsRef<Path> 
{ 
    let paths = try!(fs::read_dir(path)); 
    paths.into_iter().map(|x| x.map(|p| p.path())).collect() 
} 

fn main() { 
    println!("{:?}", read_filenames_from_dir("/etc")); 
} 
+1

戻り値の型を変更した後、あなたは正しくご希望の種類を作成するためのイテレータの結果をマッピングする必要がありますか?ソースコードダイビングをすると、 'Path'に' sys :: os_str :: Slice'という名前のものが含まれている 'OsStr'が含まれています。実際の定義は見つかりません。私はそれが基本的に '' [u8] ''の上の抽象化のいくつかの層だと思いますか? – LinearZoetrope

+1

@Jsor *基本的に、[u8] *上のいくつかの抽象レイヤー - はい、[Unix風のプラットフォームでは](https://github.com/rust-lang/rust/blob/1.8.0/src/libstd /sys/unix/os_str.rs#L27-L29)。 Windowsは異なります(https://github.com/rust-lang/rust/blob/1.8.0/src/libstd/sys/windows/os_str.rs#L46-L48)。この抽象化のビットは、OPエラーメッセージで漏出します。「 '' core :: marker :: Sized''は '[u8]' ''型に対して実装されていません。 – Shepmaster

関連する問題