خطأ الصدأ "لا يمكن تحديد نوع لهذا التعبير"
-
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
في الواقع استخدام.في مرحلة ما من عملية سحب كل شيء بعيدا سوف تجد أين أنت والمترجم نختلف.