回覆列表
  • 1 # 使用者3964003095292

    區別就是你的無論是Ok還是Err,它們都是同一個型別Result。這樣有什麼用呢?這樣你就可以把一些呼叫串起來了,而不用每個都去 if err != nil。比如

    因為他們都是同一個型別Result,所以你可以對Ok和Err應用同樣的操作,而不一定必須要使用match來把資料取出來然後再分別處理。在上面的result它還是一個Result,中間三個函式func1、func2、func3呼叫只要任何一個返回了Err,那麼這個Err就是最終的返回值(and_then函式的作用),沒有出錯的話,那麼結果就是最後一個閉包函式的結果,這裡面是func3的結果。這些函式並沒有為哪個業務程式碼定製過,具有普適性,因為它們他們都是Result,透過and_then從一個Result轉變成另一個Result而已。而Go的err就不行了。實際上這三個if err == nil都是同樣的操作,但你卻怎麼都要寫這麼三個蛋疼的東西。Result這個東西是個ADT (Algebraic Data Type),是函數語言程式設計界已經普及了的東西。可以去看看OCaml, Haskell這些語言裡面ADT的相關應用來感受一下它所帶來的便捷性。Rust裡面的enum就是一個ADT,比較少用FP的同學可能會經常覺得需要用match去把資料取出來 好麻煩,其實ADT大多數時候都不是這麼用的。很多時候都只需要在呼叫鏈的最後最後才去把結果取出來,中間的結果可以用各種抽象的函式去封裝一些基本的操作來轉換。比如標準庫自帶的Result和Option,初學Rust的同學就是喜歡呼叫unwrap()提前把它的結果取出來,這並沒有什麼必要。

  • 中秋節和大豐收的關聯?
  • 生物工程專業去哪個國家留學?