2014-01-10 27 views
3

這是我想要做的:打開所有的命令行參數作爲(二進制)文件並從它們中讀取字節。這裏的不斷變化的語法不利於谷歌搜索,但這裏是我已經想通了,到目前爲止:鏽0.9 - 讀文件?

use std::io::{File, result}; 
use std::path::Path; 
use std::os; 

fn main() { 
    let args = os::args(); 
    let mut iter = args.iter().skip(1); // skip the program name 

    for file_name in iter { 
     println(*file_name); 
     let path = &Path::new(*file_name); 
     let file = File::open(path); 
    } 
} 

這裏的問題:

test.rs:44:31: 44:41 error: cannot move out of dereference of & pointer 
test.rs:44   let path = &Path::new(*file_name); 

我已經在這裏打了磚牆,因爲當我用C中的指針很好,我對鏽的不同指針類型的理解實際上是不存在的。我能在這裏做什麼?

+1

我們只是添加了一個指針教程,它可能有助於您對指針的一般理解:http://static.rust-lang.org/doc/0.9/guide-pointers.html –

回答

4

嘗試&Path::new(file_name.as_slice())

不幸的是,由於特徵的論點,即Path::new()需要,如果你傳遞一個~str~[u8]它會嘗試直接使用該類型。這就是你通過*file_name傳遞的信息。除非你不能退出Rust的指針解引用,這就是爲什麼你會收到錯誤。

使用file_name.as_slice()而不是(這相當於,在這種情況下,(*file_name).as_slice(),但鐵鏽會做提領你),它會在~str轉換爲&str,然後可以傳遞給Path::new()沒有問題。

+0

太棒了,感謝您的解釋。 –

+0

你能否解釋一下'as_slice()'裏面發生了什麼。從源代碼[(linked)](http://static.rust-lang.org/doc/master/src/std/home/rustbuild/src/rust-buildbot/slave/doc/build/src/libstd/ str.rs.html#1280-1282),它看起來像一輩子正在附加?這意味着什麼「不能移出指針取消引用」? –

+0

@KiptonBarros:'.as_slice()'返回一個借來的數據引用。它確實有一個生命週期,它與被調用的值的生命週期相匹配。至於「不能移出指針解引用」,任何擁有值的仿射類型(例如'〜str')都不能被隱式複製。如果有東西試圖移動它們,則標記該值的原始位置已移動,因此無法使用。例如,'let a =〜「foo」;讓b = a; println!(「{}」,a)'告訴你'a'被移動。但是,您不能移出指針,因爲編譯器無法知道它指向的是什麼。 –