سؤال
إليك ما أحاول القيام به:افتح جميع وسيطات سطر الأوامر كملفات (ثنائية) واقرأ البايتات منها.إن بناء الجملة المتغير باستمرار هنا لا يؤدي إلى البحث على Google، ولكن إليك ما اكتشفته حتى الآن:
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، إلا أن فهمي لأنواع المؤشرات المختلفة في الصدأ غير موجود عمليًا.ماذا يمكنني أن أفعل هنا؟
المحلول
يحاول &Path::new(file_name.as_slice())
لسوء الحظ، بسبب حجة السمة التي Path::new()
يأخذ، إذا قمت بتمريره أ ~str
أو ~[u8]
سيحاول استهلاك هذا النوع مباشرة.وهذا ما تمر به *file_name
.باستثناء أنه لا يمكنك الخروج من مرجعية المؤشر في Rust، ولهذا السبب تحصل على الخطأ.
باستخدام file_name.as_slice()
بدلاً من ذلك (وهو ما يعادل، في هذه الحالة، (*file_name).as_slice()
, ، لكن Rust سيقوم بإلغاء المرجعية نيابةً عنك) فسيقوم بتحويل ملف ~str
إلى أ &str
, ، والتي يمكن بعد ذلك تمريرها إلى Path::new()
بدون مشكلة.