خطأ الصدأ "لا يمكن تحديد نوع لهذا التعبير"

StackOverflow https://stackoverflow.com//questions/9660086

  •  12-12-2019
  •  | 
  •  

سؤال

أنا أكتب برنامج الصدأ بسيط.

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
    send(s,str::bytes("hello world"));
};

هناك بعض الخطأ على ذلك.

macmatoMacBook-Air-2:rust-http kula$ rustc http.rs
http.rs:40:4: 40:52 error: cannot determine a type for this expression
http.rs:40     result::chain(connect("localhost", port as u16)) {|s|
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous errors

ماذا حدث على ذلك?

هل كانت مفيدة؟

المحلول

فشل المترجم في استنتاج النوع الذي يحتج به هذا result::chain من المفترض أن يعود.من الصعب معرفة ذلك على وجه اليقين دون معرفة أنواع connect و send, ، ولكن أعتقد أنه لأن الجسم من كتلة لامدا الخاص بك هو (ربما عن طريق الخطأ) مما أدى إلى نوع لا شيء.

يتم تحديد نوع كل كتلة في الصدأ من قبل انها 'التعبير الذيل' ، ويتم إنشاء تعبيرات الذيل عن طريق ترك الفاصلة المنقوطة الخروج من البيان الختامي.يفترض, send إرجاع result اكتب وهذا هو السبب في أنك تستخدم result::chain على ذلك - بحيث تكون نتيجة التعبير بأكمله نتيجة send.لجعل هذا العمل send لا ينبغي إنهاء التعبير بفاصلة منقوطة.ثم كتلة لامدا الخاص بك سوف يعود نتيجة send.

شيء من هذا القبيل قد يعمل بشكل أفضل:

fn main(){
    let port = 80;
    result::chain(connect("localhost", port as u16)) {|s|
        send(s,str::bytes("hello world")) // <- no semicolon
    };
}

عندما يفشل نوع الاستدلال ، قد يكون من المفيد أحيانا تقسيم التعبيرات إلى سلسلة أصغر من العبارات وإدراج أنواع صريحة حتى تكتشف أين لا تتطابق الأنواع بشكل صحيح.إذا كنت ضرب شيء من هذا القبيل ، ولا يمكن معرفة ذلك عن طريق إيبالينغ لفترة من الوقت ، ثم أود أن تبدأ إعادة كتابة مثل

fn main(){
    let port = 80;
    let conn_result: result::t<connection, str> = connect("localhost", port as u16);
    let send_fn =  fn@(s: connection) -> result::t<str, str> {
        let send_result: result<str, str> = send(s,str::bytes("hello world"));
        ret send_result;
    };
    let res: result<str, str> = result::chain(conn_result, send_fn);
}

بالطبع استبدال أي أنواع connect و send في الواقع استخدام.في مرحلة ما من عملية سحب كل شيء بعيدا سوف تجد أين أنت والمترجم نختلف.

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