سؤال

إليك ما أحاول القيام به:افتح جميع وسيطات سطر الأوامر كملفات (ثنائية) واقرأ البايتات منها.إن بناء الجملة المتغير باستمرار هنا لا يؤدي إلى البحث على 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() بدون مشكلة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top