作者:
yam276 ('_')
2026-02-05 15:06:31※ 引述《Wardyal (滿穗的小狗)》之銘言:
: 這排版我感覺可讀性不太好
: 但是我把這些單行的 early return 都展開
: 又覺得可讀性還是很爛
: 反而更醜了
: 哪個好啊
: ==
函數式流派:Monadic Operations (C++23 風格)
如果你們在討論的是如何避免寫 if,並且像生產線一樣把函數串起來,那麼 and_then (
類似 Rust 的 ? 或 flatMap) 就是答案。
這通常用於將錯誤往上拋,而不是吞掉錯誤變成 bool。
// 假設 func1, func2 都回傳 Result<T, E>
return func1(...)
.and_then([&](auto val1) {
// 只有 func1 成功時才會進來
return func2(val1);
})
.and_then([&](auto val2) {
// 只有 func2 成功時才會進來
par = val2;
return Result<bool, Error>(true);
})
.or_else([&](const Error& err) {
// 只要上面任何一步出錯,就會直接跳到這裡 (Early Return 的變體)
spdlog::error("Error: {}", err.unwrap_str());
return Result<bool, Error>(false); // 或是把錯誤轉換後往上拋
});
優點: 非常像 Rust 或 JavaScript Promise,完全沒有 if,錯誤自動短路(Short-
circuiting)。
缺點: 這是「回傳表達式」,對於單純想賦值 (par = x) 的指令式代碼來說,這樣寫反
而變複雜了,且 Debug 難度稍高。