อ่าน 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>ที่คล้ายกับ RustResult<T, E>และvavrซึ่งมีอินเทอร์เฟซEither<L, R>ที่คล้ายกับ HaskellEither 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 ( ' ไม่พบแมวที่ไหนเลย' ) } }ดูเพิ่มเติม
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ประเภทผลลัพธ์
ใน การเขียนโปรแกรมเชิงฟังก์ชัน ประเภทผลลัพธ์ ( result type) คือ ประเภทเอกนาม (monadic type) ที่เก็บค่าที่ส่งคืนหรือรหัสข้อผิดพลาด...
ตัวอย่าง
ใน C++ ถูกกำหนดโดยไลบรารีมาตรฐานเป็น. [ 1 ] std :: expected ใน Elm ถูกกำหนดโดยไลบรารีมาตรฐานเป็น.
ซี++
คลาส นี้ expected ใช้ std::unexpected() เพื่อส่งคืนประเภท E และสามารถส่งคืน T โดยตรงได้
สนิม
Enum ใน Rust เป็น ยูเนียนที่มีแท็ก ซึ่งสามารถแยกส่วนได้ด้วยการตรวจสอบประเภทที่เข้มงวดผ่านการจับคู่รูปแบบ