กลับไปหน้าบทความ

อ่าน 4 นาที

ประเภทผลลัพธ์

ใน การเขียนโปรแกรมเชิงฟังก์ชัน ประเภทผลลัพธ์ ( result type) คือ ประเภทเอกนาม (monadic type) ที่เก็บค่าที่ส่งคืนหรือรหัสข้อผิดพลาด...

ประเภทผลลัพธ์

ในการเขียนโปรแกรมเชิงฟังก์ชันประเภทผลลัพธ์ ( result type) คือประเภทเอกนาม (monadic type)ที่เก็บค่าที่ส่งคืนหรือรหัสข้อผิดพลาด ประเภทผลลัพธ์นี้ช่วยจัดการข้อผิดพลาดได้อย่างมีประสิทธิภาพ โดยไม่ต้องใช้การจัดการข้อยกเว้น (exception handling) เมื่อฟังก์ชันที่อาจล้มเหลวส่งคืนประเภทผลลัพธ์ โปรแกรมเมอร์จะต้องพิจารณาเส้นทางความสำเร็จหรือความล้มเหลวก่อนที่จะเข้าถึงผลลัพธ์ที่คาดหวัง ซึ่งจะช่วยขจัดความเป็นไปได้ที่โปรแกรมเมอร์จะตั้งสมมติฐานผิดพลาด

ตัวอย่าง

  • ในC++ถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 1 ]std::expected<T,E>
  • ในElmถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 2 ]typeResultev=Okv|Erre
  • ในHaskellตามธรรมเนียมEitherจะใช้ประเภทนี้เพื่อจุดประสงค์นี้ ซึ่งกำหนดโดยไลบรารีมาตรฐานเป็นโดยที่คือประเภทข้อผิดพลาด และคือประเภทการส่งคืน[ 3 ]dataEitherab=Lefta|Rightbab
  • ในJavaนั้น ประเภทนี้ไม่ได้อยู่ในไลบรารีมาตรฐานโดยตรง แต่มีให้ใช้งานจากไลบรารีของบุคคลที่สาม ตัวอย่างเช่นresult4jซึ่งมีอินเทอร์เฟซResult<R, E>ที่คล้ายกับ Rust Result<T, E>และvavrซึ่งมีอินเทอร์เฟซEither<L, R>ที่คล้ายกับ Haskell Either a bเนื่องจาก Java และ Kotlin สามารถใช้งานร่วมกันได้ Java จึงสามารถใช้Resultประเภทจาก Kotlin ได้
  • ในKotlinถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 4 ]valueclassResult<outT>
  • ในOCamlถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 5 ]type('a,'b)result=Okof'a|Errorof'btype
  • ในPythonฟังก์ชันนี้ไม่ได้อยู่ในไลบรารีมาตรฐานโดยตรง แต่สามารถใช้งานได้จากไลบรารีของบุคคลที่สาม เช่นreturnsและresult
  • ในRustถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 6 ] [ 7 ]enumResult<T,E>{Ok(T),Err(E)}
  • ในScalaไลบรารีมาตรฐานยังกำหนดEitherประเภท อีกด้วย [ 8 ]อย่างไรก็ตาม Scala ยังมีการจัดการข้อยกเว้นที่ เป็น แบบแผน มากกว่า
  • ในSwiftไลบรารีมาตรฐานกำหนดไว้ดังนี้[ 9 ]@frozenenumResult<Success,Failure>whereFailure:Error
  • ในภาษา Vนั้น ประเภทผลลัพธ์จะถูกนำมาใช้โดยตรงโดยใช้!Tเป็นประเภทการส่งคืนของฟังก์ชัน ตัวอย่างเช่นfn my_function() !string { ... }การจัดการข้อผิดพลาดในภาษา V

ซี++

คลาส นี้expected<T, E>ใช้std::unexpected()เพื่อส่งคืนประเภทEและสามารถส่งคืนTโดยตรงได้

import std ;using std :: expected ; using std :: ifstream ; using std :: string ; using std :: stringstream ; using std :: unexpected ; using std :: filesystem :: path ;enum class FileError { MISSING_FILE , NO_PERMISSION , // ข้อผิดพลาดอื่นๆ เพิ่มเติม};คาดหวัง< string , FileError > loadConfig ( const path & p ) noexcept { if ( ! std :: filesystem :: exists ( p )) { return unexpected ( FileError :: MISSING_FILE ); } ifstream config { p }; stringstream buffer ; if ( ! config.is_open () ) { return unexpected ( FileError :: NO_PERMISSION ) ; } buffer << config.rdbuf ( ) ; config.close ( ) ; return buffer.str ( ) ; }int main ( int argc , char * argv []) { path p { "configs/my_config.txt" }; if ( const expected < String , FileError > s = loadConfig ( p ); s . has_value ()) { std :: println ( "Config contents: {}" , s . value ()); } else { switch ( s . error ) { case FileError :: MISSING_FILE : std :: println ( "Error: path {} not valid or missing!" , p ); break ; case FileError :: NO_PERMISSION : std :: println ( "Error: no permission to read file at path {}!" , p ); break ; // additional cases... default : std :: unreachable (); } } }

สนิม

Enum ใน Rust เป็นยูเนียนที่มีแท็กซึ่งสามารถแยกส่วนได้ด้วยการตรวจสอบประเภทที่เข้มงวดผ่านการจับคู่รูปแบบ

const CAT_FOUND : bool = true ;fn main () { let result : Result < (), String > = pet_cat (); match result { Ok ( _ ) => println! ( "เยี่ยมเลย เราสามารถลูบแมวได้!" ), Err ( error ) => println! ( "โอ้ ไม่นะ เราไม่สามารถลูบแมวได้: {error}" ) } }fn pet_cat () -> Result < (), String > { if CAT_FOUND { Ok (()) } else { Err ( String :: from ( "ไม่พบแมว!" )) } }

วลัง

ประเภท นี้Errorเป็นอินเทอร์เฟซสำหรับiError.

คงที่cat_found = truefn main () { cat_name : = get_pet_cat_name () or { println ( "โอ้ ไม่นะ เราลูบแมวไม่ได้!" ) exit ( 1 ) } }println ( ' เยี่ยมเลยเราสามารถลูบแมวได้' + cat_name ) }fn get_pet_cat_name ( ) ! string { if cat_found { return ' Max ' } else { return error ( ' ไม่พบแมวที่ไหนเลย' ) } }

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=Result_type&oldid=1347450038 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ประเภทผลลัพธ์

ใน การเขียนโปรแกรมเชิงฟังก์ชัน ประเภทผลลัพธ์ ( result type) คือ ประเภทเอกนาม (monadic type) ที่เก็บค่าที่ส่งคืนหรือรหัสข้อผิดพลาด...

ตัวอย่าง

ใน C++ ถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 1 ] std :: expected ใน Elm ถูกกำหนดโดยไลบรารีมาตรฐานเป็น.

ซี++

คลาส นี้ expected ใช้ std::unexpected() เพื่อส่งคืนประเภท E และสามารถส่งคืน T โดยตรงได้

สนิม

Enum ใน Rust เป็น ยูเนียนที่มีแท็ก ซึ่งสามารถแยกส่วนได้ด้วยการตรวจสอบประเภทที่เข้มงวดผ่านการจับคู่รูปแบบ