2015-09-03 8 views
11

選択肢はstd::fs::PathExtstd::fs::metadataの間にあるようですが、後者はより安定しているようにしばらくお待ちください。示すようにパスが存在するかどうかを確認するには?

use std::fs; 

pub fn path_exists(path: &str) -> bool { 
    let metadata = try!(fs::metadata(path)); 
    assert!(metadata.is_file()); 
} 

しかし、いくつかの奇妙な理由let metadata = try!(fs::metadata(path))のためにまだ私は単純にブール値を返すようにしたいにもかかわらずResult<T,E>を返す関数が必要になります。それはドキュメントをオフに基づいており、以下のように私が働いてきたコードがありますassert!(metadata.is_file())から。

すぐにこれに多くの変更が加えられますが、try!()の問題を回避するにはどうすればよいですか?以下は

関連するコンパイラのエラーです:

error[E0308]: mismatched types 
--> src/main.rs:4:20 
    | 
4 |  let metadata = try!(fs::metadata(path)); 
    |     ^^^^^^^^^^^^^^^^^^^^^^^^ expected bool, found enum `std::result::Result` 
    | 
    = note: expected type `bool` 
      found type `std::result::Result<_, _>` 
    = note: this error originates in a macro outside of the current crate 

error[E0308]: mismatched types 
--> src/main.rs:3:40 
    | 
3 | pub fn path_exists(path: &str) -> bool { 
    | ________________________________________^ 
4 | |  let metadata = try!(fs::metadata(path)); 
5 | |  assert!(metadata.is_file()); 
6 | | } 
    | |_^ expected(), found bool 
    | 
    = note: expected type `()` 
      found type `bool` 
+0

あなたが見てみ ''についてこの関連する質問](http://stackoverflow.com/questions/30555477/try-does-not-compile)をお持ちですか?またはエラーハンドリングに関する[Rust Book](https://doc.rust-lang.org/book/error-handling.html)セクションを参照してください。 – Shepmaster

答えて

15

注意何回あなたがそれを読むように、ファイルを何かをしたいということ。そのような場合、それを開こうとすると、Resultを扱うほうが理にかなっています。これにより、「ファイルが存在するかどうかを確認する」と「存在する場合はファイルを開く」との競合状態が解消されます。それは...

錆1.5、 Path::existsのよう

が存在する場合は、あなたが本当に気にすべてがある場合は...存在:

use std::path::Path; 

fn main() { 
    println!("{}", Path::new("/etc/hosts").exists()); 
} 

を1.5をサビ前に、あなたはfs::metadata方法かどうかを確認することができます成功:!

use std::fs; 

pub fn path_exists(path: &str) -> bool { 
    fs::metadata(path).is_ok() 
} 

fn main() { 
    println!("{}", path_exists("/etc/hosts")); 
} 
+0

一言、そのような簡単な答え。ありがとう@hhepmaster! – Juxhin

+1

@Juxhinそれはしばしば見つけにくい簡単な答えです!^_^ – Shepmaster

+0

確かに。私はあなたが検証チェック以上のことをしたいというシナリオを理解するでしょうが、私は自分自身を言語に慣れさせているので、私はこのプログラミングパラダイムに慣れていないので、標準APIに自分自身をゆっくりとさらしたいと思っていました。再度、感謝します :-) – Juxhin

関連する問題