rust-lang / rfcs # 243 ๋ฐ rust-lang / rfcs # 1859์ ๋ํ ์ถ์ ๋ฌธ์ ์ ๋๋ค.
๊ตฌํ ๋ฌธ์ :
?
try!
-# 31954์ ๊ฑฐ์ ๋์ผํ ?
์ฐ์ฐ์try { ... }
ํํ์-https: //github.com/rust-lang/rust/issues/39849do catch { ... }
๊ตฌ๋ฌธ ์ง๋ฌธ ํด๊ฒฐtry { .. }
- https://github.com/rust-lang/rust/issues/50412try { expr? }?
ํ์ฌ ์ด๋๊ฐ์ ๋ช
์์ ์ธ ์ ํ ์ฃผ์์ด ํ์ํจ).Try
ํน์ฑ์ ์ค๊ณ ์ ์ฐฉ (https://github.com/rust-lang/rfcs/pull/1859)Try
ํธ๋ ์ด ํธ ( Carrier
)๋ฅผ ๊ตฌํํ๊ณ ?
๋ฅผ ๋ณํํ์ฌ ์ฌ์ฉํฉ๋๋ค (https://github.com/rust-lang/rust/pull / 42275)Option
๋ฑ์ ๋ํ impls ๋ฐ ์ ์ ํ ํ
์คํธ ์ ํ๊ตฐ ์ถ๊ฐ (https://github.com/rust-lang/rust/pull/42526)try
์์ฝtry{}catch
(๋๋ ๊ธฐํ ํ์ ID)๋ฅผ ์ฐจ๋จํ์ฌ ๋ฏธ๋๋ฅผ ์ํด ๋์์ธ ๊ณต๊ฐ์ ์ด์ด๋๊ณ ๋์ match
์ํ๋ ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค.ํจ๊ป ์ ๊ณต๋๋ RFC๋ ๋ ์ด๋ธ์ด ์ง์ ๋ ๋ฐํ / ์ค๋จ์ ๊ธฐ๋ฐ์ผ๋ก desugaring์ ๋ํด ์ค๋ช
ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๋ ๊ฒ๋ฉ๋๊น ์๋๋ฉด ์ปดํ์ผ๋ฌ์์ ?
๋ฐ catch
์ ๋ํ ํน์ ์ฒ๋ฆฌ๊ฐ ์์๊น์?
ํธ์ง : ๋ ์ด๋ธ ๋ฐํ / ํด์์ ?
๋ฐ catch
๊ณผ๋ ๋ณ๊ฐ์ ํ๋ฅญํ ์์ด๋์ด๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ๋๋ต์ด '์๋์'์ด๋ฉด ๋ณ๋์ RFC๋ฅผ ์ด ๊ฒ์
๋๋ค.
๋ ์ด๋ธ์ด์๋ ๋ฐํ / ํด์์ ์์ ํ ์ค๋ช ์์ํ ๊ฒ์ ๋๋ค.
2016 ๋
2 ์ 5 ์ผ ๊ธ์์ผ ์คํ 3:56, Jonathan Reem [email protected]
์ผ๋ค :
์ฒจ๋ถ ๋ RFC๋ ๋ ์ด๋ธ์ด์๋ ๋ฐํ / ํด์์ ๊ธฐ๋ฐ์ผ๋ก ์คํ ์ ๊ฑฐ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ฐ๊ณ ์์ต๋๊น ์๋๋ฉด ํน๋ณํ ๋์ฐ๊ฐ ์์ต๋๊น? ๊ณผ
์ปดํ์ผ๋ฌ์์ ์ก์?โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/31436#issuecomment -180551605.
์ฐ๋ฆฌ๊ฐ ์์ ํ๋๊ธฐ ์ ์ ํด๊ฒฐํ๋ ๋ฐ ๋ ๋ค๋ฅธ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๋ ๊ณ์ฝ ๊ฒ์
๋๋ค impl
s์ Into
์ฌ๋ถ - ์์ข
์ด ์์ด์ผ ํ ํ์๊ฐ Into
์ฌ์ฉ์ผ๋ก๋ ์ฌ๋ฐ๋ฅธ ํน์ฑ์
๋๋ค ์ฌ๊ธฐ์์ ์ค๋ฅ ์
์บ์คํ
์ ์ํด. (์๋ง ์ด๊ฒ์ ๋ค๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ ํญ๋ชฉ์ด์ด์ผํฉ๋๊น?)
๋ฆผ
๋ ์ด๋ธ ๋ฐํ / ํด์์ ํ๋ฅญํ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์๋ง๋ ๋ณ๋์ RFC๋ฅผ ์ด ๊ฒ์ ๋๋ค.
์ ๋ฐ!
Carrier
ํน์ฑ์ ์ฃผ์ ์ ๋ํด RFC ํ๋ก์ธ์ค ์ด๊ธฐ์ ์์ฑํ ํน์ฑ์ ์์ ์๊ฐ ์์ต๋๋ค.
https://gist.github.com/thepowersgang/f0de63db1746114266d3
๊ตฌ๋ฌธ ๋ถ์ ์ค์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ฉ๋๊น?
struct catch {
a: u8
}
fn main() {
let b = 10;
catch { a: b } // struct literal or catch expression with type ascription inside?
}
@petrochenkov ์, ์ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ์ํฅ์ ์ค ์ ์์ง๋ง {
, :
์ดํ์ ๋ ๋ฒ์งธ ํ ํฐ์ ๊ธฐ๋ฐ์ผ๋กํ๋ ์๊ฒฌ ๊ท์น์ด ์ฌ์ ํ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด๋ก ๊ตฌ๋ฌธ ๋ถ์๋ฉ๋๋ค.
๋ํ
let c1 = catch { a: 10 };
let c2 = catch { ..c1 }; // <--
struct catch {}
let c3 = catch {}; // <--
+ https://github.com/rust-lang/rfcs/issues/306 (์ธ์ !) ๊ตฌํ ๋ ๊ฒฝ์ฐ.
๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด ์ธ์ ์ถฉ๋์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ ์๊ฐ ์ฃผ์ด์ง๋ฉด ๊ฐ์ฅ ๊ฐ๋จํ ์๋ฃจ์
(ํ์์ฒ๋ผ)์
๋๋ค. ํญ์ ํํ์ ์์น์์ catch {
๋ฅผ catch
๋ธ๋ก์ ์์์ผ๋ก ์ทจ๊ธํฉ๋๋ค. ์ด์จ๋ ๊ตฌ์กฐ๋ฅผ catch
๋ผ๊ณ ๋ถ๋ฅด๋ ์ฌ๋์ ์์ต๋๋ค.
catch
๋์ ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ฌ์ธ ๊ฒ์
๋๋ค.
๋ค์์ ํค์๋ ๋ชฉ๋ก์ ๋๋ค. http://doc.rust-lang.org/nightly/grammar.html#keywords
@bluss ๊ทธ๋, ๋๋ ๊ทธ๋ค ์ค ๋๊ตฌ๋ ํ๋ฅญํ์ง override
๋ ๊ฐ๊น์ด ์ ์ผํ ์ฌ๋์ธ ๊ฒ ๊ฐ๋ค. ๋๋ do
์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ์กฐํฉ, ๋น๋ก ๋ด๊ฐ ์ฆ์ ์ข์ ๊ฒ์ ๋ณด์ง ๋ชปํ๋๋ผ๋. do catch
?
do
์ IMO์ ๊ฐ๊น์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ ์ผํ ๊ฒ์
๋๋ค. do
์ ๋์ฌ๊ฐ์๋ ํค์๋ ์ํ๋ ์ธ์ด์ ๋ค๋ฅธ ๋ถ๋ถ๊ณผ ๋น์ทํ์ง ์์ ์ฝ๊ฐ ๋ถ๊ท์นํ๊ฐ์? while let
๋ ํค์๋ ์ํ์
๋๊น? ์ต์ํด์ง๋ฉด ์ด์ ๊ด์ฐฎ๋ค๊ณ ๋๊ปด์ง๋๋ค.
?
์ฌ์ฉ์์ํ ํฌํธtry!
?
?
try!
๋์ Result
๋ฐํ ๊ฒฝ๋ก๋ฅผ ์ป์ผ๋ ค๋ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ฉํฉ๋๋ค. try!
ํ๋ฉด ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ํ์ผ ์์ ๋ถ๋ถ (๋๋ lib / main.rs)์์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ ์ํ๊ธฐ ๋งํ๋ฉด๋ฉ๋๋ค.
macro_rules! try {
($expr:expr) => (match $expr {
Result::Ok(val) => val,
Result::Err(err) => {
panic!("Error occured: {:?}", err)
}
})
}
Result
๋ฐํ ๊ฒฝ๋ก์์ try!
์ ์ฒซ ๋ฒ์งธ ๋ฐ์๋ถํฐ ํจ๋ ์คํ ์ถ์ ์ด ๋ฐ์ํฉ๋๋ค. ๋น์ ์ด ํ ๊ฒฝ์ฐ ์ฌ์ค, try!(Err(sth))
๋์ ์ ์ค๋ฅ ๋ฐ๊ฒฌํ๋ ๊ฒฝ์ฐ return Err(sth)
, ๋น์ ๋ ์ ์ฒด ์คํ ์ถ์ ์ ์ป์.
๊ทธ๋ฌ๋ ๊ทธ ํธ๋ฆญ์ ๊ตฌํํ์ง ์์ ์ฌ๋๋ค์ด ์์ฑํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋๋ฒ๊น
ํ ๋๋ ์ฒด์ธ์ ์ด๋๊ฐ์์ try!
์ฌ์ฉ์ ์์กดํฉ๋๋ค. ์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ๋ ์ฝ๋ฉ ๋ ๋์์ผ๋ก ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ ์ถ์ ์ ์ป๋ ๊ฒ์ด ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
try!
์ฌ์ ์๊ฐ ?
์ฐ์ฐ์์๋ ์ํฅ์ ๋ฏธ์น๋ฉด ๋ฉ์ง ๊ฒ์
๋๋ค.
๋์ค์ ๋งคํฌ๋ก ์์คํ ์ ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ฉด ๋นํฉ ํ ์๋ ์์ต๋๋ค! ํน์ ์ ํ์๋ง ํด๋น๋ฉ๋๋ค.
์ด ์ ์์ RFC๊ฐ ํ์ํ ๊ฒฝ์ฐ ์๋ ค ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
์ด์์ ์ผ๋ก ?
๋ง์ด ์๋๋ผ ๋์ฒด ํ ์์๋ ๋ฅ๋ ฅ์ ์์กดํ์ง ์๊ณ , ์ง์ ์คํ ์ถ์ ์ง์์ ์ ๊ณตํ๋๋ก ํ์ฅ ํ ์ try!
. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ ๊ณณ์์ ์๋ํฉ๋๋ค.
์คํ ์ถ์ ์ ํ๋์ ์์ผ๋ฟ์
๋๋ค (๋งค์ฐ ์ ์ฉํ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง).
Carrier ํน์ฑ์ด ์๋ํ๋๋ก ๋ง๋ค์ด์ง๋ฉด ๊ทธ๋ฌํ ํ์ฅ์ ํฌํจ ํ ์ ์์ต๋๊น?
2016 ๋
2 ์ 7 ์ผ ์ผ์์ผ ์คํ 4:14, Russell Johnston [email protected]
์ผ๋ค :
์ด์์ ์ผ๋ก? ์คํ ์ถ์ ์ง์์ ์ง์ ์ ๊ณตํ๋๋ก ํ์ฅ ํ ์ ์์ต๋๋ค.
try!๋ฅผ ์ฌ์ ์ํ๋ ๊ธฐ๋ฅ์ ์์กดํ์ง ์๊ณ ๊ทธ๋ฐ ๋ค์ ์๋ํฉ๋๋ค
์ด๋์๋.โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/31436#issuecomment -181118499.
์ถ์ธกํ๊ณ ์ถ์ง๋ ์์ง๋ง ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ง๋ง ์๋ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Result<V,E>
๊ฐ์ ๋ฐํํ๋ ์ฝ๋๊ฐ์๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์ด์ Carrier
ํน์ฑ์ ์ฌ๋ฌ ๊ตฌํ์ด ๊ณต์กด ํ ์ ์๋๋กํด์ผํฉ๋๋ค. E0119 ๋ก ์คํ๋์ง ์์ผ๋ ค๋ฉด ๋ชจ๋ ๊ตฌํ์ ๋ฒ์๋ฅผ ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ ์ฌ์ฉ์๋ ์ํ๋ ํญ๋ชฉ์ ๊ฐ์ ธ์์ผํฉ๋๋ค. ์ดํ.
์ด๋ฅผ ์ํด์๋ ๋๋ฒ๊ทธ๋ฅผ ์ํ์ง ์๋ ์ฌ๋์ด๋ผ๋ ?
์ฌ์ฉํ ๋ ์ํ๋ ํน์ฑ ๊ตฌํ์ ๊ฐ์ ธ์์ผํ๋ฉฐ ๋ฏธ๋ฆฌ ์ ์ ๋ ๊ธฐ๋ณธ๊ฐ์ ๋ํ ์ต์
์ด ์์ต๋๋ค.
๋ชจ๋ ์ ํ์ด ๊ฒฝ๊ณ๋ฅผ ๋ฒ์ด๋ Result<V,E>
๋ํด ์ฌ์ฉ์ ์ ์ Carrier
๊ตฌํ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ E0117 ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์์ผ๋ฏ๋ก libstd๋ ์ด๋ฏธ Carrier
์ ๊ตฌํ ์ธํธ๋ฅผ ์ ๊ณตํด์ผํฉ๋๋ค. ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ฌ์ฉ ์ฌ๋ก์ panic!
๊ตฌํ ๋ฑ).
๋งคํฌ๋ก๋ฅผ ํตํด ์ฌ์ ์ ํ ์์๋ ๊ฐ๋ฅ์ฑ์ ์๋ ๊ตฌํ ์์ ๋ํ ์ถ๊ฐ ๋ถ๋ด์์ด ๋ ํฐ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค (์ํ๋ ๊ตฌํ์ ๊ฐ์ ธ์ฌ ํ์๊ฐ ์์). ํ์ง๋ง Rust์๋ ์ด์ ์ ๋งคํฌ๋ก ๊ธฐ๋ฐ ์ฐ์ฐ์๊ฐ ์์์ผ๋ฉฐ, catch { ... }
๊ฐ ์๋ํด์ผํ๋ ๊ฒฝ์ฐ ๋งคํฌ๋ก๋ฅผ ํตํด ?
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. return_to_catch
, throw
, RFC 243์์ ์ฌ์ฉ๋๋๋๋ก ๋งค๊ฐ ๋ณ์๋ก break
๋ ์ด๋ธ์ด ์ง์ ๋จ).
Err
๋ฐํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ Result
์คํ ํธ๋ ์ด์ค๋ฅผ ์ป์ ์์๋ ์ค์ ์ ๊ด์ฐฎ์ต๋๋ค. ํ์ผ ์๋จ์์ ๋งค์ฐ ์ ์ ์์ ์ฝ๋ ๋ง ์์ ํ๋ฉด๋ฉ๋๋ค. ๋ํ์ด ์๋ฃจ์
์ Err
์ ํ์ด ๊ตฌํ๋๋ ๋ฐฉ๋ฒ ๋ฐ ์์น์ ๋ฌด๊ดํ๊ฒ ์๋ํด์ผํฉ๋๋ค.
์์ ๊ฑฐ ํ๋ฆฌ๊ธฐ์ ์ฐจ์ : catch in { ... }
์ ๊ฝค ๋ฉ์ง๊ฒ ํ๋ฆ
๋๋ค.
catch! { ... }
์ ๋ ๋ค๋ฅธ backcompat ์ ํ์
๋๋ค.
๋ํ ์ด๊ฒ์ด ๋ณ๊ฒฝ ๋ ๊ฒ์ผ๋ก ๊ธฐ๋ํ์ง๋ ์์ง๋ง, ์ ํ ์ง์ ์ด $i:ident : $t:ty
๊นจ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก $i:ident ?
๋ฐ์๋ค์ด๋ ๋ค์ค ์ ๋งคํฌ๋ก๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๋ ์ ์ ์ ์ํ์ธ์.
์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ์ง ๋ง๊ณ {
๋ค์์ catch
๋ฅผ ์ฒ๋ฆฌํ์ญ์์ค (์๋ง๋ ํํ์ ์์น์์๋ง ๊ฐ๋ฅํ์ง๋ง ํธํ์ฑ ์ธก๋ฉด์์ ๋ง์ด ๋ณ๊ฒฝ๋๋์ง ํ์คํ์ง ์์ต๋๋ค).
๋ํ ๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด์ ํฌํจํ์ง ์๋ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ๋ฌธ์ ๋ฅผ ์์ํ ์ ์์ต๋๋ค (์ : let catch = true; if catch {}
); ๊ทธ๋ฌ๋ ๋๋ ์ถ์
ํ ๊ตฌ๋ฌธ๋ณด๋ค ์ฌ์ํ ๋ณ๊ฒฝ์ ์ ํธํฉ๋๋ค.
์ด์จ๋ ์ ํค์๋๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ํ์ํ ๊ฒ์ด ์์ต๋๊น? ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ํด ์ผ์ข
์ from __future__
์ตํธ ์ธ์ ์ ๊ณต ํ ์ ์์ต๋๋ค. ๋๋ ๋ช
๋ น ์ค / Cargo.toml์์ rust ์ธ์ด ๋ฒ์ ๋ฒํธ๋ฅผ ์ง์ ํ์ญ์์ค.
์ฅ๊ธฐ์ ์ผ๋ก๋ ์ด๋ฏธ ์์ฝ ๋ ํค์๋๋ก๋ง ์์
ํ ์ ์์์ง ์์ฌ ์ค๋ฝ์ต๋๋ค. ๋ฌธ๋งฅ์ ๋ฐ๋ผ ํค์๋๊ฐ ๊ฐ๊ฐ ์ธ ๊ฐ์ง ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ๊ธฐ๋ฅผ ์ํ์ง ์์ต๋๋ค.
๋๋ ๋์ํ๋ค. ์ด๊ฒ์ ์ด๊ฒ์ด ๋์จ ์ฒซ ๋ฒ์งธ RFC๋ ์๋๋๋ค (https://github.com/rust-lang/rfcs/pull/1444๊ฐ ๋ ๋ค๋ฅธ ์์
๋๋ค). ๋๋ ๊ทธ๊ฒ์ด ๋ง์ง๋ง์ด ์๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. (๋ํ https://github.com/rust-lang/rfcs/pull/1210์ default
, ์ ๊ฐ โโ์ ํธํ๋ RFC๋ ์๋์ง๋ง) ์ถ๊ฐ ํ ๋ฐฉ๋ฒ์ ์ฐพ์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ก์ด ๊ฒฝ์ฐ๋ง๋ค ๋ฌธ๋ฒ์ ์์๋ก ํดํนํ๋ ๋ฐฉ๋ฒ์ ์์๋ด๋ ๋์ ์ ์งํ ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1.0 ์ด์ ์ ์ฌ๋ฌ ํค์๋๋ฅผ ์์ฝํ์ง ์์๋ค๋ ์ ์ฒด ์ฃผ์ฅ์ด ์ธ์ด์ ์ ํค์๋๋ฅผ ์ญ ํธํ ์ ์ผ๋ก (์๋ง๋ ๋ช ์ ์ ์ผ๋ก ์ตํธ ์ธํ์ฌ) ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ํ์คํ ๋์ ํ ๊ฒ์ด๋ผ๋ ๊ฒ์ด ์๋ ์์ต๋๊น? ์ง๊ธ์ด ์ข์ ์๊ฐ์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@japaric ์์ ์ PR์ ๋ ์ด๋ฆฌ๊ณ ์ด๊ฒ์ ๋ฐ์๋ค์ด๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๊น?
@aturon ๋ด ๊ตฌํ์ try!(foo)
๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก foo?
๋ฅผ ๊ฐ๋จํ desugaredํ์ต๋๋ค . ๋ํ ๋ฉ์๋ ๋ฐ ํจ์ ํธ์ถ์์๋ง ์๋ํ์ต๋๋ค. ์ฆ foo.bar()?
๋ฐ baz()?
์๋ํ์ง๋ง quux?
๋ฐ (quux)?
์๋ํ์ง ์์ต๋๋ค. ์ด๊ธฐ ๊ตฌํ์์ ๊ด์ฐฎ์๊น์?
@japaric ๋ฉ์๋์ ํจ์ ํธ์ถ๋ก ์ ํ ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ผ๋ฐ์ ์ธ ์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ก ํ์ฑํ๋ ๊ฒ์ด ๋ ์ฌ์ธ๊น์?
๋ฉ์๋์ ํจ์ ํธ์ถ๋ก ์ ํ ํ ์ด์ ๋ ๋ฌด์์ ๋๊น?
?
ํ์ฅ์ ํ
์คํธํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ
์ผ๋ฐ์ ์ธ ์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ก ํ์ฑํ๋ ๊ฒ์ด ๋ ์ฌ์ธ๊น์?
์๋ง
@japaric ์๋ง ์ ์ฒด ์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ก ์ผ๋ฐํํ๋ ๊ฒ์ด ์ข์ง๋ง ( @eddyb ์ด ์ ์ํ๋๋ก) ๊ฐ๋จํ ํ๋น์ผ๋ก ?
๋ฅผ ์ค์ ํ ๋ค์ ๋์ค์ catch
๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@aturon ์ข์, ์๋ฌด๋ ๋๋ฅผ ์ด๊ธธ ์ ์๋ค๋ฉด ๋ค์ ์ฃผ๊น์ง postfix ๋ฒ์ ์ ์ดํด๋ณผ ๊ฒ์ ๋๋ค :-).
# 31954์์ ๋ด PR์ ์ ๋ฐ์ดํธ / ์ ๋ฐ์ดํธํ์ต๋๋ค. :-)
์คํ ์ถ์ ์ ๊ณต์ ๋ํ ์ง์์ ์ด๋ป์ต๋๊น? ๊ณํ๋ ๊ฑด๊ฐ์?
๋๋ +1 ๋จ์๊ฐ๋๋ ๊ฒ์ด ์ซ์ง๋ง, ์คํ ํธ๋ ์ด์ค๋ ๊ณผ๊ฑฐ์ ๋ด ์๊ฐ์ ์ข์ ๋ฉ์ด๋ฆฌ๋ฅผ ์ ์ฝํ๋ค. ๋๋ฒ๊ทธ ๋น๋์์, ์ค๋ฅ ๊ฒฝ๋ก์ ๋๋ฌํ๋ฉด? ์ฐ์ฐ์๋ ๊ฒฐ๊ณผ์์ Vec์ ํ์ผ / ์ค์ ์ถ๊ฐ ํ ์ ์์ต๋๊น? Vec๋ ๋๋ฒ๊ทธ ์ ์ฉ ์ผ ์ ์์ต๋๊น?
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ ธ์ถ๋๊ฑฐ๋ ์ค๋ฅ ์ค๋ช ์ ์ผ๋ถ๋ก ๋ฐ๋ ์ ์์ต๋๋ค.
Option<Result<T, E>>
๋ฐํํ๋ ๋ฐ๋ณต๊ธฐ ๋ด๋ถ์์ try!
/ ?
์ (๋ฅผ) ์ฌ์ฉํ๋ ค๋ ์ํฉ์ด ๊ณ์ ๋ฐ์ํฉ๋๋ค. ๋ถํํ๋ ํ์ฌ๋ ์ค์ ๋ก ์๋ํ์ง ์์ต๋๋ค. ์บ๋ฆฌ์ด ํน์ฑ์ด์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ์ค๋ฒ๋ก๋ ๋ ์ ์๋์ง ์๋๋ฉด๋ณด๋ค ์ผ๋ฐ์ ์ธ From
๋ก ๋ค์ด๊ฐ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@hexsel ๋๋ ์ ๋ง๋ก Result<>
์ ํ์ด ๋๋ฒ๊ทธ์์ ๋ช
๋ น์ด ํฌ์ธํฐ์ vec๋ฅผ ์ ๋ฌํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ถ๊ฐ ํ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ์์ผ๋ก DWARF ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์ ์์๋ ์คํ ์ถ์ ์ ๊ตฌ์ถ ํ ์ ์์ต๋๋ค.
@mitsuhiko ํ์ง๋ง ์ด๋ป๊ฒ Result
๋ฅผ ๋ง๋ค๊ณ ํจํด ๋งค์นญ ํ ์ ์์๊น์? enum
atm์
๋๋ค.
์ ๋ํด์๋ Option
ํฌ์ฅ, ๋๋ ๋น์ ์ด ์ํ๋ ์๊ฐ Some(catch {...})
.
ํ์ฌ, ๋ด ์ต๊ด์ด ์ง๊ธํ๋ ๊ฒ์
๋๋ค try!(Err(bla))
๋์ return Err()
๋ด๊ฐ ํ๋์ ๋์ค์ ์๋ ๋งคํฌ๋ก๋ฅผ ์ฌ์ ์ ํ ์ ์์ต๋๋ค ๊ทธ๋์, ๊ทธ ํจ๋, ๋ฐฑ ํธ๋ ์ด์ค๋ฅผ ์ป๊ธฐ ์ํด์์ด๋ค. ๊ทธ๊ฒ์ ๋์๊ฒ ์ ์๋ํ์ง๋ง ๋ด๊ฐ ๋ค๋ฃจ๋ ์ฝ๋๋ ๋งค์ฐ ๋ฎ์ ์์ค์ด๋ฉฐ ๋๋ถ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. Result
๋ฅผ ๋ฐํํ๋ ์ธ๋ถ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ฌ์ ํ ?
๋ฅผ ํผํด์ผํฉ๋๋ค.
@eddyb ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์กฐ์ํด์ผํ๋ ๊ฒ ์ธ์๋ ์จ๊ฒจ์ง ๊ฐ์ ์ ๋ฌํ๋ ค๋ฉด ์ธ์ด ์ง์์ด ํ์ํฉ๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์์์ง ๊ถ๊ธํ๋๋ฐ ์ด๋ป๊ฒ๋๋์ง ๋ชจ๋ฅด๊ฒ ์ด์. ์ ์ผํ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ถ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจ ํ ์์๋ ํ์คํ ๋ ์ค๋ฅ ์์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ ์ค๋ฅ๊ฐ์์ ํ์๊ฐ ์์ผ๋ฉฐ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด์ด๋ฅผ ์ํํ์ง ์์ต๋๋ค.
@mitsuhiko Error
ํธ๋ ์ด ํธ์ TLS์ ๋ํ ์๋ก์ด (๊ธฐ๋ณธ) ๋ฉ์๋๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค.
ํ์๋ ๋๋๋ก ์ด๊ท ์ ์ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
@eddyb ๋ ๊ฒฐ๊ณผ๋ฅผ ์๋ณ ํ ์ ์๊ณ ์์์
@mitsuhiko TLS? ์ค์ ๋ก๋ ๊ฐ๋ณ๋ก ์ค๋ฅ๋ฅผ ๋น๊ตํ ์ ์์ด์ผํฉ๋๋ค.
๋๋ ์ ํ๋ณ๋ก ( From
์
๋ ฅ ๋ฐ ์ถ๋ ฅ ์ฐ๊ฒฐ ํฌํจ) ์คํ ์ถ์ ์ ์ํ๋ ๋์ ์ค๋ฅ ์๋ฅผ ๋์์ ์ ํํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๊น?
๋ ๊ฐ๋จํ ์๋ฃจ์
์ด ์๋ ํ ๋ ๊ฐ์ธ์ ์ผ๋ก Result
-ํน์ ์ปดํ์ผ๋ฌ ํดํน์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๋ค.
@eddyb ์ค๋ฅ๊ฐ ์คํ ์๋ก ์ ๋ฌ๋ฉ๋๋ค. ๋น์ ์ด ์ํ๋ ๊ฒ์ ๊ทธ๊ฒ์ด ์์๋๋ ๊ณณ๋ฟ๋ง ์๋๋ผ ๋ชจ๋ ์คํ ์์ค์ EIP์ ๋๋ค. ๋ํ ์ค๋ฅ๋ a) ํ์ฌ ๋น๊ตํ ์ ์์ผ๋ฉฐ b) ๋์ผํ๊ฒ ๋น๊ตํ๋ค๊ณ ํด์ ๋์ผํ ์ค๋ฅ๋ผ๋ ์๋ฏธ๋ ์๋๋๋ค.
์คํ ์ถ์ ์ ์ํ๋ ๋์ ์ค๋ฅ ์๋ฅผ ๋์์ ์ ํํด์ผํฉ๋๋ค.
๋ชจ๋ ์ค๋ฅ๊ฐ ํฌ์ฐฉ๋์ด ๋ค๋ฅธ ์ค๋ฅ๋ก ๋ค์ ๋ฐ์ํฉ๋๋ค.
๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์๋ ํ ๋ ๊ฐ์ธ์ ์ผ๋ก ๊ฒฐ๊ณผ ๋ณ ์ปดํ์ผ๋ฌ ํดํน์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๋ค.
๋ ๊ฐ๋จํ ์๋ฃจ์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ ์ ์์ง๋ง ๊ฑฐ๊ธฐ์ ๋ญ๊ฐ ๋น ์ก์ ์๋ ์์ต๋๋ค.
?
๋ง๋ค ๋ช
๋ น ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๊ณ ์ค๋ฅ ์ ํ๊ณผ ์ฐ๊ด์ํฌ ์ ์์ต๋๋ค.
"๋ชจ๋ ์ค๋ฅ๊ฐ ํฌ์ฐฉ๋์ด ๋ค๋ฅธ ์ค๋ฅ๋ก ๋ค์ ๋ฐ์ํฉ๋๋ค." ํ์ง๋ง Result
์ ์จ๊ฒจ์ง ์ ๋ณด๋ ์ด๋ป๊ฒ ๋ณด์กดํ ๊น์?
ํ์ง๋ง ๊ฒฐ๊ณผ์ ์จ๊ฒจ์ง ์ ๋ณด๋ ์ด๋ป๊ฒ ๋ณด์กดํ ๊น์?
๊ฒฐ๊ณผ์ ํด๋น ์ ๋ณด๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค. ์ ์ฅํด์ผํ๋ ๊ฒ์ ์คํจ์ ์์ธ์ ๋ํ ๊ณ ์ ID์ด๋ฏ๋ก ์๊ด ๊ด๊ณ๋ฅผ ๋ถ์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ ํน์ฑ์ ํน์ฑ ์ผ ๋ฟ์ด๋ฉฐ ์ ์ฅ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฒฐ๊ณผ์ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ช ๋ น์ด ํฌ์ธํฐ vec ์์ฒด๋ ๊ฒฐ๊ณผ์ ์ ์ฅ ๋ ํ์๊ฐ ์์ผ๋ฉฐ TLS๋ก ์ด๋ํ ์ ์์ต๋๋ค.
ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๊ฒฐ๊ณผ์ ๋ํด failure_id(&self)
๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ i64 / uuid ๋๋ ์คํจ์ ์์ธ์ ์๋ณํ๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ฐํํ๋ ๊ฒ์
๋๋ค.
๊ฒฐ๊ณผ๊ฐ ์คํ์ ํตํด ์์ชฝ์ผ๋ก ์ ๋ฌ ๋ ๋ ์ปดํ์ผ๋ฌ๊ฐ ํต๊ณผํ๋ ์คํ ํ๋ ์์ ๊ธฐ๋กํ๋ ๋ช ๋ น์ด๋ฅผ ์ฃผ์ ํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๊ฒ์ด ๋ฌด์์ด๋ ์๊ด์์ด ์ธ์ด ์ง์์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ๋ฐํ์ ๋๋ฒ๊ทธ ๋น๋์์ ๋ค๋ฅด๊ฒ ๋ณด์ผ ๊ฒ์ ๋๋ค.
"์ปดํ์ผ๋ฌ๊ฐ ์คํ ํ๋ ์์ ๊ธฐ๋กํ๋ ๋ช
๋ น์ด๋ฅผ ์ฝ์
ํฉ๋๋ค."-ํ์ง๋ง ?
๋ ๋ช
์ ์ ์
๋๋ค. ์์ธ์๋ ๋ค๋ฆ
๋๋ค. ์๋๋ฉด ํต๊ณผ ํ ?
๋ง ๊ธฐ๋กํ๋ ๊ฒ์ ์ข์ํ์ง ์์ต๋๊น?
์ด์จ๋ ์๋์ผ๋ก ์ค๋ฅ์ ์์ถ์ ํ๊ณ Err
๋ค์ ๋ฃ์ผ๋ฉด ํด๋น ID๊ฐ ์ด๋ป๊ฒ ์ ์ง๋ฉ๋๊น?
"์ค๋ฅ ํน์ฑ์ ํน์ฑ ์ผ ๋ฟ์ด๋ฉฐ ์ ์ฅ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ๊ฒฐ๊ณผ์ ์ ์ฅํ ์ ์์ต๋๋ค."
์ด์ ๋ํ ๋ณํ์ด ์์ต๋๋ค. Error
ํน์ฑ์ ๊ตฌํํ๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์์ ํน์ํ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ ํ์ ์ ์ ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ ํ์ ์์ฑํ๋ฉด ID๊ฐ ์์ฑ ๋๊ณ ๋ณต์ฌ / ์ญ์ ๊ฐ ์ํ๋ฉ๋๋ค. refcount๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฆ๊ฐ / ๊ฐ์์ํต๋๋ค (๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ตญ Result::unwrap
๊ฐ ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ TLS "in-flight error set"์์์ด๋ฅผ ์ง ์๋๋ค).
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ Copy
ํน์ฑ๊ณผ ์ถฉ๋ํฉ๋๋ค. ๊ทํ์ ๊ณํ๋ ?
๋๋ ๊ธฐํ ํน์ ์ฌ์ฉ์ ์์
์ ์ํด ํธ๋ฆฌ๊ฑฐ๋์ง _ ์๋ _ Result
ํน๋ณํ ๋์์ ์ถ๊ฐํ๋ฉด Copy
๋ถ๋ณ์ฑ์ด ๋ฌดํจํ ๋ ์ ์์ต๋๋ค.
ํธ์ง :์ด ์์ ์์ Rc<ErrorTrace>
๋ฅผ ๊ฑฐ๊ธฐ์ ํฌํจ์ํฌ ์๋ ์์ต๋๋ค.
EDIT2 : ๋ด๊ฐ ๋งํ๋ ๊ฒ์ catch
์์ ๊ด๋ จ ์ค๋ฅ ์ถ์ ์ ์ง์ธ ์ ์์ต๋๋ค.
EDIT3 : ์ค์ ๋ก ๋๋กญ์ ๋ ๋์ ์ค๋ช
์ ์ฐธ์กฐํ์ญ์์ค.
"์ปดํ์ผ๋ฌ๋ ์์ ์ด ํต๊ณผํ๋ ์คํ ํ๋ ์์ ๊ธฐ๋กํ๋ ๋ช ๋ น์ ์ฃผ์ ํฉ๋๋ค"-ํ์ง๋ง? ๋ช ์ ์ ์ ๋๋ค. ์ด๊ฒ์ ์์ธ์ ๊ฐ์ง ์์ต๋๋ค. ์๋๋ฉด? ํต๊ณผ ํ๋์?
?
์ฌ์ฉํ์ง ์๊ณ ๋์ด๊ฐ ์์๋ ํ๋ ์์ด ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. ๋ชจ๋๊ฐ ?
๋ง์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋๋๋ค.
์ด์จ๋ ์๋์ผ๋ก ์ค๋ฅ์ ์์ถ์ ํ๊ณ ๋ค์ Err์ ๋ฃ์ผ๋ฉด ๊ทธ ID๊ฐ ์ด๋ป๊ฒ ์ ์ง๋ฉ๋๊น?
์ด๊ฒ์ด ์ปดํ์ผ๋ฌ ์ง์์ด ํ์ํ ์ด์ ์ ๋๋ค. ์ปดํ์ผ๋ฌ๋ ๊ฒฐ๊ณผ ์ธ ์ง์ญ ๋ณ์๋ฅผ ์ถ์ ํด์ผํ๋ฉฐ ์ฌ ๋ํ์ ์ํด ๊ฒฐ๊ณผ ID๋ฅผ ์์ผ๋ก ์ ํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ด๊ฒ์ด ๋๋ฌด ๋ง๋ฒ์ ์ธ ๊ฒฝ์ฐ ์์ ์ ํ์ ์งํฉ์ผ๋ก ์ ํ ๋ ์ ์์ต๋๋ค.
?
์ฌ์ฉํ์ง ์๊ณ ๋์ด๊ฐ ์์๋ ํ๋ ์์ด ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ์๋ํ์ง ์์ต๋๋ค. ๋ชจ๋๊ฐ?
๋ง์ผ๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋๋๋ค.
์ข์ต๋๋ค. Result
๋ฐํ์ ์ฌ๋ฌ ๋ฐํ ๊ฒฝ๋ก๊ฐ์๋ ๋ณต์กํ ํจ์์์ ์ง์ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค (์ผ๋ถ๋ ?
์ด๊ธฐ ๋ฐํ).
์ด๊ฒ์ด ๋๋ฌด ๋ง๋ฒ์ ์ธ ๊ฒฝ์ฐ ์์ ์ ํ์ ์งํฉ์ผ๋ก ์ ํ ๋ ์ ์์ต๋๋ค.
๋๋ ์์ ํ ๋ช
์ ์ ์ผ๋ก ๋ง๋ค์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ๋ง์ ์ฒ๋ผ ์ถ์ ํด์ผํ๋ ๋น ?
์ฌ ๋ํ์ ์๊ฐ ์์ต๋๊น?
@eddyb ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ๋ ํ์ ์งํฉ์ ์ฒ๋ฆฌํ๋ ค๋ IoError์ ๋๋ค.
loop {
match establish_connection() {
Ok(conn) => { ... },
Err(err) => {
if err.kind() == io::ErrorKind::ConnectionRefused {
continue;
} else {
return Err(err);
}
}
}
}
@mitsuhiko ๊ทธ๋ฌ๋ฉด ID๋ฅผ io::Error
์์ ๋ณด๊ดํ๋ฉด ํ์คํ ์๋ํฉ๋๋ค.
์์ฝํ์๋ฉด, TLS์ Vec<Option<Trace>>
"sparse integer map"์ struct ErrorId(usize)
ํค๊ฐ ์ง์ ๋๊ณ 3 ๊ฐ์ lang ํญ๋ชฉ์ผ๋ก ์ก์ธ์ค๋ฉ๋๋ค.
fn trace_new(Location) -> ErrorId
, ๋น const
์ค๋ฅ ๊ฐ ์์ฑ์fn trace_return(ErrorId, Location)
, _declared_ ํจ์์์ -> Result<...>
๋ก ๋ฐํํ๊ธฐ ์ง์ (์ฆ, Result
์ ํ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ _happens_ ๋ฐํ์ ์ผ๋ฐ ํจ์๊ฐ ์๋)fn trace_destroy(ErrorId)
, ์ค๋ฅ ๊ฐ์ ์ญ์ ํ ๋MIR์์ ๋ณํ์ด ์ํ๋๋ฉด Location
๋ ์ค๋ฅ ๊ฐ ์์ฑ ๋๋ Lvalue::Return
์ฐ๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ช
๋ น์ด์ Span
์์ ๊ณ์ฐ ๋ ์ ์์ต๋๋ค. ๋ช
๋ น ํฌ์ธํฐ IMO๋ณด๋ค (์ด์จ๋ LLVM์์ ์ฝ๊ฒ ์ป์ ์์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๊ฐ ํน์ ํ๋ซํผ์ ๋ํด ์ธ๋ผ์ธ asm
๋ฅผ ๋ด ๋ณด๋ด์ผํฉ๋๋ค).
@eddyb
๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ๊ฐ ์ปค์ง์ง ์์ต๋๊น?
@ arielb1 ์ด์จ๋ debuginfo๊ฐ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ถ
@eddyb ์ด ๊ฒฝ์ฐ ์์น๋ ๋ฌด์์ ๋๊น? IP๋ฅผ ์ฝ๋ ๊ฒ์ด ์ด๋ ค์ด ๊ฒ์ด ๋ฌด์์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋ฌผ๋ก , ๊ฐ ๋์์ ๋ํ ์ฌ์ฉ์ ์ ์ JS๊ฐ ํ์ํ์ง๋ง ๊ทธ๋ค์ง ์ด๋ ค์ด ๊ฒ์ ์๋๋๋ค.
@mitsuhiko ์ค๋ฒํ๋ก ๊ฒ์ฌ ๋ฐ ๊ธฐํ ์ปดํ์ผ๋ฌ์์ ๋ฐ์ํ๋ ํจ๋์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ์ ๋ณด ์ผ ์ ์์ต๋๋ค. core::panicking::panic
์ฐธ์กฐํ์ญ์์ค.
์คํ์ด ํ๋ฆฌ๋ ๋์ ์ ๊ทธ๋ ๊ฒ ๋ง์ ์คํ ์ ๋ณด๋ฅผ Error
/ Result
์ ์์ถํฉ๋๊น? ์คํ์ด ์์ง์๋ ๋์ ์ฝ๋๋ฅผ ์คํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? ์๋ฅผ ๋ค์ด ์คํ ๊ฒฝ๋ก์ ๋ณ์์ ๊ด์ฌ์ด ์๋ค๋ฉด ์ด๋จ๊น์? Err
๊ฐ ํธ์ถ ๋ ๋ ์ฌ๋๋ค์ด ์ฌ์ฉ์ ์ง์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋กํฉ๋๋ค (์ : ์ํ๋ ๋๋ฒ๊ฑฐ ํธ์ถ). ์ด๊ฒ์ (์ฌ์ ์ ๊ฐ๋ฅํ) ๋งคํฌ๋ก์ด๊ธฐ ๋๋ฌธ์ try!
์ด๋ฏธ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ฌ๋ฐ๋ฅธ ๋งค๊ฐ ๋ณ์๋ก ํ๋ก๊ทธ๋จ์ ์์ํ๋ค๋ฉด ์คํ์ ์ธ์ํ๋ Err
์ผ์ด์ค์ ๋นํฉํ๋ ๊ฒ์
๋๋ค.
try
๋ฅผ ์ฌ์ฉํ๋ฉด Err
์ผ์ด์ค์์ ์ํ๋ ๋ชจ๋ ์์
์ ์ํ ํ ์ ์์ผ๋ฉฐ ๋งคํฌ๋ก ํฌ๋ ์ดํธ ์ ์ฒด๋ฅผ ์ฌ์ ์ํ๊ฑฐ๋ ์ฑ๋ฅ์ ์ค์ํ ์ฝ๋๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๋๋ก ๋งค์ฐ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ค๋ฅ๋ฅผ ์ฌํํ๊ธฐ ์ด๋ ต๊ณ ์ฑ๋ฅ์ ์ค์ํ ์ฝ๋๋ฅผ ๋ง์ด ์คํํด์ผํฉ๋๋ค.
์ค์ ์ ๋ณด๋ ํ๊ดด ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ถ์ ๋ ์ธ๊ณต ์คํ์์๋ ์ ๋ณด์ ์ผ๋ถ๋ฅผ ๋ณด์กด ํ ํ์๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋งคํฌ๋ก ์ฌ์ ์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ๋ ์ ์์ต๋๋ค.
?
๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ฌ์ ์ ํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ try!
๋ํ ์คํ์ผ๋ก ?
๋ฅผ ์ ์ํ๋ ๊ฒ์
๋๋ค. ํนํ ์์ ํ
๋๋ฆฌ์์ ๋ค์๊ณผ ๊ฐ์ด ๋น ์๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ธฐ ์ํด ํ์ํฉ๋๋ค. ์์ ๋ด ์๊ฒฌ์ ์ค๋ช
๋์ด ์์ต๋๋ค.@ est31 ์คํ์ ํจ๋์ฒ๋ผ _automatically_ "unwound"๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๊ธฐ ์์ต์์ํ ๊ตฌ๋ฌธ ์ ์คํ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, ์ปดํ์ผ๋ฌ๊ฐ ์ค๋จ ์ ์ ์ง์ ํ ์์๋ ๊ณ ์ ๋ ์ด๋ฆ์ ๊ฐ์ง ์ผ๋ถ ๋น ํจ์์ ํธ์ถ์ ์ฝ์
ํ๋๋ก ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋งค์ฐ ์ฝ์ต๋๋ค (์ : call dump(data)
-์ฌ๊ธฐ์ dump
๋ฐ data
๋ ๋๋ฒ๊ฑฐ๊ฐ ๋ณผ ์์๋ ์ธ์์
๋๋ค.
@eddyb ๋น ํจ์๋ ๋ก๊ทธ์ ์ค๋ฅ๊ฐ ๋ํ๋๋์ง ํ์ธํ๊ธฐ ์ํด ๋๊ท๋ชจ ๋ฐฐํฌ์ ๋ช ๊ฐ์ "์นด๋๋ฆฌ์"๋๋ฒ๊ทธ ์ธ์คํด์ค๋ฅผ ์ ์ง ํ ๋ค์ ๋์๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฑ์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ์ฉํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌํ ๋์๋ณด๋ค ์ฌ์ ๋์ํ๋ ๊ฒ์ด ๋ ๋ฐ๋์งํ์ง๋ง ๋ชจ๋ ๊ฒ์ด ์์ธกํ๊ธฐ ์ฌ์ด ๊ฒ์ ์๋๋๋ค.
@hexsel ์, ๊ทธ๋์ Result::unwrap
๋๋ ์ผ๋ถ ์๋ก์ด ignore
๋ฉ์๋ (๋๋ ์ค๋ฅ๋ฅผ ์ญ์ ํ ๋ ํญ์ ํญ์?)๊ฐ ์ถ์ ์ stderr๋ก ๋คํํ๋ TLS ๊ธฐ๋ฐ ๋ฉ์๋๋ฅผ ์ ํธํฉ๋๋ค.
@eddyb ๋ช
๋ น์ด ํฌ์ธํฐ ๋๋ ๊ฐ์์ ํ์ ๋ ๊ฒ์ TLS์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ฐ์ ์คํ์ ์ถ๊ฐํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ์คํ์ ์์ ๋ฒ์ ์ ๋ค์ ๋น๋ํฉ๋๋ค. ๋ฐํ์ ์คํ์ ํ ํญ๋ชฉ ์ฉ ์ค์
๋๋ค. ๋ฐ๋ผ์ RAM์ ๋ค๋ฅธ ์์น์ ์ ํ๋ ๋ฒ์ ์ ๋น๋ํ๋ฉด์ ์คํ์ ์ผ๋ถ๋ฅผ _unwind_ ๋ฐํํ๋ ๋์ ๊ทธ๋ ๊ฒํ๋ฉด. ์๋ง๋ "unwind"๋ "legal"๋ฐํ์ผ๋ก ์ธํ ๋์์ ๋ํ ์๋ชป๋ ์ฉ์ด ์ผ ์ ์์ง๋ง ๋ชจ๋ ์ฝ๋๊ฐ ?
๋๋ try!
๋ฅผ ์ํํ๊ณ ๋ง์ง๋ง์ ๊ฐ๋ก ์ฑ๋ฉด ์ต์ข
๊ฒฐ๊ณผ๊ฐ ๋์ผํฉ๋๋ค. Rust๊ฐ ์ค๋ฅ ์ ํ๋ฅผ ์๋์ผ๋ก ๋ง๋ค์ง ์๋๋ค๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ ๋ Java๊ฐ throws
ํค์๋ ๋ค์์ ๋ชจ๋ ์์ธ๋ฅผ ๋์ดํ๋๋ก ์๊ตฌ ํ ๋ฐฉ์์ด ์ ๋ง ๋ง์์ ๋ค์์ต๋๋ค. rust๋ ์ด์ ๋ํ ์ข์ ๊ฐ์ ์
๋๋ค.
@hexsel ์ฌ์ ์ (์ด๋ฏธ try!
๋ํด ์ด๋ฏธ ์กด์ฌํ๋ฏ๋ก) ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๋ก๊น
์์คํ
์ ๋ก๊น
ํ ์ ์์ต๋๋ค. ์ฌ๋ฌ try
๊ฐ ์คํ ์๋ก ์ ํ ๋ ๋ ๋์ผํ ์ค๋ฅ๋ฅผ ํฌ์ฐฉ ํ ๋ "์ค๋ณต"์ ๋ํ ๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค.
@ est31 try!
์ฌ์ ์๋ ์์ ์ ์ฝ๋์์๋ง ์๋ํฉ๋๋ค (๋ง ๊ทธ๋๋ก ๋งคํฌ๋ก ์ํฌํธ ์๋ ์). "์ฝํ lang ํญ๋ชฉ"๊ณผ ๊ฐ์ด ๋ค๋ฅธ ๊ฒ์ด๋์ด์ผํฉ๋๋ค.
@ est31 ๊ทธ๊ฒ์ ์ ๋ง๋ก ์ ํํ์ง ์์ต๋๋ค (ํ๊ธฐ์ ๋ํด), ํธ๋ ์ด์ค์ ์ค์ ์คํ์ ๋ฐ๋์ ๊ด๊ณ๊ฐ์๋ ๊ฒ์ ์๋๋๋ค. ์๋ํ๋ฉด Result
๋ฅผ ์ด๋ํ๋ ๊ฒ์ ์๋์ ์ญ ์ถ์ ์์ ์ฌ๋ผ๊ฐ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์์ผ๋ก๋.
๋ํ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ต์ ํ๋๋ฉด ๋๋ถ๋ถ์ ์ญ ์ถ์ ์ด ์ฌ๋ผ์ง๊ณ ๋๋ฒ๊ทธ ์ ๋ณด๊ฐ ์์ผ๋ฉด Location
๊ฐ ์๊ฒฉํ๊ฒ ์ฐ์ํฉ๋๋ค. ๋ชจ๋ ์์ค ์ ๋ณด๋ฅผ ์ผ๋ถ ๋น๊ณต๊ฐ ์์ค ์ ํ์ ๊ฐ๋ฐ์๊ฐ ์ผ์น์ํฌ ์์๋ ์์์ ํด์๋ก ๋์ฒดํ๋ ๋๋
ํ ํ๋ฌ๊ทธ์ธ์ ์คํํ ์๋ ์์ต๋๋ค.
๋๋ฒ๊ฑฐ๋ ์ ์ฉํ์ง๋ง (์ ์ธ๋ก lldb
์ ๋ ๊นจ๋ํ ์ญ ์ถ์ ์ถ๋ ฅ์ ์ข์ํฉ๋๋ค) ๋ง๋ณ ํต์น์ฝ์ด ์๋๋ฉฐ ์ด๋ฏธ ํจ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ์ฌ ๋ค์๊ณผ ๊ฐ์ ๋จ์๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๋ฌด์จ ์ผ์ด์ผ.
๊ทธ๊ฒ์ ๋ํด- {Option,Result}::unwrap
์ ์ถ๊ฐ ์ ํ ์ธ์๊ฐ์๋ ์ ํ ์์คํ
์์ค์ ํธ๋ฆญ์ ๋ํด ๋ช ๊ฐ์ง ์๊ฐ์ํ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๊ฐ ํธ์ถ ๋ ์์น์ ๋ฐ๋ผ ์ ํ์ด ์ง์ ๋์ด ํจ๋์ด ๋ฐ์ํฉ๋๋ค. ๋ ์ ์ฉํ ์์น ์ ๋ณด.
๊ฐ์น ๋งค๊ฐ ๋ณ์ํ๊ฐ ์งํ๋จ์ ๋ฐ๋ผ ์ฌ์ ํ ์ต์
์ด ๋ ์ ์์ง๋ง ํ์คํ ์ ์ผํ ๊ฒ์ ์๋๋ฉฐ Result
ํธ๋ ์ด์ค๋ฅผ ์์ ํ ๋ฌด์ํ๊ณ ์ถ์ง๋ ์์ง๋ง ๋์ _implementable_ ์ธ ๋ชจ๋ธ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค.
try!
์ฌ์ ์๋ ์์ ์ ์์์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ ํ ํด๊ฒฐ์ฑ
์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ๋๋ฒ๊น
๊ฒฝํ์ผ๋ก ๋ฐ์ ๋ค์ผ ์ ์์ต๋๋ค. ๋๋ ์ด๋ฏธ ํ์ฌ try!
์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ง์ ๊ฒ์ ์๋ํ์ต๋๋ค. ํนํ ๋ง์ ์์๊ฐ ๊ด๋ จ๋์ด ์๊ณ ์คํ์ ํต๊ณผํ๋ ๋์ค ์ค๋ฅ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ณํ๋๋ ๊ฒฝ์ฐ ์ค๋ฅ์ ์์ธ๊ณผ ์์ธ์ ํ์
ํ๋ ๊ฒ์ ๊ฑฐ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด์ ๊ฐ์ ๋ฐ์ฐฝ๊ณ ๊ฐ ํด๊ฒฐ์ฑ
์ด๋ผ๋ฉด ๋๊ท๋ชจ Rust ํ๋ก์ ํธ์์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ฌ๊ฒํ ํด์ผํฉ๋๋ค.
@eddyb ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ๋ง ๊ทธ๋๋ก ํ์ผ ์ด๋ฆ, ํจ์ ์ด๋ฆ, ์ค ๋ฒํธ ๋ฐ ์ด ๋ฒํธ๋ฅผ ํด๋น ๋ฒกํฐ์ ํฌํจํ๋ผ๋ ์ ์์ ๋๊น? ํนํ ํด๋น ์ ๋ณด๊ฐ DWARF์์ ํจ์ฌ ๋ ์ฒ๋ฆฌ ๊ฐ๋ฅํ ํ์์ผ๋ก ์ด๋ฏธ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ญ๋น์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ DWARF๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๋์ ์์ ๋์ผํ ํ๋ก์ธ์ค๋ฅผ ํฉ๋ฆฌ์ ์ผ๋ก ์ ๋ ดํ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง ์ด๋ฌํ ์ข ๋ฅ์ ์์น ์ ๋ณด๋ ๋๋ฌด ๋ญ๋น๋์ด ์๋ฌด๋ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
DWARF ์ ๋ณด๋ณด๋ค ํจ์ฌ ๋ ๋ญ๋น ์ ์ผ๊น์? ํ์ผ ์ด๋ฆ์ ์ค๋ณต ์ ๊ฑฐ๋๊ณ x64์์๋ ์ ์ฒด๊ฐ ํฌ์ธํฐ 3 ๊ฐ์ ํฌ๊ธฐ์ ๋๋ค.
@mitsuhiko ๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก, ๋น์ ์ ์ผ๋ฐ์ ์ธ ๋ฐฉํฅ์ ๋์ํ์ง๋ง ๊ทธ๊ฒ์ ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ์๋ ๋์ํ์ง ์์ต๋๊น?
DWARF ์ ๋ณด๋ฅผ ์ผ๋ฐ Rust API์ ๋ ธ์ถํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ฌ์ด๊ฐ์?
@eddyb ๋ DWARF ์ ๋ณด๊ฐ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ์ ํฌํจ๋์ง ์๊ณ ๋ณ๋์ ํ์ผ์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ์ฌ๋ณผ ์๋ฒ์ ๋๋ฒ๊ทธ ํ์ผ์ ๊ฐ๊ณ ์ฌ์ฉ์์๊ฒ ์คํธ๋ฆฝ ๋ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค.
@mitsuhiko ์, ๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ๋ ๊ฒ๊ณผ ์์ ํ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. Rust๋ ํ์ฌ ๊ทธ atm, AFAIK๋ฅผ ์ง์ํ์ง ์์ง๋ง, ๊ทธ๋์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ ๋๋ฒ๊น ์ ์ํด ๋น๋ ์์คํ ์์ ์์ฑ ํ ์์์ ์๋ณ์์ ๋นํด ๋ช ๋ น ํฌ์ธํฐ๊ฐ ์ค์ ๋ก ์ ์ฉํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
๋ด ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋ชจ๋ ์ธ๋ผ์ธ ๋๋ฒ๊ฑฐ๋ ๋ช ์ ์ ์์ฒด / ์ํธ ์ฌ๊ท ๋ฐ ๋งค์ฐ ํฐ ํจ์๋ฅผ ์ ์ธํ๊ณ ์คํ ์ถ์ ์ ๋๋ถ๋ถ์ ๋ณต๊ตฌํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค.
์, try!
์ (๋) ์์ ์์ ๋ค์ด ์์ต๋๋ค. ํจ์ ํฌ์ธํฐ ๋๋ ์ ์ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ฅผ ์ ๋ฌํ๊ณ ํจ์์ ์ค๋ฅ๊ฐ์๋ ๊ฒฝ์ฐ try ์ ๊ทผ ๋ฐฉ์์ด ๊ณ์ ์๋ํฉ๋๋ค. ์ฌ์ฉํ๋ ํฌ๋ ์ดํธ์ ๋ด๋ถ ์ค๋ฅ ๋๋ ๋ฒ๊ทธ๊ฐ์๋ ๊ฒฝ์ฐ ๋ฐํ ๋ Err
์ ์ ๋ณด๊ฐ ๋์์ด๋์ง ์๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๋๋ฒ๊ทธํ๊ธฐ ์ํด ์์ค ์ฝ๋๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์คํ ์ถ์ ์ ์ฝ๋์ ๋ํ ์ก์ธ์ค ๊ถํ์ด์๋ ๊ฒฝ์ฐ์๋ง ์ ์ฉํ๋ฏ๋ก ํ์ ๋ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์ฝ๋๋ฅผ ์์ ํ ์์๋ ๊ฒฝ์ฐ)๋ ์ด๋ค ์ ์ผ๋ก๋ ์ง์์ ๋ฐ์์ผํฉ๋๋ค.
๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ํ์ฑํํ๊ณ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ์ ํฉํ ๋ฐฉ์์ ๊ฒฐ์ ํ๋๋กํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋๋ TLS ๊ธฐ๋ฐ ์ ๊ทผ ๋ฐฉ์์ด ์ด์ ์ด ์๋ค๋ ๊ฒ์ ๋ถ์ ํ์ง ์์ต๋๋ค.
try ๋ชจ๋ธ์ ๋งค์ฐ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค. ?
์์ try
๊ฐ๋จํ ์ ๊ฑฐํฉ๋๋ค. catch
์ด ๋ค์ด ์ค๋ฉด ์ถ๊ฐ ์ธ์ด ํ์ฅ ๋ง ํ์ํฉ๋๋ค (ํ๋ ์ฝ๋ฉ ๋ ๋์ ์์ ํด๋น ๋์์ ์ถ๊ฐํ์ ๊ฒ์
๋๋ค) ์ด์จ๋ ?
)
@eddyb "๋ช ๋ น ํฌ์ธํฐ๊ฐ ๋ฆด๋ฆฌ์ค ๋ฐ์ด๋๋ฆฌ ๋๋ฒ๊น ์ ์ํด ๋น๋ ์์คํ ์์ ์์ฑ ๋ ์์์ ์๋ณ์์ ๋น๊ตํ ๋ ์ค์ ๋ก ์ ์ฉํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?"
์ด๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ ๋๋ฒ๊น ์ด ์๋ํ๋ ๋ฐฉ์์ ๋๋ค. ์ฐ๋ฆฌ (Sentry)๋ ํ์ฌ ๊ฑฐ์ ์ ์ ์ผ๋ก iOS ์ง์์ ์ํด ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํฌ๋์ ๋คํ๋ฅผ ์ป๊ณ llvm-symbolizer๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์๋ฅผ ์ค์ ๊ธฐํธ๋ก ํ์ธํฉ๋๋ค.
@mitsuhiko ์ด๋ฏธ libbacktrace
ํฌํจํ๊ธฐ ๋๋ฌธ์ ์์ค ์์น์ ๋ํ ์ฝ๋ ํฌ์ธํฐ๋ฅผ ํด์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ ์ ์ผ๋ก ๋ฐ๋ํ์ง ์์ต๋๋ค.
@eddyb ์. ํจ๋ ์ฝ๋๋ฅผ ๋ณด์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ค์ ๋ก Rust ์ฝ๋๊ฐ ์ฌ์ฉํ ์์๋ API๋ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋ ๋ง์ ๊ณณ์์ ์ด๊ฒ์ด ์ ์ฉํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํด-๋๋ {Option, Result} :: unwrap์ ์ถ๊ฐ ์ ํ ์ธ์๊ฐ์๋ ์ ํ ์์คํ ์์ค์ ํธ๋ฆญ์ ๋ํด ๋ช ๊ฐ์ง ์๊ฐ์ํ์ต๋๋ค. ๋ ์ ์ฉํ ์์น ์ ๋ณด๊ฐ ์์ต๋๋ค.
@glaebhoerl Hah, ์๋ง๋ ๊ทธ๊ฒ์ ์ค์ ๋ก ์ถ๊ตฌ ํ ๊ฐ์น๊ฐ ์์ต๋๊น? ์ ์ด๋ ๋ถ์์ ํ ์คํ๋งํผ.
@eddyb ๋ชจ๋ฅด๊ฒ ์ด์. ์๋ง๋ ๋จผ์ ๊ทธ๊ฒ์ ๊ด๋ จ๋ GHCer๋ค๊ณผ ๋ ผ์ ํ ๊ฐ์น๊ฐ์์ ๊ฒ์ ๋๋ค. ๋๋ ๋จ์ง ์ด๊ฒ์ ๋ํด ๋ค์๊ณ ๋ฐฉ๊ธ ๋งํฌ๋ฅผ ๋ดค์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Rust๋ GHC์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ค์ ์์ ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ต๋๋ค. ๊ธฐ๋ณธ ์ ํ ๋งค๊ฐ ๋ณ์๊ฐ ๋์ ์๋ ํ ์ ์๋์ง ์ฌ๋ถ๋ ํฅ๋ฏธ๋ก์ด ์ง๋ฌธ์ ๋๋ค (์๋ง๋ ๋๋ณด๋ค ๋ ๋ง์ด ์๊ฐํ ์ง๋ฌธ ์ผ ๊ฒ์ ๋๋ค).
๊ทธ๋ฅ ์๊ฐํ์ธ์ : rustc
๋ฅผ Err
๊ตฌ์ฑํ๋ ํน์ํ ๊ฒฝ์ฐ๋ก ์ ํํ๋ ์ค์์น๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํํ๊ธฐ ์ ์ ํ์ด๋ก๋์ ํจ๊ป fn(TypeId, *mut ())
ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์ ์ฉ ํ ๊ฒ์
๋๋ค. . ํ์ด๋ก๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ฅ๋ฅผ ํํฐ๋งํ๊ฑฐ๋, ๊ด์ฌ์๋ ์ค๋ฅ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋๋ฒ๊ฑฐ์ ํธ๋ฉํ๊ฑฐ๋, ํน์ ์ข
๋ฅ์ ์ค๋ฅ์ ๋ํ ์ญ ์ถ์ ์ ์บก์ฒํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ์์
์ผ๋ก ์์ํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
PR 33389 ๋ Carrier
ํน์ฑ์ ๋ํ ์คํ์ ์ง์์ ์ถ๊ฐํฉ๋๋ค. ์๋ RFC์ ์ผ๋ถ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ FCP๋ก ์ด๋ํ๊ธฐ ์ ์ ํนํ ๊ฐ๊น์ด ๊ฒ์ฌ ๋ฐ ๋
ผ์ ๊ธฐ๊ฐ์ ๊ฑฐ์ณ์ผํฉ๋๋ค (๋๋จธ์ง ?
์ฐ์ฐ์์ ๋ํด์๋ FCP์ ๋ถ๋ฆฌ๋์ด์ผ ํจ). ์์ธํ ๋ด์ฉ์์ด ํ ๋ก ์ค๋ ๋ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
?
๋ฅผ Option
๋ก ์ฐ์ฅํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๋ค.
RFC์ ํํ์ ?
์ฐ์ฐ์๊ฐ ์ค๋ฅ / "์์ธ"์ ํ์ ๊ดํ ๊ฒ์ด๋ผ๋ ์ฌ์ค์ ๋ํด ๋งค์ฐ ๋ช
ํํฉ๋๋ค.
Option
๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ๋ณด๊ณ ํ๋ ๊ฒ์ ์๋ชป๋ ๋๊ตฌ์
๋๋ค. None
๋ฐํ์ ์ฑ๊ณต์ ์ธ ํ๋ก๊ทธ๋จ์ ์ ์์ ์ธ ์ํฌ ํ๋ก์ ์ผ๋ถ์ด๋ฉฐ Err
๋ฐํ
์ค๋ฅ ์ฒ๋ฆฌ์ ์ผ๋ถ ์์ญ (์ : ์คํ ์ถ์ ์ถ๊ฐ)์ ๊ฐ์ ํ๋ ค๋ ๊ฒฝ์ฐ ?
์ Option
?
๋ฅผ ๊ตฌํํ๋ฉด ?
๋ฅผ ๋ณ๊ฒฝ์์ ์ ์ธํด์ผํฉ๋๋ค. .
@tomaka ํ ๋ก ์ค๋ ๋ ์์ ํ ๋ก ์ ๊ณ์ํ ์ ์์ต๋๊น? ( ์ด๋ฏธ ๊ทํ์ ์ด์๋ฅผ ์์ฝํ์ต๋๋ค. ) ์ ๋ ๊ฐ์ธ์ ์ผ๋ก GH์ ๋ํ ๊ธด ๋ ผ์๊ฐ ์๋นํ ๋ค๋ฃจ๊ธฐ ํ๋ค๋ค๋ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ,์ด ํน์ ๋ ผ์๋ฅผ ๋ค๋ฅธ ๋ฏธ๋์ ํฌ์ธํธ ๋๋ ๋ฐ์ํ ์์๋ ์ง๋ฌธ๊ณผ ๋ถ๋ฆฌ ํ ์์๋ ๊ฒ๋ ์ข์ ๊ฒ์ ๋๋ค.
@eddyb ์ฌ๊ธฐ I ๊ธฐ๋ฅ GHC ์์ ์ ํธ์ถ ์คํ์ ์ถ์ ๋ฒ์ ์ ๋ฌธ์ ์์์ ์ธ๊ธ .
์ ์ ๋์ ์ฌ๊ธฐ์ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๋ ์ฌ๋์ด ์์ต๋๊น? OP์ ๋๋จธ์ง ์์ ์ด ์ฌ์ ํ ์ ํํฉ๋๊น? ์ฌ๊ธฐ์ ์ ์ ๋์์ด ํ์ํ ๊ฒ์ด ์์ต๋๊น?
๋๋ ์ง๋ ์ฃผ๋ง์ Rust ์ฉ Sentry ํด๋ผ์ด์ธํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ฉด ๋์์ต๋๋ค. ๋๋ถ๋ถ์ ์ค๋ฅ ์ฒ๋ฆฌ๋ ์ค์ ๋ก ํจ๋ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ ์ฉ์ฑ์ ๋ด๊ฐ ์ด๊ฒ์ ์์ ํ ํฌ๊ธฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ง์ ์ผ๋ก ์ฌ๊ฐํ๊ฒ ์ ํ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์ค๋ฅ๋ณด๊ณ ์์คํ ์ ์ฌ๊ธฐ์ ํตํฉํ๊ธฐ ์ํด crates.io ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์๋ก ๋ค์ด ๋ณด์์ต๋๋ค. ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋๊ณ ๋ค๋ฅธ ์คํ ํธ๋ ์ด์ค์์ ๋ณํ ๋ ๋ ์ด๋ป๊ฒ ๋ ๋ช ๋ น ํฌ์ธํฐ๋ฅผ ๊ธฐ๋ก ํ ์ ์๋ค๋ฉด ์ ์ ํ ์ค๋ฅ๋ณด๊ณ ๋ฅผ ์ป์ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์์ด RFC๋ก ๋ค์ ๋์ ์์ต๋๋ค. ๋๋ ์ด๋ฏธ ์ด๊ฒ์ด ๋ด๊ฐ _ ์๊ฐํ๋ _ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ณณ์ ํจ๋์ ์ถ๊ฐํ๋ ๋ฐ ์์งํ๋ ์ง์ญ์ ๋ณต์กํ ๋ ผ๋ฆฌ ์ค๋ฅ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ๋ง์ผ๋ก๋ ์์ฒญ๋ ๊ณ ํต์์ ์ด๋ฏธ ์๊ณ ์์ต๋๋ค.
๋ถํํ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ํฌ๊ฒ ๋ณ๊ฒฝํ์ง ์๊ณ IP๋ฅผ ๊ธฐ๋ก ํ ์์๋ ๋ฐฉ๋ฒ์ ํ์ฌ ์ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ์ ์์ด ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ๋์ ๋ ์ ์ด ์์ต๋๊น?
์ฐ๋ฆฌ๋ @ rust-lang / lang ํ์์์ ์ด์ ๋ํด ๋ ผ์ํ์ต๋๋ค. ์ฌ๋ผ์จ ๋ช ๊ฐ์ง :
์ฒซ์งธ, ?
๊ฐ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ์์ ํ๋๋ ๊ฒ์ ๋ณด๋ ๋ฐ ํ์คํ ๊ด์ฌ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ ๋๋ถ๋ถ์ Result
๋ฟ๋ง ์๋๋ผ Option
์์ ?
์๋ํ๋ ๊ฒ์๋ณด๊ณ ์ถ์ดํ๋ค๊ณ ์๊ฐํฉ๋๋ค (ํ์ง๋ง bool
๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ์ ์๋์์ต๋๋ค). ์์ ํ์ ๋ํ ํ ๊ฐ์ง ์ฐ๋ ค ์ฌํญ์ Result
์ด์ธ์ ์ ํ์ ์ฌ์ฉํ ์์๋ ์ด๋ค ์ข
๋ฅ์ ํน์ฑ๋ ์ ๊ณตํ์ง ์๊ณ ์์ ํํ๋ฉด ๋์ค์ ์ถ๊ฐ ํ ์์๋ ํ์ ํธํ์ฑ์ด ์๋ค๋ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด, ์ ๋ ๊ท์น์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
let v: Vec<_> = try!(foo.iter().map(|x| x.to_result()).collect());
try!
์ ์ฌ์ฉํ์ฌ collect
์ด Result<Vec<_>, _>
๋ฅผ ๋ฐํ ํ ๊ฒ์ผ๋ก ์์ํ๋ ์ ํ ์ถ๋ก ์ ์๋ฆฝ๋๋ค. ?
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด์ด ์ถ๋ก ์ _ ๋ฏธ๋์ ์คํจ ํ ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด์ ๋
ผ์์์ ์ฐ๋ฆฌ๋ ๋ํ ๋ชจ๋ ์ข
๋ฅ์ "์ด๋ฐ์"ํน์ฑ์ ๋ํ ์ธ๋ถ ์ฌํญ์ ๋
ผ์ํ๊ธฐ ์ํด ์์ RFC๊ฐ ํ์ํ๋ค๊ณ ๊ฒฐ์ ํ์ต๋๋ค. ๋ถ๋ช
ํ์ด RFC๋ ์ต๋ํ ๋นจ๋ฆฌ ์์ฑํด์ผํ์ง๋ง ํด๋น ํ ๋ก ์์ ?
์งํ์ ์ฐจ๋จํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ ๊ฐ์ง ์๊ฐ์ @nrc ์ ๊ตฌํ์ ๊ฐ์ ธ Result
๋ฐ ์ผ๋ถ ๊ฐ์ธ ๋๋ฏธ ์ ํ์ ๋ํด์๋ง ๊ตฌํํ๋ฉด ?
๋ง ๋ง๋ค๋ฉด์ ์ถ๋ก ์ ์ต์ ํด์ผํ๋ค๋ ๊ฒ์
๋๋ค. Result
.
๋ง์ง๋ง ์์ : ์ฐ๋ฆฌ ๋๋ถ๋ถ์ Option
๊ฐ์ ?
๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํจ์์ ๋ฐํ ์ ํ๋ Option
์ฌ์ผํฉ๋๋ค (์ : Result<T,()>
). ์ด๊ฒ์ ์ถ๋ก ์ ํ์ ๋์์ด ๋ ๊ฒ์
๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ์ ์ธ ๋ ๋ฐํ ์ ํ์์ ์ด๋ค ์ ํ์ด ํ์ํ์ง ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ํธ ๋ณํ์ ์ํ์ง ์๋ ์ด์ ๋ x
์ ์ ์ ์ ํ์ด ์๋๋ผ๋ C๊ฐ if x
ํ์ฉํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋์จํ ๋
ผ๋ฆฌ๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ฆ, Option<T>
๊ฐ ๊ฐ์ ๋ํ๋ด๋ฉฐ None
๋ ํด๋น ๊ฐ์ ๋๋ฉ์ธ์ ์ผ๋ถ์ด๊ณ Result<>
๋ (์ผ๋ฐ์ ์ผ๋ก) ํจ์์ ์คํจ๋ฅผ ๋ํ๋
๋๋ค. ์ฑ๊ณตํ๋ ค๋ฉด None
ํจ์๊ฐ ์ค๋ฅ๊ฐ ์์ฌ ์ค๋ฌ์์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด (๊ทธ๋ฆฌ๊ณ ์์์ ๊ท์น์ฒ๋ผ). ๊ทธ๋ฌ๋ ๊ทธ ๋
ผ์๋ RFC๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ํธ ๋ณํ์ ์ํ์ง ์๋ ์ด์ ๋
x
์ ์ ์ ์ ํ์ด ์๋๋ผ๋ C๊ฐif x
ํ์ฉํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋์จํ ๋ ผ๋ฆฌ๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฆ,Option<T>
๊ฐ ๊ฐ์ ๋ํ๋ด๋ฉฐNone
๋ ํด๋น ๊ฐ์ ๋๋ฉ์ธ์ ์ผ๋ถ์ด๊ณResult<>
๋ (์ผ๋ฐ์ ์ผ๋ก) ํจ์์ ์คํจ๋ฅผ ๋ํ๋ ๋๋ค. ์ฑ๊ณตํ๋ ค๋ฉดNone
ํจ์๊ฐ ์ค๋ฅ๊ฐ ์์ฌ ์ค๋ฌ์์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ฉด (๊ทธ๋ฆฌ๊ณ ์์์ ๊ท์น์ฒ๋ผ). ๊ทธ๋ฌ๋ ๊ทธ ๋ ผ์๋ RFC๋ฅผ ๊ธฐ๋ค๋ฆด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ด๊ฒ์ ์ง์ฌ์ผ๋ก ๋์ํฉ๋๋ค.
๊ฒ์ดํธ ์์ ํ์ ๋์ ํ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ From
ํน์ฑ์ impl
s๊ฐ ๋ฐ๋ผ์ผ ํ ๊ณ์ฝ (๋๋ Err
-upcasting ).
๋ฟก ๋นต๋จ
๊ฒ์ดํธ ์์ ํ์ ๋์ ํ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ From ํน์ฑ์ impls๊ฐ ์ค์ํด์ผํ๋ ๊ณ์ฝ (๋๋ Err-upcasting์ ์ฌ์ฉํ๋ ํน์ฑ)์ ์ ํ๋ ๊ฒ์ด ์์ต๋๋ค.
๊ณผ์ฐ. ๋ด ๊ธฐ์ต์ ๋ ์ด๋ฆฌ๊ณ ๊ธ์ง๋์ด์ผํ๋ค๊ณ ์๊ฐํ๋ ๋ช ๊ฐ์ง ์๋ถํฐ ์์ํ ์ ์์ต๋๊น? ์๋๋ฉด ๋น์ ์ด ์ผ๋์๋๊ณ ์๋ ๋ฒ์น์ผ๊น์? ๋๋ ์ด์ ๊ฐ์ "๋ฒ๋ฅ "์ ๊ฒฝ๊ณํ๊ณ ์์์ ์ธ์ ํด์ผํฉ๋๋ค. ์ฐ์ , ๊ทธ๋ค์ ์ค์ ๋ก ๋ฌด์๋๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ฌ๋๋ค์ ์๋ ๋ ํ๊ณ๋ฅผ ๋์ด์๋๋ผ๋ ๋ชฉ์ ์ ๋ง์ ๋ ์ค์ ํ๋์ ์ด์ฉํฉ๋๋ค. ๊ทธ๋์ ๊ทธ๊ฒ์ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ผ๋ก ์ด์ด์ง๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ์๊ฒ ๋ฒ์ด ์๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ด๋ค ์ฉ๋๋ก ์ฌ์ฉํ ๊ฒ์ธ๊ฐ? ์ต์ ํ? (ํ์ง๋ง ๋์๊ฒ๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.)
๊ทธ๋ฐ๋ฐ catch
ํํ์์ ์ํ๋ ์ด๋ป์ต๋๊น? ๊ตฌํ ๋์์ต๋๊น?
์ฌํ๊ฒ๋ ์๋์ค :(
2016 ๋ 7 ์ 26 ์ผ ํ์์ผ 06:41:44 AM -0700์ Alexander Bulaev๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ทธ๋ฐ๋ฐ
catch
ํํ์์ ์ํ๋ ์ด๋ป์ต๋๊น? ๊ตฌํ ๋์์ต๋๊น?์ค๋ ๋๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์์ ํ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/31436#issuecomment -235270663
๊ตฌํ์ ๊ณํํด์ผํ ๊น์? ๋ฐ์ ๋ค์ฌ์ก์ง๋ง ๊ตฌํ๋์ง ์์ RFC๋ณด๋ค ๋ ์ฐ์ธํ ๊ฒ์ ์์ต๋๋ค ...
์ฐธ์กฐ # 35056
์ฐธ๊ณ ๋ก, https://github.com/rust-lang/rfcs/pull/1450 (์ด๊ฑฐ ํ ๋ณํ ์ ํ)์ Carrier
๊ตฌํํ๋ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ์ ์ด ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
trait Carrier {
type Success: CarrierSuccess;
type Error: CarrierError;
}
trait CarrierSuccess {
type Value;
fn into_value(self) -> Self::Value;
}
// (could really use some HKT...)
trait CarrierError<Equivalent: CarrierError> {
fn convert_error(self) -> Equivalent;
}
impl<T, E> Carrier for Result<T, E>
{
type Success = Result::Ok<T, E>;
type Error = Result::Err<T, E>;
}
impl<T, E> CarrierSuccess for Result::Ok<T, E> {
type Value = T;
fn into_value(self) -> Self::Value {
self.0
}
}
impl<T, E1, E2> CarrierError<Result::Err<T, E2>> for Result::Err<T, E1>
where E2: From<E1>,
{
fn convert_error(self) -> Result::Err<T, E2> {
Err(self.into())
}
}
impl<T> Carrier for Option<T>
{
type Success = Option::Some<T>;
type Error = None;
}
impl<T> CarrierSuccess for Option::Some<T> {
type Value = T;
fn into_value(self) -> Self::Value {
self.0
}
}
impl<T> CarrierError<Option::None> for Option::None {
fn convert_error(self) -> Option::None {
self
}
}
fn main() {
let value = match might_be_err() {
ok @ Carrier::Success => ok.into_value(),
err @ Carrier::Error => return err.convert_error(),
}
}
https://github.com/rust-lang/rust/pull/35056#issuecomment -240129923์์ ๋ช ๊ฐ์ง ์๊ฐ์ ๊ต์ฐจ ๊ฒ์ํ๊ณ ์ถ์์ต๋๋ค. ๊ทธ PR์ ๋๋ฏธ ์ ํ์ Carrier
ํน์ฑ์ ์๊ฐํฉ๋๋ค. ์๋๋ ๋ณดํธ๋ฅผ์ํ ๊ฒ์ด ์์ต๋๋ค. ํนํ ์ ํ ์ถ๋ก ๊ณผ์ ์ํธ ์์ฉ์ ์์ ํํ์ง ์๊ณ ๋ ?
๋ฅผ ์์ ํํ๊ณ ์ํ์ต๋๋ค. ์ด ํน์ฑ๊ณผ ๋๋ฏธ ์ ํ์ ์กฐํฉ์ ์์ ํ๊ฒ ๋ณด์์ ์ผ ๊ฒ ๊ฐ์์ต๋๋ค.
์์ด๋์ด๋ ์ฐ๋ฆฌ๊ฐ Carrier
๋
ผ์ํ๋ RFC๋ฅผ ์์ฑํ๊ณ ์ผ์นํ๋๋ก ๋์์ธ์ ์์ ํ์ฌ ์ ์ฒด ๋ชจ์์ ๋ง์กฑํ ๋๋ง ์์ ํ (๋๋ Carrier
์ ๊ฑฐ ๊ฐ๋ฅ) ์ฐ๋ฆฌ๊ฐ ์ข์ํ๋ ๋์์ธ์ ๋๋ฌ ํ ์์๋ ๊ฒฝ์ฐ ๋ชจ๋
์ด์ ์กฐ๊ธ ๋ ์ถ์ธก ์ ์ผ๋ก ๋งํ๋ฉด, Carrier
ํน์ฑ์ ์ฑํํ๋ฉด ์บ๋ฆฌ์ด ๊ฐ์ ์ํธ ๋ณํ์ ํ์ฉํ์ง ์์ ๊ฒ์
๋๋ค (์ด ํน์ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก Result
๋ก /์์ ๋ณํํ๋ ๋ฐฉ๋ฒ์
๋๋ค). ?
๋ฅผ Option
์ ์ ์ฉํ๋ฉด fn์ด Option
๋ฐํํด๋ ๊ด์ฐฎ์ต๋๋ค. ?
๋ฅผ Result<T,E>
์ ์ ์ฉํ๋ฉด fn์ด Result<U,F>
๋ฐํํ๋ฉด ๊ด์ฐฎ์ต๋๋ค. ์ฌ๊ธฐ์ E: Into<F>
; ํ์ง๋ง ?
์ Option
ํ๊ณ fn์ด Result<..>
๋ฐํํ๋ฉด ๊ด์ฐฎ์ง ์์ต๋๋ค.
์ฆ, ์ด๋ฌํ ์ข
๋ฅ์ ๊ท์น์ ์ค๋๋ ์ ์ ํ ์์คํ
์์ ํํํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๊ฐ์ฅ ๋ถ๋ช
ํ ์์์ ์ HKT์ ๊ฐ์ ๊ฒ์
๋๋ค (๋ฌผ๋ก ์ค์ ๋ก๋ ์์ง๋ง ์ง๊ธ์ ๋ฌด์ํ๊ฒ ์ต๋๋ค). ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ถ๋ช
ํ ์๋ฒฝํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ค๋ฉด, ํ๋๋ ๊ฐ์ ๊ฒ์ด ๊ทธ Self
๋งค๊ฐ ๋ณ์ Carrier
์ด ์ข
๋ฅ์ type -> type -> type
, ์ดํ Result
๊ตฌํํ ์ Carrier
. ๊ทธ๋ฌ๋ฉด Self<T,E> -> Self<U,F>
๊ฐ์ ๊ฒ์ ํํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ type -> type
์ข
๋ฅ๊ฐ์๋ Option
๋ฐ๋์ ์ ์ฉ๋๋ ๊ฒ์ _ ์๋๋๋ค _ (์ด ๋ชจ๋ ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฑํํ HKT ์์คํ
์ ์ข
๋ฅ์ ๋ฐ๋ผ ์ ํํ ๋ฌ๋ผ ์ง๊ฒ ์ง๋ง ์ ๋ ์ฐ๋ฆฌ๊ฐ "์ผ๋ฐํ ๋๋ค"๋ก ๋๊น์ง ๊ฐ ๊ฒ์
๋๋ค). ๋ ๊ทน๋จ์ ์ธ ๊ฒ์ bool
์ ๊ฐ์ ์ ํ์ผ ์ ์์ต๋๋ค (๋ถ์ธ์ ๋ํด Carrier
๋ฅผ ๊ตฌํํ๊ณ ์ถ์ง๋ ์์ง๋ง ์ผ๋ถ ์ฌ๋๋ค์ newtype์ ๋ํด Carrier
๋ฅผ ๊ตฌํํ๊ณ ์ถ์ ๊ฒ์
๋๋ค. 'd bool).
์ ๊ฐ ๊ณ ๋ คํ ๊ฒ์ ?
๋ํ ์
๋ ฅ ๊ท์น ์์ฒด๊ฐ ํน๋ณ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ?
Foo<..>
๋ _some_์ ๋ช
๋ชฉ ์ ํ Carrier
ํน์ฑ๊ณผ ์ผ์นํ์ง๋ง fn์ ๋๋ฌ์ผ ๋ฐํ ์ ํ๋ Foo<..>
ํฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ก์ด ์ ํ ๋งค๊ฐ ๋ณ์๋ก Foo
๋ฅผ ์ธ์คํด์คํํฉ๋๋ค. ์ด ์์ด๋์ด์ ๋จ์ ์ ?
์ด ์ ์ฉ๋๋ ์ ํ์ด๋ ๋๋ฌ์ธ๋ fn์ ์ ํ์ ์ ์์๋ ๊ฒฝ์ฐ ์๋ก์ด ์ข
๋ฅ์ ํน์ฑ ์๋ฌด๋ฅผ ์ถ๊ฐํ์ง ์๊ณ ๋์ด ์ ์ฝ์ ์ ์ฉ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ํ ๋ค์ ์์์ ์
๋๋ค. :)ํ์ง๋ง ์๋ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์๊ฐ์ Carrier
ํน์ฑ์ ์ฌ๊ณ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์์ด๋์ด๋ Expr: Carrier<Return>
๋ฅผ ๊ฐ๋ ๊ฒ์
๋๋ค. ์ฌ๊ธฐ์ Expr
๋ ?
์ ํ์ด ์ ์ฉ๋๊ณ Return
๋ ํ๊ฒฝ ์ ํ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
trait Carrier<Target> {
type Ok;
fn is_ok(&self) -> bool; // if true, represents the "ok-like" variant
fn unwrap_into_ok(self) -> Self::Ok; // may panic if not ok
fn unwrap_into_error(self) -> Target; // may panic if not error
}
๊ทธ๋ฐ ๋ค์ expr?
ํ๋น :
let val = expr;
if Carrier::is_ok(&val) {
val.unwrap_into_ok()
} else {
return val.unwrap_into_error();
}
์ฌ๊ธฐ์ ์ค์ํ ์ฐจ์ด์ ์ Target
๋ _error_ ์ ํ์ด ์๋๋ผ ์๋ก์ด Result
์ ํ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ impl์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
where E: Into<F>
{
type Ok = T;
fn is_ok(&self) -> bool { self.is_ok() }
fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
fn unwrap_into_error(self) -> { Err(F::from(self.unwrap_err())) }
}
๊ทธ๋ฆฌ๊ณ ๋ค์์ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
impl<T> Carrier<Option<T>> for Option<T> {
type Ok = T;
fn is_ok(&self) -> bool { self.is_some() }
fn unwrap_into_ok(self) -> Self::Ok { self.unwrap() }
fn unwrap_into_error(self) -> { debug_assert!(self.is_none()); None }
}
๋ง์ง๋ง์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด bool์ ๊ตฌํํ ์ ์์ต๋๋ค.
struct MyBool(bool);
impl<T> Carrier<MyBool> for MyBool {
type Ok = ();
fn is_ok(&self) -> bool { self.0 }
fn unwrap_into_ok(self) -> Self::Ok { debug_assert!(self.0); () }
fn unwrap_into_error(self) -> { debug_assert!(!self.0); self }
}
์ด์ ์ด ๋ฒ์ ์ ๋ ์ ์ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ด Result
์ ์ถ๊ฐํ์ฌ impl
Option
๊ฐ ๊ฐ์ ์ํธ ๋ณํ์ Result
๋ก ๋ณํ ํ ์ _ ๊ฐ๋ฅํฉ๋๋ค _.
impl<T> Carrier<Result<T,()>> for Option<T> { ... }
๊ทธ๋ฌ๋ ๋ฌผ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๋ด ํ์๊ฐ ์์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒํ์ง ์์ ๊ฒ์ ๋๋ค).
๋ฟก๋ฟก
์ฐธ๊ณ ๋ก rust-lang / rfcs # 1450 (์ด๊ฑฐ ํ ๋ณํ์ ์ ํ)์ Carrier๋ฅผ ๊ตฌํํ๋ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋ฐฉ๋ฒ์ ์ด ๊ฒ์ ๋๋ค.
๋ฐฉ๊ธ ์์ฑํ ์์ด๋์ด๋ฅผ ์์ฑํ๋ฉด์ ์ด๊ฑฐ ํ ๋ณํ์ ๋ํ ์ ํ์ ๊ฐ๋ ๊ฒ๊ณผ ๊ทธ๊ฒ์ด ์ด๋ค ์ํฅ์ ๋ฏธ์น ์ง์ ๋ํด ์๊ฐํ๊ณ ์์์ต๋๋ค.
?
๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ํ ๊ฐ์ง ์ฌ์ค์ "throw"ํค์๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ฝ๊ฐ ์ฑ๊ฐ์ ๊ฒ์
๋๋ค. ํนํ Err(foo)?
๋ฅผ ์์ฑํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ t _know_ ์ด๊ฒ์ด ๋ฐํ ๋ ๊ฒ์ด๋ฏ๋ก return Err(foo)
๋ฅผ ์์ฑํด์ผํฉ๋๋ค. ๊ด์ฐฎ์ง ๋ง ์ง์ ์์ฑํ์ง ์๊ณ ๋ into()
์ ํ์ ์ป์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๋ํ๋ฉ๋๋ค.
let value = if something_or_other() { foo } else { return Err(bar) };
์, ํ ๊ฐ์ง ๋ ์ถ๊ฐํด์ผํฉ๋๋ค. impls๊ฐ ์ ํ ์ถ๋ก ์ ์ํฅ์ ๋ฏธ์น ์ ์๋๋ก ํ์ฉํ๋ค๋ ์ฌ์ค์ _should_ fn์ด Result<..>
๋ฐํํ๋ ์ปจํ
์คํธ์์ foo.iter().map().collect()?
์๋ฏธํฉ๋๋ค. fn ๋ฐํ ์ ํ์ Result
์ด๋ฉฐ ํ๋์ impl ๋ง ์ ์ฌ์ ์ผ๋ก ์ ์ฉ๋ฉ๋๋ค (์ ์ด๋ ๋ก์ปฌ์์).
์, ๊ทธ๋ฆฌ๊ณ ๋ด Carrier
ํน์ฑ์ ์ฝ๊ฐ ๋ ๋์ ๋ฒ์ ์ ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค.
trait Carrier<Target> {
type Ok;
fn into_carrier(self) -> Result<Self::Ok, Target>;
}
๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ ์ ์์ต๋๋ค.
impl<T,U,E,F> Carrier<Result<U,F>> for Result<T,E>
where E: Into<F>
{
type Ok = T;
fn into_carrier(self) -> Result<T, Result<U,F>> {
match self { Ok(v) => Ok(v), Err(e) => Err(e.into()) }
}
}
๊ทธ๋ฆฌ๊ณ expr?
๋ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
match Carrier::into_carrier(expr) {
Ok(v) => v,
Err(e) => return e,
}
๋ฌผ๋ก ์ด๊ฒ์ ๋จ์ (๋๋ ์ฅ์ ...)์ Into
๋ณํ์ด impls๋ก ํธ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ฆ, ์ฌ๋๋ค์ด ์๋ฏธ๊ฐ์์ ๋ ์ฌ์ฉํ์ง ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ํ์ง ์๋ ๊ฒฝ์ฐ (ํน์ ์ ํ์ ๋ํด) ๋นํ์ฑํ ํ ์๋ ์์ต๋๋ค.
@nikomatsakis IMO, ํน์ฑ์ IntoCarrier
์ด์ด์ผํ๋ฉฐ IntoCarrier::into_carrier
๋ ์ด์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๋์ Carrier
(์ ์ด๊ฑฐ ํ)์ ๋ฐํํด์ผํฉ๋๋ค. ๊ทธ๊ฑด:
enum Carrier<C, R> {
Continue(C),
Return(R),
}
trait IntoCarrier<Return> {
type Continue;
fn into_carrier(self) -> Carrier<Self::Continue, Return>;
}
@ Stebalien ํ์คํ ๊ด์ฐฎ์ ๋ณด์ ๋๋ค.
lang ํ ํ์์์ ํ ๋ก (๋ฐ ?
์ด์์ ๋ง ๊ฐ๋ฅํ FCP)์ ์ํด ์ง๋ช
ํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ FCP์ ์์ผ๋ก ๋ฉฐ์น ์์ ์ผ์ข
์ ์ผ์์ ์ธ Carrier ํน์ฑ์ ์ฐฉ๋ฅ์์ผ์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Carrier ํน์ฑ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ํด rust-lang / rfcs # 1718์ ์ด์์ต๋๋ค.
๋ค์ผ์ญ์์ค, ๋ค์ผ์ญ์์ค! ?
์ฐ์ฐ์๋ ์ด์ ์ต์ข
๋๊ธ ๊ธฐ๊ฐ์ ์
๋ ฅํ๊ณ ์์ต๋๋ค. ์ด ํ ๋ก ์ 8 ์ 18 ์ผ์ ์์๋ ๋๋ต์ด ๋ฆด๋ฆฌ์ค์ฃผ๊ธฐ ๋์ ์ง์๋ฉ๋๋ค. ๊ฒฝํฅ์ ?
์ฐ์ฐ์๋ฅผ ์์ ํ ํ๋ ๊ฒ์
๋๋ค.
์บ๋ฆฌ์ด ํน์ฑ ๊ณผ ๊ด๋ จํ์ฌ, ์ ํ ์ถ๋ก ๊ณผ์ ์์น ์๋ ์ํธ ์์ฉ์ ๋ฐฉ์งํ์ฌ ์ด๋ ์ชฝ์ด๋ ์์ ๋กญ๊ฒ ๊ฒฐ์ ํ ์ ์๋๋กํ๋ ์์ ๋ฒ์ ์ด # 35777์ ๋์ฐฉํ์ต๋๋ค.
@ rust-lang / lang ํ์๋, ๋์๋ฅผ ํ์ํ๋ ค๋ฉด ์ด๋ฆ์ ํ์ธํ์ธ์. ์ฐ๋ ค ์ฌํญ์ด๋ ์ด์๊ฐ์๋ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์. ๊ธฐํ ์๊ฒฌ์ ๋จ๊ฒจ์ฃผ์ธ์. ๊ฐ์ฌ!
tokio ๊ธฐ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ and_then
๋ง์ด ์ฌ์ฉํ๊ฒ ๋ ์ง ๊ถ๊ธํฉ๋๋ค. ์ด๋ foo().?bar()
๋ฅผ foo().and_then(move |v| v.bar())
์ถ์ฝ ํ์ผ๋ก ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ์ ์ ๋ฌผ์ด ๋์ผํ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ ์๋๋กํ๋ ํ๋์ ์ธ์์
๋๋ค.
๋ช ํํ๊ฒ ๋งํ๋ฉด,์ด FCP๋ question_mark ๊ธฐ๋ฅ์ ๊ดํ ๊ฒ์ด์ง catch๊ฐ ์๋๋๋ค. ๋ง์ต๋๊น? ์ด ํธ์ ์ ๋ชฉ์ ์ด๋ฒ ํธ์์ ๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ถ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
@seanmonstar ํ์๋ ๊ตฌํ๋์ง ์์์ผ๋ฏ๋ก ์. ์๋ง๋ FCP๊ฐ ์๋ฝ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ ์ค๋ฉด catch
์ถ์ ํ๋๋ก ๋ณ๊ฒฝ ๋ ๊ฒ์
๋๋ค.
๋ช ํํ๊ฒ ๋งํ๋ฉด์ด FCP๋ question_mark ๊ธฐ๋ฅ์ ๊ดํ ๊ฒ์ด์ง catch๊ฐ ์๋๋๋ค. ๋ง์ต๋๊น? ์ด ํธ์ ์ ๋ชฉ์ ์ด๋ฒ ํธ์์ ๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ถ์ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์, question_mark
๊ธฐ๋ฅ
https://github.com/rust-lang/rfcs/issues/1718#issuecomment -241764523 ํ์ ์กฐ์น. ๋๋ ํ์ฌ์ ํ๋์ ์๊ฐํ๋ค ?
"๋ฐ์ธ๋ ํ์ฌ ๊ณ์"์ผ๋ก ์ผ๋ฐํํ์ง๋ง, ์ map_err(From::from)
๋ถ๋ถ ?
/ : ๊ทธ๊ฒ์ ์ฝ๊ฐ ๋ ๋ฐฉ๊ธ ๋ฐ์ธ๋๋ณด๋ค ์์๊ฒ. ๊ฒฐ๊ณผ์ ๋ํด From
์ธ์คํด์ค๋ฅผ ๋ชจ๋ ์ถ๊ฐํ๋ฉด ์๋ฏธ ์ฒด๊ณ๊ฐ v? => from(v.bind(current-continuation))
์ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ด ๋ด๋ถ ์ค๋ ๋์์ ?
์ ์๋์ ์ธ ์ฅ์ ์ ๋ํด ๋ง์ ๋
ผ์๊ฐ์์์ต๋๋ค.
https://internals.rust-lang.org/t/the-operator-will-be-harmful-to-rust/3882/
์ง๊ธ์ ์ฌ์ธต ์์ฝ์ ํ ์๊ฐ์ด ์์ต๋๋ค. ๋ด ๊ธฐ์ต์ ๋๊ธ์ด ?
๊ฐ ์ค๋ฅ์์ฃผ์๋ฅผ ๊ธฐ์ธ์ผ๋งํผ ์ถฉ๋ถํ ๋ณด์ด๋์ง์ ๋ํ ์ง๋ฌธ์ ์ด์ ์ ๋ง์ถ๊ณ ์๋ค๋ ๊ฒ์
๋๋ค.ํ์ง๋ง ํ ๋ก ์ ๋ค๋ฅธ ์ธก๋ฉด์ ๊ฐ๊ณผํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ฌ๋์ด ์์ฝ ํ ์๊ฐ์ด ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค!
๋๋ ์ด์ ์ ์ฃผ์์ ๋ฌ์ง ์์๊ณ ์ด๊ฒ์ ๋๋ฌด ๋ฆ์์ ์๋ ์์ง๋ง ?
์ฐ์ฐ์๊ฐ ์จ๊ฒจ์ง return ๋ฌธ์ผ๋ก ์ฌ์ฉ๋๋ฉด ํผ๋ ์ค๋ฝ์ต๋๋ค. @ hauleth ๊ฐ @๋ฅผ ๋งํฌ ํ ํ ๋ก ์์ ์ง์ ํ๋ฏ์ด nikomatsakis.
try!
ํ๋ฉด ๋งคํฌ๋ก๊ฐ์ด๋ฅผ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋๊ฐ์ ๋ฐํ์ด์์ ์ ์์์ด ๋ถ๋ช
ํ์ต๋๋ค. ?
๋ฅผ ์จ๊ฒจ์ง return
๋ก ์ฌ์ฉํ๋ฉด ํจ์์์ ๊ฐ์ ๋ฐํํ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
?
@CryZe๊ฐ ๋งํ๋ฏ์ด ๋๋ ์ด๊ฒ์ ์ข์ํฉ๋๋ค.
์ด๋ ๊ฒํ๋ฉด ๋ชจ๋ ์ฌ๋์๊ฒ ์น์ํ๊ณ ์ค๋ฅ๋ฅผ ๋๊น์ง ์ ๋ฌํ์ฌ ์ฒ๋ฆฌ ํ ์ โโ์์ผ๋ฉฐ ์์ ์ ๋ฐํ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ต ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
let a = try! (x? .y? .z);
์ด๋ ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค๊ณ ๋ฐํ์ ์จ๊ธฐ์ง ์๋ ๋ฐ ๋์์ด๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ coffeescript
์ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด์์๋ ์ต์ํฉ๋๋ค.
?
ํจ์ ์์ค ๋์ ์ ์์ค์์ ํด๊ฒฐํ๋ฉด ์ ๋ฌผ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น ๊น์? ๋ค๋ฅธ ๋ชจ๋ ์ฌ์ฉ ์ฌ๋ก์์๋ ๊ด์ฐฎ์ ๋ณด์
๋๋ค.
@CryZe๊ฐ ๋งํ๋ฏ์ด ๋๋ ์ด๊ฒ์ ์ข์ํฉ๋๋ค.
์ด๋ ๊ฒํ๋ฉด ๋ชจ๋ ์ฌ๋์๊ฒ ์น์ํ๊ณ ์ค๋ฅ๋ฅผ ๋๊น์ง ์ ๋ฌํ์ฌ ์ฒ๋ฆฌ ํ ์ โโ์์ผ๋ฉฐ ์์ ์ ๋ฐํ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ต ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ ์ ์์ต๋๋ค.
let a = try! (x? .y? .z);
๋๋ ์ด๊ฒ์ ๊ฐ์ ํ๋ค. ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ด ๋ ๊ฒ ๊ฐ์์.
try!๋ฅผ ์ฌ์ฉํ๋ฉด ๋งคํฌ๋ก๊ฐ์ด๋ฅผ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋๊ฐ์ ๋ฐํ์ด์์ ์ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ์ต๋๋ค.
Rust์์ ๋งคํฌ๋ก๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ต์ํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ช
ํฉ๋๋ค. ?
๊ฐ ์์ ์ ์ด๊ณ ๋๋ฆฌ ํผ์ ธ ์๊ณ Rust์ ๋ํ ๋ชจ๋ ์๊ฐ์์ ์ค๋ช
๋๋ฉด ๋๊ฐ์ ๊ฒ์
๋๋ค.
์๋ ํ์ธ์.
ํจ์์์ ๊ฐ์ ๋ฐํํ๋ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ์์ ์ ๋ฐํ
Rust์๋ "์์ ์ ๋ฐํ"์ด ์์ผ๋ฉฐ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ ํํ์์ด ์์ต๋๋ค. ์ด๊ฒ์ ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค.
if foo {
5
}
7
Rust๊ฐ "์์ ์ ๋ฆฌํด"์ ๊ฐ์ก๋ค๋ฉด์ด ์ฝ๋๋ ์ปดํ์ผ๋ฉ๋๋ค. ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. return 5
ํฉ๋๋ค.
์ด๋ ๊ฒ์ด ํ ๋ฒ ๋๊ฐ ์๊น์? ์์ ์ ์ด๊ณ ๋๋ฆฌ ํผ์ ธ ์์ผ๋ฉฐ Rust์ ๋ํ ๋ชจ๋ ์๊ฐ์์ ์ค๋ช ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด https://github.com/rust-lang/book/pull/134
try!๋ฅผ ์ฌ์ฉํ๋ฉด ๋งคํฌ๋ก๊ฐ์ด๋ฅผ ์ํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋๊ฐ์ ๋ฐํ์ด์์ ์ ์๋ค๋ ๊ฒ์ด ๋ถ๋ช ํ์ต๋๋ค.
Rust์์ ๋งคํฌ๋ก๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ต์ํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ช ํฉ๋๋ค. ์ด๋ ๊ฒ์ด ํ ๋ฒ ๋๊ฐ ์๊น์? ์์ ์ ์ด๊ณ ๋๋ฆฌ ํผ์ ธ ์์ผ๋ฉฐ Rust์ ๋ํ ๋ชจ๋ ์๊ฐ์์ ์ค๋ช ๋ฉ๋๋ค.
๋ด๊ฐ ์๊ณ ์๋ ์ด๋ค ์ธ์ด๋ก๋ "๋งคํฌ๋ก"๋ "์ฉ์ด ์ฌ๊ธฐ์๋ค"๋ผ๋ ๋ป์ด๋ฉฐ ๋ฌด์จ ์ผ์ด๋ ์ผ์ด๋ ์ ์๋ค๋ ๋ป์ ๋๋ค. ๊ทธ๋์ "In Rust"๋ถ๋ถ์์ด "๋งคํฌ๋ก๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ต์ํ๊ธฐ ๋๋ฌธ์"๋ก ๋ค์ ํํํ๊ฒ ์ต๋๋ค.
@hauleth
let a = try! (x? .y? .z);
๋๋ ์ด๊ฒ์ ๊ฐ์ ํ๋ค. ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ด ๋ ๊ฒ ๊ฐ์์.
๋๋ ๋งค์ฐ ๋์ํ์ง ์์ต๋๋ค. try!
์์๋ง ์๋ํ๊ณ ์ธ๋ถ์์๋ ์๋ํ์ง ์๋ ๋ง์ ๊ธฐํธ๋ฅผ ์ป๊ฒ๋ฉ๋๋ค.
@hauleth
let a = try! (x? .y? .z);
๋๋ ์ด๊ฒ์ ๊ฐ์ ํ๋ค. ์๋ฒฝํ ํด๊ฒฐ์ฑ ์ด ๋ ๊ฒ ๊ฐ์์.
๋๋ ๋งค์ฐ ๋์ํ์ง ์์ต๋๋ค. ์๋์์๋ง ์๋ํ๋ ๋ง๋ฒ์ ์์ง์ ์ป์ ๊ฒ์ ๋๋ค! ์ธ๋ถ๊ฐ ์๋๋๋ค.
?
๋ try!
์์๋ง ์๋ํด์ผํ๋ค๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋ด๊ฐ ๋งํ ๊ฒ์ ?
๊ฐ ๋ฐ์ดํฐ๋ฅผ ์คํธ๋ฆผ ์๋๋ก ๋ฐ์ด ๋ด๊ณ ๋ฐ์ํ์๋ง์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ ํ์ดํ ์ฐ์ฐ์์ฒ๋ผ ์๋ํด์ผํ๋ค๋ ๊ฒ์
๋๋ค. try!
๋ ํ์ํ์ง ์์ง๋ง ํ์ฌ ์ฌ์ฉ๋๋ ๊ฒ๊ณผ ๋์ผํ ์ปจํ
์คํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@steveklabnik ์ ๋ Rust๋ฅผ ์์ ์ ๋ฐํ์ ๊ฐ๋ ์ธ์ด๋ก ์๊ฐํฉ๋๋ค. ๊ทํ์ ์์์ 5
๋ ์์ ์ ์ผ๋ก ๋ฐํ๋์ง ์์์ง๋ง ๋ค์์ ์ํํฉ๋๋ค.
fn test() -> i32 {
5
}
์ฌ๊ธฐ์์ 5
๊ฐ ์์ ์ ์ผ๋ก ๋ฐํ๋์ง ์์ต๋๊น? return 5;
์๋ ๋ฐ๋๋ก ๊ทํ์ ์์์ ํ์ํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๊ฐ์ ๋ฐํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. Rust์ ๋ํด ๋ค์ ํผ๋ ์ค๋ฝ์ต๋๋ค. ์ธ ๋ฒ์งธ๋ฅผ ์ถ๊ฐํ๋ฉด IMO์ ๋์์ด๋์ง ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ต๋๋ค. ํํ์, ํนํ ํจ์ ๋ณธ๋ฌธ์ ๊ฒฐ๊ณผ์ ๋๋ค. "์์ ์ ๋ฐํ"์ ๋ฌต์์ ์ผ๋ก ์ด๋์์๋ ๋ฐํ ํ ์ ์์์ ์๋ฏธํ์ง๋ง ์ฌ์ค์ด ์๋๋๋ค. ๋ค๋ฅธ ํํ์ ๊ธฐ๋ฐ ์ธ์ด์์๋ ์์ ์ฝ๋ ์ํ์ฒ๋ผ "์์ ์ ๋ฐํ"์ด๋ผ๊ณ ๋ถ๋ฅด์ง ์์ต๋๋ค.
@steveklabnik ์ข์ต๋๋ค . ์๊ฐ์๋ด์ด ์ค๋ช ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค : +1 :
์ ๋ถ๋ค ๊ด์ฐฎ์! ๋๋ ๋น์ ์ด ์ด๋์์ ์๋์ง ์์ ํ ๋ณผ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ข
์ข
์๋ชป๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ๋ค๋ฅธ ๊ฒ์
๋๋ค. ๋๋ ์ฌ๋๋ค์ด "์์ ์ ๋ฐํ"์ด๋ ;
๋ฅผ ์์ค์ ์ด๋์์๋ ๋ฐํ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ ๊ฒ์ ๋ณด์์ต๋๋ค.
@hauleth ๋? ์ฐ์ฐ์๋์ด ๊ฒฝ์ฐ and_then์ ๋ํ ๊ตฌ๋ฌธ ์คํ ์ผ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๋ ๋ง์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐํ์ ๋์น๊ธฐ ์ด๋ ค์ธ ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด๊ฐ ๋ฌด์์ ๋๊น? ์ด์์. ๋ฌ์คํธ? ํ์ฌ ๊ตฌํ์์ ์ฐ์ฐ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด๊ฐ ์ํํ๋ ๊ฒ๊ณผ ์ ํํ ๋ฐ๋์ ๋๋ค. ๋ํ and_then์ ๊ธฐ๋ฅ์ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ๋ช ํํ ์ ์ด ํ๋ฆ์ด ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ถ์ฅ๋ฉ๋๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋ง๋ค์ด? and_then์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ ์ฌ์ฉํ ๋ค์ ํ์ฌ ์๋๋ฅผ ์ ์งํ์ญ์์ค! ๋ช ์ ์ ์ผ๋ก "์ธ ๋ํ ๋ฐ ๋ฐํ"์ ๊ฒฝ์ฐ ๋ฐํ์ ๋ ์ ๋ณด์ด๊ฒํ๊ณ ? ์ฐ์ฐ์๊ฐ ๋ ์ ์ฐํฉ๋๋ค (ํจํด ์ผ์น์ ๊ฐ์ ๋น ๋ฐํ ์ฌ๋ก์์ ์ฌ์ฉํ ์ ์์).
ลukasz Niemier
[email protected]
Wiadomoลฤ napisana przez Christopher Serr [email protected] w dniu 02.09.2016, o godz. 21:05 :
@hauleth https://github.com/hauleth ? ์ฐ์ฐ์๋์ด ๊ฒฝ์ฐ and_then์ ๋ํ ๊ตฌ๋ฌธ ์คํ ์ผ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒํ๋ฉด ๋ ๋ง์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐํ์ ๋์น๊ธฐ ์ด๋ ค์ธ ํ์๊ฐ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด๊ฐ ๋ฌด์์ ๋๊น? ์ด์์. ๋ฌ์คํธ? ํ์ฌ ๊ตฌํ์์ ์ฐ์ฐ์๋ ๋ค๋ฅธ ๋ชจ๋ ์ธ์ด๊ฐ ์ํํ๋ ๊ฒ๊ณผ ์ ํํ ๋ฐ๋์ ๋๋ค. ๋ํ and_then์ ๊ธฐ๋ฅ์ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ๋ช ํํ ์ ์ด ํ๋ฆ์ด ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ๊ถ์ฅ๋ฉ๋๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๋ง๋ค์ด? and_then์ ๋ํ ๊ตฌ๋ฌธ ์คํ์ ์ฌ์ฉํ ๋ค์ ํ์ฌ ์๋๋ฅผ ์ ์งํ์ญ์์ค! ๋ช ์ ์ ์ผ๋ก "์ธ ๋ํ ๋ฐ ๋ฐํ"์ ๊ฒฝ์ฐ ๋ฐํ์ ๋ ์ ๋ณด์ด๊ฒํ๊ณ ? ์ฐ์ฐ์๊ฐ ๋ ์ ์ฐํฉ๋๋ค (ํจํด ์ผ์น์ ๊ฐ์ ๋น ๋ฐํ ์ฌ๋ก์์ ์ฌ์ฉํ ์ ์์).
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244461722์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Rust ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ํ Pull Request ์์ ์ ํ ๋ ์ค์ ๋ก? ์ฐ์ฐ์์ ์ฌ์ค ๊ทธ๊ฒ์ ๋์๊ฒ ์ ๋ง ๊ฐ๋ ์ฑ์ ํด์น๋ค. (์ ์ ์ ์ผ๋ก, ๋์์ ๊ฑธ๋ฌ์ง๋ ์์ ์ผ ๋ฟ์ด ๊ธฐ ๋๋ฌธ์) ์์ฒญ๋๊ฒ ์จ๊ฒจ์ ธ ์์๊ณ ์ ๋ ๊ทธ๊ฒ์ ๋ง์ด ๊ฐ๊ณผํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ๋ฌด์ญ๋ค๋ ๊ฒ์ ์๋ค.
@hauleth ํ, ๋ฃจ๋น๋ฅผ ์ฌ์ฉํ๋ ๋์ ๋๋ ๊ทธ๊ฒ์ ์์ ์ ๋ฐํ์ด๋ผ๊ณ ๋ถ๋ฅด๋ ์ฌ๋์ ๋ค์ด ๋ณธ ์ ์ด ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๊ทธ๊ฒ์ ๋ํด ์๊ฐํ๋ ์๋ชป๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์ฌ์ ํ ์ฃผ์ฅํฉ๋๋ค.
๋๋ ๋ช ๊ฐ์ง ํ๋ก์ ํธ์์ ?
๋ฅผ ์ฌ์ฉํ๊ณ try!
๋ณด๋ค ์ ํธํ๋๋ฐ, ๋๋ถ๋ถ์ ์ ๋ฏธ์ฌ ์์น์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก, "์ง์ง"๋
น ์ฝ๋๋ ๊ฝค ๋ง์ด ๋ค์ด๊ฐ๋๋ค Result
์์ '๋ชจ๋๋' main
๊ฐ๋ ๋ฆฌํ ๋
ธ๋์์ ์ ์ธ๋ฅผ ๊ฒฐ์ฝ ๋ ๋์ง ์๋๋ค; ์ด๋ฌํ ์ฝ๋๋ ํญ์ ์ค๋ฅ๋ฅผ ์ ํ ํ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ค ํํ์์ด ์ค๋ฅ๋ฅผ ์์ฑํ๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ๋ชจ๋ ์คํ์ผ๋ก ๋ค์ ๋ณด๋ด์ง๊ณ ์์ผ๋ฉฐ ์ฝ๋์ ์ฃผ์ ๋
ผ๋ฆฌ๋ฅผ ์ฝ์ ๋์ด๋ฅผ๋ณด๊ณ ์ถ์ง ์์ต๋๋ค.
?
๋ํ ๋์ ์ฃผ์ ๊ด์ฌ์ฌ๋ ๋ฉ์๋ ๋งคํฌ๋ก๊ฐ ์กด์ฌํ๋ค๋ฉด ๋์ผํ ์ด์ (์ ๋ฏธ์ฌ ์์น)์ ์ป์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋๋ ์๋ง๋ ํ์ฌ์ ๊ณต์์ ์์ ํํจ์ผ๋ก์จ ์ฐ๋ฆฌ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์์ ๋ฏธ๋์ ํํ์ฑ์ ์ ํํ๊ณ ์๋ค๋ ๋ค๋ฅธ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ํ์ฌ Result
๋ณํ์ Rust์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋๋งํผ ์ธ์ฒด ๊ณตํ์ ์ผ๋ก ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์์ ํ๊ธฐ ์ด๋ ค์ด Rust ์ค๋ฅ ์ฒ๋ฆฌ๋ก ์ฌ๋ฌ ๋์์ธ ์ค์๋ฅผ ์ ์ง๋ ๊ณ , ์ด๊ฒ์ ์ฐ๋ฆฌ๋ฅผ ๋ ๊น์ด ํ๊ณ ๋ค ์ ์์ต๋๋ค. ๊ตฌ์ฒด์ ์ธ ์ฆ๊ฑฐ๋ ์์ง๋ง
๋๋ ์ ์ ์ด๊ฒ์ ์ฌ๋ฌ ๋ฒ ์ผ์ง ๋ง ?
์ ์บ๋ฆฌ์ด ํน์ฑ์ ๊ฐ๋ฅ์ฑ์ ์ ๋์ ์ผ๋ก ์ข์ํฉ๋๋ค. ๋๋ ํ๋์ ํ๋ก์ ํธ๋ฅผ ?
์์ ํ ์ฌ์ฉํ๋๋ก ์ ํํ๊ณ try!
๊ณผ๋ ๋๋ฌด ๋ณต์กํ ๋ง์ ์ผ์ ๊ฐ๋ฅํ๊ฒํ์ต๋๋ค (ํนํ ์ฒด์ธ๊ณผ ๊ด๋ จํ์ฌ). ๋๋ ๋ํ ์ฌ๋ฏธ๋ก ?
์ด๋ค ์ผ์ ํ ์ ์๋์ง๋ณด๊ธฐ ์ํด ๋ค๋ฅธ ํ๋ก์ ํธ๋ฅผ ์ดํด ๋ดค๊ณ ์ ๋ฐ์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ์ ์ด๋ค ๋ฌธ์ ๋ ๋ฐ์ํ์ง ์์์ต๋๋ค.
๋ฐ๋ผ์ ์ ๋ ๋ ๋์ ์ด๋ฆ์ Carrier
ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ?
์์ ํ์ ํฐ +1์ ์ ๊ณตํฉ๋๋ค.์ด ํน์ฑ์ ์ด์์ ์ผ๋ก๋ ๋ค๋ฅธ ํ ๋ก ์์ ์ธ๊ธ ํ ๋ค๋ฅธ ์ผ๋ถ ์ฌ๋ก๋ ํฌํจํฉ๋๋ค.
๋์ ์ฃผ์ ๊ด์ฌ์ฌ๋? ๋ฉ์๋ ๋งคํฌ๋ก๊ฐ ์กด์ฌํ๋ค๋ฉด ๋์ผํ ์ด์ (์ ๋ฏธ์ฌ ์์น)์ ์ป์ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
RFC๊ฐ ํ์ํ ๊น์? ๋๋ถ๋ถ์ ์ฌ๋๋ค์?์ ๊ธฐ๋ฅ์ ์ข์ํ๋ ๊ฒ ๊ฐ์ง๋ง? ๊ทธ ์์ฒด.
RFC๊ฐ ํ์ํ ๊น์? ๋๋ถ๋ถ์ ์ฌ๋๋ค์?์ ๊ธฐ๋ฅ์ ์ข์ํ๋ ๊ฒ ๊ฐ์ง๋ง? ๊ทธ ์์ฒด.
์ด์ ๋ํด ๋ง์ ๋
ผ์๊ฐ์๋ RFC ๊ฐ ์์ต๋๋ค. ๋ํ ๋๋ ๋น์ ์ด ๊ทธ "๋๋ถ๋ถ์ ์ฌ๋๋ค"์ ์ด๋์ ์ป๋ ์ง ๋ชจ๋ฆ
๋๋ค. ์ด ๋ฌธ์ ์ ์ฐธ์ฌํ ์ฌ๋์ด๋ผ๋ฉด ๋ฌผ๋ก ์์ ํ๊ฐ _ ์ด๋ฏธ _ ํ์ ๊ธฐ๋ณธ ์กฐ์น์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ฐ๋ํ๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์
๋๋ค.
?
๋ RFC๊ฐ ๋ณํฉ๋๊ธฐ ์ ์ ํฌ๊ฒ ๋
ผ์๋์์ผ๋ฉฐ, ์ง์ง์๋ก์ ์์ ํ์ ๋ํด ๋
ผ์ ํ ๋ ๋์ผํ ์์
์ ์ํํด์ผํ๋ ๊ฒ์ ๋ค์ ํผ๊ณคํฉ๋๋ค.
์ด์จ๋ ์ฌ๊ธฐ์ @mitsuhiko ๋ ์ ๊ฐ์ ์ ๋ํ +1์
์ด์ ๋ํด ๋ง์ ๋ ผ์๊ฐ์๋ RFC๊ฐ ์์ต๋๋ค. ๋ํ ๋๋ ๋น์ ์ด ๊ทธ "๋๋ถ๋ถ์ ์ฌ๋๋ค"์ ์ด๋์ ์ป๋ ์ง ๋ชจ๋ฆ ๋๋ค. ์ด ๋ฌธ์ ์ ์ฐธ์ฌํ ์ฌ๋๋ค์ ๊ฒฝ์ฐ ์์ ํ๊ฐ ์ด๋ฏธ ํ์ ๊ธฐ๋ณธ ์กฐ์น์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์ฌ๋๋ค์ด ๋ฐ๋ํ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์ ๋๊ธ์ด ๋๋ฌด ์งง์ต๋๋ค. ์๋ฅผ ๋ค์ด func1().try!().func2().try!()
์ ๊ฐ์ ์ผ์ข
์ "๋ฉ์๋ ๋งคํฌ๋ก"์ ๋ํ RFC๋ฅผ ๋ง๋๋ ๊ฒ์ ์ธ๊ธํ์ต๋๋ค (๋ด๊ฐ ์๋ ํ ํ์ฌ ๋ถ๊ฐ๋ฅํฉ๋๋ค).
๊ฐ์ธ์ ์ผ๋ก ๋๋? ์ฐ์ฐ์์ด์ง๋ง @brson ๊ณผ ๋์ผํ ์ฐ๋ ค๋ฅผ ๊ณต์ @nikomatsakis๊ฐ ์ฐ๊ฒฐ ํ ๋ด๋ถ ์ค๋ ๋๋ฅผ ํฌํจํ์ฌ ๋์ผํ ์ธ์๊ฐ ๋ฐ๋ณต
๊ธฐ๋ฅ์ ์์ ํ ๊ตฌํํ์ง ์๊ณ ์์ ํํ๋ ๊ฒ์ ์๊ธฐ์์กฐ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.์ด ๊ฒฝ์ฐ catch {..} ํํ์์ ๋๋ค.
์ด์ ์์ด ๊ธฐ๋ฅ์ ๋ํ ์ฐ๋ ค๋ฅผ ํ๋ช ํ์ง๋ง ์ฌ์ ํ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ ์กฐ๊ฑด๋ถ ๋ฐํ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ๋ค๋ฅด๋ฉฐ Rust๊ฐ ์ด๋ฏธ ๋์ด๋ ๋ณต์ก์ฑ ์์ฐ์ ๋์ด์๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@mcpherrinm ๋ค๋ฅธ ์ธ์ด๋ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํด ํธ์ถ ํ ๋๋ง๋ค ํด์ ๊ฒฝ๋ก๋ฅผ ์จ๊ฒผ์ต๋๋ค. operator()
๋ฅผ "์กฐ๊ฑด๋ถ ๋ฐํ ์ฐ์ฐ์"๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๊น?
๋ณต์ก์ฑ ์์ฐ์ ๊ดํด์๋ try!
์ ๊ตฌ๋ฌธ ์ ์ผ๋ก ๋ง ๋ค๋ฆ
๋๋ค. ์ ์ด๋ ๋ถํํ๋ ๋ถ๋ถ์
๋๋ค.
try!
๋ฌด๊ฑฐ์ด ์ฝ๋์ ๋ํ ์ฃผ์ฅ์ด ?
๋ง ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๊น์?
๊ทธ๋ ๋ค๋ฉด "์ค๋ฅ ์ ํ ์๋ํ _ ์ ํ _ ์์"์ด์ธ์ ์ฌ๊ฐํ ๋์์ด ์๋์ง ๋์ํฉ๋๋ค.
ํํ ์ ์ : https://github.com/rust-lang/rfcs/pull/1737
๋ฐ์ ๋ค์ผ ๊ธฐํ๊ฐ ์์ ์๋ ์์ง๋ง ์ด์จ๋ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
"๋ฉ์๋ ๋งคํฌ๋ก"์ ๋ํ @keeperofdakeys ์ ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค. ?
๊ตฌ๋ฌธ์ ์ผํญ ์ฐ์ฐ์๊ฐ ๋
น์ฌ์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ๋ฐ์ ๋ค์ฌ ์ ธ์ผํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ?
์์ฒด๋ ์๋ฌด ๋ง๋ํ์ง ์์ต๋๋ค. ๋์ "๋ฉ์๋ ๋งคํฌ๋ก"๋ฅผ ์ฌ์ฉํ์ฌ ?
์ ๋์์ ์ผ๋ฐํ ํ ์์๋ ๊ธฐ๋ฅ์ ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
a.some_macro!(b);
// could be syntax sugar for
some_macro!(a, b);
a.try!();
// could be syntax sugar for
try!(a);
์ด๋ ๊ฒํ๋ฉด ๋์์ด ๋ฌด์์ธ์ง ๋ช ํ ํด์ง๊ณ ์ฝ๊ฒ ์ฐ๊ฒฐ๋ ์ ์์ต๋๋ค.
result.try!()
์ ๊ฐ์ ๋ฉ์๋ ๋งคํฌ๋ก๋ ์ธ์ด ์ธ์ฒด ๊ณตํ์ ๋ํ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๊ฐ์ ์ผ๋ก ๋ณด์ด๋ฉฐ ์๋ก์ด ?
์ฐ์ฐ์๋ณด๋ค ์์์ ์ธ ๋๋์ด ๋ํฉ๋๋ค.
@brson
๋๋ ํ์ฌ ๊ณต์์ ์์ ํํจ์ผ๋ก์จ ์ฐ๋ฆฌ๊ฐ ์ค๋ฅ ์ฒ๋ฆฌ์์ ๋ฏธ๋์ ํํ์ฑ์ ์ ํํ๊ณ ์๋ค๋ ๋ค๋ฅธ ์ฐ๋ ค๊ฐ ์์ต๋๋ค. ํ์ฌ ๊ฒฐ๊ณผ ๋ณํ์ Rust์์ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ์ํ๋๋งํผ ์ธ์ฒด ๊ณตํ์ ์ผ๋ก ๋ง๋ค๊ธฐ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค.
์ด๊ฒ์ ํฅ๋ฏธ๋ก์ด ์ ์
๋๋ค. ์ด๊ฒ์ ์ง์คํ ๊ฐ์น๊ฐ์์ ๊ฒ์
๋๋ค (์๋ง ๋น์ ๊ณผ ์ ๊ฐ ์กฐ๊ธ ์ด์ผ๊ธฐ๋ฅผ ๋๋ ์ ์์ต๋๋ค). ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋ ์ํ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. Carrier
ํน์ฑ์ ๋ํ ์ ์ ๋ ๋์์ธ (https://github.com/rust-lang/rfcs/issues/1718 ์ฐธ์กฐ)์ ํนํ ์ ๋ฌธํ์ ๊ฒฐํฉํ๋ฉด ์ํฉ์ ๋ ์ ์ฐํ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ๋์์ด ๋ ์ ์์ต๋๋ค.
๋ฉ์๋ ๋งคํฌ๋ก๊ฐ ์ธ์ด์ ๋ํ ์ข์ ํ์ฅ์ด ๋ ์ง ์์ฌ ์ค๋ฝ์ต๋๋ค.
macro_rules!
๋งคํฌ๋ก๋ ํ์ฌ ํจ์๋ฅผ ํด์ ํ๋ ๊ฒ๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์ ์ธ๋์ด ์์ผ๋ฉฐ ์๋ก์ด ์ํฌํธ ์์คํ
์ด ์ฑํ๋๋ฉด ๋์ฑ ์ ์ฌํด์ง ๊ฒ์
๋๋ค. ๋ด ๋ง์ ์ต์์ ํญ๋ชฉ์ฒ๋ผ ์ ์ธ๋๊ณ ์ต์์ ํญ๋ชฉ์ฒ๋ผ ํธ์ถ๋๋ฉฐ ๊ณง ์ต์์ ํญ๋ชฉ์ฒ๋ผ ๊ฐ์ ธ ์ค๊ฒ๋๋ค๋ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ๋ฐฉ๋ฒ์ด ์๋ํ๋ ๋ฐฉ์์ด ์๋๋๋ค. ๋ฉ์๋์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ด ์์ต๋๋ค.
impl
๋ธ๋ก ๋ด์์ ์ ์ธํด์ผํฉ๋๋ค.impl
๋ธ๋ก๊ณผ ์ฐ๊ฒฐ๋ ์ ํ / ํน์ฑ์ผ๋ก ๊ฐ์ ธ์ต๋๋ค.์ ํ ๊ฒ์ฌ ์ ์ ๋งคํฌ๋ก๊ฐ ํ์ฅ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์์ฑ ์ค ์ด๋ ๊ฒ๋ ๋ด๊ฐ ๋งํ ์์๋ ํ ๋ฉ์๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ ๋งคํฌ๋ก์ ํด๋น๋์ง ์์ ์ ์์ต๋๋ค. ๋ฌผ๋ก ์ฐ๋ฆฌ๋ ๋ฉ์๋ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ง๋ง 'free'๋งคํฌ๋ก์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋๊ณ ๊ฐ์ ธ ์ค๋ ๋งคํฌ๋ก๋ฅผ ๊ฐ์ง ์ ์์ง๋ง,์ด ์ฐจ์ด๋ก ์ธํด ๋งค์ฐ ํผ๋์ค๋ฌ์ด ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก ๋๋ "๋ฉ์๋ ๋งคํฌ๋ก"๊ฐ ์ธ์ ๊ฐ ๋ํ๋ ์ ์๋ค๋ ๋ฏฟ์์ผ๋ก ?
๋ฅผ ์ฐ๊ธฐํ๋ ๊ฒ์ด ์ข์ ์ ํ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
๋๊ตฌ๋ ์ผ๋ถ ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์ค์ํด์ ๋งคํฌ๋ก์์ ์คํ์ผ๋ก ์น๊ฒฉ๋์ด์ผํ๋ ์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. for
๋ฃจํ๊ฐ ์ข์ ์์
๋๋ค. ?
๋์์ Rust์ ์ค๋ฅ ์ฒ๋ฆฌ ์คํ ๋ฆฌ์ ํ์์ ์ด๋ฉฐ ๋งคํฌ๋ก ๋์ ์ผ๋ฅ ์คํ์ด๋๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@hauleth , @CryZe
?
์ด and_then
์ฐ์ฐ์ ์ฌ์ผํ๋ค๊ณ ์ ์ํ๋ ์ฌ๋๋ค์๊ฒ ์๋ตํ๊ธฐ ์ํด ํ์ฅ ๊ธฐ๋ฅ์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Kotlin (๋๋ coffeescript์ ์ต์ํ์ง ์์)๊ณผ ๊ฐ์ ์ธ์ด์์ ์ ์๋ํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ๋
น์ ๋๋ฌด ๊ฐ๋จํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก and_then
์ ๋๋ถ๋ถ์ ์ฉ๋๋ maybe_i.and_then(|i| i.foo())
maybe_i.and_then(|i| Foo::foo(i))
. ์ ์๋ maybe_i?.foo()
๋ก ํํํ ์ ์์ง๋ง ํ์๋ ํ ์ ์์ต๋๋ค. Foo::foo(maybe_i?, maybe_j?)
๊ฐ maybe_i.and_then(|i| maybe_j.and_then(|j| Foo::foo(i, j)))
๋ก ๋ฐ๋๋ค ๊ณ ๋งํ ์ ์์ง๋ง ์ด๊ฒ์ ๋จ์ง ์ค๋ฅ๋ก ํ๊ฐ๋๋ ์ฒซ ๋ฒ์งธ ?
๋ฅผ ์ณค์ ๋ ๋
น์ด ์ผ์ฐ ๋์ ์จ๋ค๊ณ ๋งํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํผ๋ ์ค๋ฝ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ๋ฆผ์์ด ๋ ๊ฐ๋ ฅ ํ ๊ฒ์
๋๋ค.
@Stebalien ํ์ฉ ๋ RFC์์ catch { Foo::foo(maybe_i?, maybe_j?) }
๋ ์ํ๋ ์์
์ ์ํํฉ๋๋ค.
@eddyb ์ข์ ์ง์ ์ ๋๋ค. ๋๋ "๊ทธ๋ฌ๋ ์ด๊ฒ์ ํ๋ฆผ์์ด ๋ ๊ฐ๋ ฅ ํ ๊ฒ์ด๋ค"๋ฅผ ์๋ต ํ ์ ์๋ค๊ณ ์๊ฐํ๋ค. ์์ ์ ์บ์น / ๋ช ์ ์ ์๋ ๋ ๋ช ์ ์ ์บ์น / ์์ ์ ์๋๋ก ๊ท๊ฒฐ๋ฉ๋๋ค.
let x: i32 = try Foo::foo(a?.b?.c()?));
let y: Result<i32, _> = Foo::foo(a?.b?.c()?);
๋:
let x: i32 = Foo::foo(a?.b?.c()?);
let y: Result<i32, _> = catch Foo::foo(a?.b?.c()?);
(๋ชจ๋๋ก ๊ตฌ๋ฌธ)
@Stebalien ๋ ๋ค๋ฅธ ์ : Foo
ํจ์์ bar
ํ๋ ค๋ฉด ์ ์๊ณผ ํจ๊ป ๋ค์์ ์ํํด์ผํฉ๋๋ค.
bar(Foo::foo(a?.b?.c()?)?)
์ด๊ฒ์ด ๋น์ ์ด ์ผ๋์๋๊ณ ์๋ ๊ฒ์
๋๊น? ์ถ๊ฐ ์ฐธ๊ณ ?
์์ด, bar
์ป์ ๊ฒ Result
๋์ ์ Foo
.
@eddyb ์๋ง. ์ฐธ๊ณ : ์ค์ ๋ก ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค! ?
๋ฅผ ํ์ดํ ์ฐ์ฐ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ Foo::foo(bar?)
์ผ์ด์ค๋ฅผ ์ฒ๋ฆฌ ํ ๋ฐฉ๋ฒ ์์ด๋ rust์์ ํน๋ณํ ์ ์ฉํ์ง ์๋ค๊ณ ์ฃผ์ฅํ๊ณ ์์ต๋๋ค.
์ ๊ฐ ๋ฉ์๋ ๋งคํฌ๋ก์ ๋ํ ์์ด๋์ด๊ฐ ์ซ๊ณ ๋ ๊ฐ๋ ฅํ๊ฒ ๋ฐ๋ ํ ์ธ์ด ๊ธฐ๋ฅ์ ์๊ฐํ ์ ์๋ค๋ ์ ์ ์ ์ํ์ญ์์ค. ๊ทธ๊ฒ๋ค์ ์ปดํ์ผ๋ฌ์ ์์์ ๋ชจํธํ๊ฒ ๋ง๋ค๊ณ , ์ฐ๋ฆฌ๊ฐ ์ธ์ด๋ฅผ ์์ฃผ ๊ทผ๋ณธ์ ์ผ๋ก ๋ณ๊ฒฝํ์ง ์๋ ํ, ๊ทธ๊ฒ๋ค์ด ์กด์ฌํ ์ ์๊ณ ๋๋ผ์ด ํ๋์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๋ํ ํ๋ช ํ๊ฒ ๊ตฌ๋ฌธ ๋ถ์ํ๊ธฐ ์ด๋ ต๊ณ ๊ฑฐ์ ํ์คํ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๋ค.
@Stebalien , ?
๋ฅผ ํ์ดํ ์ฐ์ฐ์ Foo::foo(bar?)
ํ๋ฉด Foo::foo(try!(bar))
๋ฐ bar(Foo::foo(a?.b?.c()?)?)
( Foo::foo : fn(Result<_, _>) -> Result<_, _>
๋ผ๊ณ ๊ฐ์ ) : bar(try!(Foo::foo(a?.b?.c()?)))
@hauleth ๋ด ์์ ์ Foo::foo(bar?)?
์ด ๋
น์์ bar?.foo()?
๋ณด๋ค _ ํจ์ฌ _ ๋ ์ผ๋ฐ์ ์ด๋ผ๋ ๊ฒ์
๋๋ค. ๋ฐ๋ผ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด ?
๊ฐ์ด ๊ฒฝ์ฐ๋ฅผ ์ง์ํด์ผํฉ๋๋ค (๋๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋์
ํด์ผ ํจ). ๋๋ ๊ทธ๋ ๊ฒํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๊ณ ๊ทธ ๋ฐฉ๋ฒ์ด ์ ์ด๋ ์ง์ ๋ถํด์ง ๊ฒ์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ?
์ ์ ์ฒด ์์ ์ try!(foo(try!(bar(try!(baz())))))
(๊ดํธ์ 2 ๋ฐฐ!)๋ฅผ ์ฐ๋ ๊ฒ์ ํผํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ผ๋ฐ์ ์ผ๋ก try!(baz()?.bar()?.foo())
๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ธ์ ๋ ์ง ๋ค์์ ์ํ ํ ์ ์์ต๋๋ค.
try!(baz().and_then(bar).and_then(foo))
ลukasz Niemier
[email protected]
Wiadomoลฤ napisana przez Steven Allen [email protected] w dniu 05.09.2016, o godz. 15:39 :
@hauleth https://github.com/hauleth ๋ด ์์ ์ Foo :: foo (bar?)? bar? .foo ()๋ณด๋ค ํจ์ฌ ๋ ์ผ๋ฐ์ ์ ๋๊น? ๋ น์. ๋ฐ๋ผ์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ๋ ค๋ฉด? ์ด ๊ฒฝ์ฐ๋ฅผ ์ง์ํด์ผํฉ๋๋ค (๋๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋์ ํด์ผ ํจ). ๋๋ ๊ทธ๋ ๊ฒํ๋ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ๊ณ ๊ทธ ๋ฐฉ๋ฒ์ด ์ ์ด๋ ์ง์ ๋ถํด์ง ๊ฒ์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ์ ์ ์ฒด ํฌ์ธํธ? try! (foo (try! (bar (try! (baz ()))))) (๊ดํธ 2 ๋ฐฐ!); ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ try! (baz () ?. bar () ?. foo ())๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub https://github.com/rust-lang/rust/issues/31436#issuecomment -244749275์์ ๋ณด๊ฑฐ๋ https://github.com/notifications/unsubscribe-auth/ ์ค๋ ๋๋ฅผ ์์๊ฑฐํฉ๋๋ค.
์ฝ๊ฐ ๊ด๋ จ์ด์๋ ๋ฉ๋ชจ์์,?-๊ธฐ๋ฅ์ ์ฃผ๋ก ๋น๋๊ฐ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฏ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ํํ๋ ๋น๋๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ?-๊ธฐ๋ฅ์ ํ์์ฑ์ ํผํ ์ ์์ต๋๋ค.
https://github.com/colin-kiegel/rust-derive-builder/issues/25
๋ฉ์๋ ๋งคํฌ๋ก ์์ด๋์ด @nrc ๋ฐ @withoutboats ์ ๋ํ ์๊ฒฌ์ ๋ณด๋ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์๋ํ์ง ์๋ ๊ตฌ์ฒด์ ์ธ ์ด์ ๋ฅผ ๋ค์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
@nielsle ๋๋ ?
๊ฐ "์ฃผ๋ก"๊ฑด์ถ์
์๋ค์ด ์ฌ์ฉํ๊ณ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด ์ ํํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น๋๋ ๊ฒฝ๋์ ์ ๋ฏธ์ฌ ์ฐ์ฐ์์ ์ฅ์ ์ด ์ค์ ๋ก ๋น์ ๋ฐํ๋ ์๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ชจ๋ ์ํฉ์์ ?
try!
๋ฅผ ์ ํธํฉ๋๋ค.
@nielsle ์ ๋ฌผ์ ๊ดํด์๋ ์๋ ๋น์ทํ ์ด์ ๋ก ์ฐ๋ คํ์ต๋๋ค. ํ์ง๋ง ์๊ฐํด ๋ณด๋ฉด async
/ await
์ด (๊ฐ) ํด๋น ์ปจํ
์คํธ์์ ?
์ ๋ํ ๋ชจ๋ ์๊ตฌ๋ฅผ ๋์ฒด ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ค์ ์ค์ ๋ก ์๋นํ ์ง๊ตํฉ๋๋ค. (await future)?.bar()
๊ฐ์ ๊ฒ์ ํ ์ ์์ต๋๋ค.
(ํค์๋ await
๋์ ์ ๋ฏธ์ฌ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ ์ ์์ผ๋ฏ๋ก ๊ดํธ๊ฐ ํ์ํ์ง ์์ต๋๋ค. ์๋๋ฉด ์ ์คํ๊ฒ ์กฐ์ ๋ ์ฐ์ ์์๋ก ์ถฉ๋ถํ ์๋ ์์ต๋๋ค.)
์ฐ๋ฆฌ๊ฐ ์์ ํ๋๊ธฐ ์ ์ ์์ฑ๋ ๋ฌธ์๋ฅผ๋ณด๊ณ ์ถ์ต๋๋ค. ๋๋ ์ฐธ๊ณ ๋ฌธํ์ ์ดํด ๋ณด์์ง๋ง ์ด๋ค ์ธ๊ธ๋ ์ฐพ์ ์ ์์๋ค. ์ด ๊ธฐ๋ฅ์ ์ด๋์ ๋ฌธ์ํํด์ผํฉ๋๊น?
@cbreeden ๋๋ @steveklabnik์ด ์ผ๋ฐ์ ์ผ๋ก ๋ถ์์ ํ ๊ธฐ๋ฅ์ ๋ฌธ์ํํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์์ ํ๋์ง ์์ผ๋ฉด ์๊ฐ ๋ญ๋น๊ฐ ๋ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด์ ์ ๋ฌธ์ ์์ฑ์ ๋ํ ์์ ํ๋ฅผ ์ฐจ๋จ ํ ์ ์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@solson ๋ง์ต๋๋ค. ์ฌ๊ธฐ๋ ์๋ง๋ ๊ทธ๊ฒ์ ์ ๊ธฐ ํ ๊ณณ์ด ์๋ ์๊ฑฐ๋ ์ ์ด๋ ์์ ํ ์ง๋ฌธ๊ณผ ๊ด๋ จ๋์ด์๋ ์๋ฉ๋๋ค. ๊ธฐ๋ฅ ์์ ํ๋ฅผ ๊ฒฐ์ ํ ์ ์์ง๋ง ์์ ์ ์ธ rustc๋ก ์ถ์๋๊ธฐ ์ ์ ๋ฌธ์ํ๊ฐ ํ์ํ ์ํฉ์ ์์ ํ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌธ์๋ฅผ ๊ธฐ๋ฅ ์์ ํ ๋ฐ ๋ฆด๋ฆฌ์ค์ ํตํฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ RFC๊ฐ ์์ผ๋ฏ๋ก ํด๋น ํ๋ก์ธ์ค๊ฐ ์์ ํ ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ๊ฒ์ ๋๋ค (๋ฌผ๋ก ์ ์ ํ ๋ฌธ์๊ฐ ์์ผ๋ฉด ๋จผ์ ).
์ด RFC์ ์ค์ํ ๋ถ๋ถ์ try!
์ฒ๋ผ ์๋ํ๋ ํํ์์ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์ ๊ฐ๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด "try"_much_์ ์์ฐจ / ์ฐ์ ์ฌ์ฉ๋ฒ์ ๋ ์ฝ๊ธฐ ์ฝ๊ณ "catch"๋ฅผ ๊ฐ๋๋กํ๊ธฐ ๋๋ฌธ์
๋๋ค. . ์๋๋ ?
๋ฅผ ๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ 100 % ์ํฌํฐ ์์ง๋ง ์ต๊ทผ์๋ ์ด๋ฏธ ?
๋ฅผ ์ฌ์ฉํ๋ ์ผ๋ถ (๊นจ๋ํ!) ์ฝ๋๋ฅผ ๋ฐ๊ฒฌํ์ฌ ๊ฐ๋จํ ์์ ?
๋ ๋งค์ฐ ์ฝ๊ฒ ๊ฐ๊ณผ ๋ฉ๋๋ค. ์ด์ "์๋ก์ด ์๋"๋ฅผ์ํ ๊ตฌ๋ฌธ์ผ๋ก ?
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํฐ ์ค์ ์ผ ์ ์๋ค๊ณ ๋ฏฟ๊ฒ๋์์ต๋๋ค.
๋ฐ๋ผ์ ?
๋๋ ๋ค๋ฅธ ๊ธฐํธ (๋ค)๋ฅผ ๊ตฌ๋ฌธ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ํ ํผ๋๋ฐฑ์ ์ป๊ธฐ ์ํด (ํฌ๋ผ์ ๋ํ ์๋ฆผ๊ณผ ํจ๊ป) ์๋ฃํ๊ธฐ ์ ์ _ ์ผ๋ถ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค _. . ๋ ๊ธด ๊ธฐ๋ฅ์์์ ์ฌ์ฉ ์์ ํจ๊ป ์ต์ ์
๋๋ค. ๋ค๋ฅธ ๊ฒ์ ๋ณ๊ฒฝํ์ง ์์ผ๋ ค๋ฉด ?
์ด๋ฆ์ ๋ฐ๊พธ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌ๋ก ์กฐ์ฌ๋ ?!
(๋๋ ??
) ๋๋ "์ฌ์ฉ? vs. ๋ฌธ์๋ณด๋ค ๋ง์ด ์ฌ์ฉ"๊ณผ ๊ฐ์ด ๊ณผ๊ฑฐ์ ํ์ด ๋์๋ ๊ฐ๋ฅํ ๋ค๋ฅธ ์ด๋ฆ์ ๋์ด ํ ์ ์์ต๋๋ค.
Btw. ?
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ธ์ด ์ต์
์ ํ๊ณผ ๋์ผํ ๊ตฌ๋ฌธ์ด๊ธฐ ๋๋ฌธ์ ์ซ์ดํ๋ ์ฌ๋๋ค์ ๋ง์กฑ์ํฌ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ rust ์ต์
์ ํ์ ๋ํ ์ ํ์ ๊ตฌ๋ฌธ์ผ๋ก ๋ง๋ค๊ณ ์ํ๋ ์ฌ๋๋ค. (์ด๋ฅผ ํตํด ๋ด๊ฐ ๊ณต์ ํ๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค).
๋ํ ์ด๋ฌํ ์ค๋ฌธ ์กฐ์ฌ๋ฅผ ํตํด ์ผ๋ฐ์ ์ผ๋ก RFC ํ๋ก์ธ์ค์ ์ฐธ์ฌํ์ง ์๋ ์ฌ๋๋ค์๊ฒ ๋๋ฌ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๊ฒ์ ํ์ํ์ง ์์ ์ ์์ง๋ง try!
=> ?
์ Rust ์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ์ฝ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๋งค์ฐ ํฐ ๋ณํ์
๋๋ค.
์ถ์ :
์์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ค์ํ ๋ณํ ( "?", "?!", "??")์ผ๋ก ์์ ์ ์ฌ๋ ธ์ต๋๋ค. ๋ ์์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ํ์ด ์์๋ค RFC ์ด๋ฆ ๋ณ๊ฒฝ ?
์ ?!
์ด ๋
ผ์๋ก ์ฐ๊ฒฐ๋์๋ค.
์ฃ์กํฉ๋๋ค. ์ด๋ฏธ ์ค๋ซ๋์ ์งํ์ค์ธ ํ ๋ก ์ ๋ค์ ์์ํ ์ ์์ต๋๋ค. : smiley_cat :.
( expr???
๋ ๋ชจํธํ๋ฏ๋ก Option์ ?
๋ฅผ ๊ณ์ ๋์
ํ๋ ค๋ ๊ฒฝ์ฐ ??
๋ ์ข์ง ์์ต๋๋ค.)
?
๋ ๋งค์ฐ ์ฝ๊ฒ ๊ฐ๊ณผ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฌด์์ ๋
ผ์ํ๊ณ ์์ต๋๊น? ์์ ํ ๊ฐ์กฐ๋์ง ์์ ์ฝ๋? ์ ๊ธฐ์ ์ผ๋ก ๊ฐ์กฐ ํ์๋ ์ฝ๋ ๊ฒ์?
์๋๋ฉด ํจ์์์ ?
์ ์ ๊ทน์ ์ผ๋ก ์ฐพ๊ณ ์์ต๋๊น?
ํธ์ง๊ธฐ์์ ?
ํ๋๋ฅผ ์ ํํ๋ฉด _all_ ํ์ผ์ ๋ค๋ฅธ ?
๊ฐ ๋ฐ์ ๋
ธ๋์ ๋ฐฐ๊ฒฝ์ผ๋ก ๊ฐ์กฐ ํ์๋๊ณ ๊ฒ์ ๊ธฐ๋ฅ๋ ์๋ํ๋ฏ๋ก ๋ง์ง๋ง ํญ๋ชฉ์ด ํ์๋์ง ์์ต๋๋ค. ๋์๊ฒ _any_ ๋์ด๋๋ฅผ ์ ๊ธฐํ๋ ๊ฒ์ฒ๋ผ.
๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ??
๋๋ ?!
๋๋๋ ๊ฒ๋ณด๋ค ๋ ๋์ ๊ฐ์กฐ ํ์๋ก์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค.
@dathinab ๋๋ .try! () ๋๋ ๋ฌด์ธ๊ฐ๊ฐ ๋ ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋งคํฌ๋ก์๋ UFCS๊ฐ ํ์ํฉ๋๋ค.
let namespace = namespace_opt.ok_or(Error::NoEntry).try!();
์ด๋ ๊ฒํ๋ฉด ๋์น๊ธฐ ์ด๋ ต์ง๋ง .unwrap()
๋ณด๋ค ์
๋ ฅํ๊ธฐ๊ฐ ๋ ์ฝ์ง๋ ์์ง๋ง ๊ฐ๋จํฉ๋๋ค.
@eddyb : ์๋ฅผ ๋ค์ด github์ ๊ฐ์ ์ผ๋ฐ ๊ฐ์กฐ ์ฝ๋์ ๊ดํ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ฝ์ ๋. ๋ด ๊ด์ ์์ ๋ณผ ๋ ?
๋ฅผ ์ฝ๊ฒ ๊ฐ๊ณผํ์ง ์๊ธฐ ์ํด ๊ฐ๋ ฅํ ๊ฐ์กฐ ํ์๊ฐ ํ์ํ๋ฉด ๋ค๋ฅธ ๋ฐํ ๊ฒฝ๋ก (/ path to catch)๋ฅผ ๋์
ํ๊ณ Result<T>
์์ ๋ณ์ ์ ํ์ ๋ณ๊ฒฝํ ์์๋ ๊ฒ์ ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค T
@CryZe : ๋์ํ์ง๋ง ๊ฐ๊น์ด ์์ผ ๋ด์ ์ป์ ์์์ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ .try!()
๋ณด๋ค ์ฝ๊ฐ ์งง์ ๊ฒ์ ๊ฐ๋ ๊ฒ๋ ๊ทธ๋ ๊ฒ ๋์์ง ์์ต๋๋ค.
@CryZe ์ ๋ ๊ทธ ๊ตฌ๋ฌธ์ ์ข์ํ์ง๋ง @withoutboats ๋ ๋ฉ์๋ ๋งคํฌ๋ก๊ฐ ์ธ์ด๋ฅผ ์์์ํฌ ์์๋ ํ์คํ ์ด์ ๋ฅผ ์ธ๊ธํ์ต๋๋ค.
๋ฐ๋ฉด์ ๋ฉ์๋ ๋งคํฌ๋ก๊ฐ ๋ํ๋๋ฉด ?
์ ์ ์๋ํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๋ณธ์ง์ ์ผ๋ก์ด์๊ธธ์ ๋ ๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๋ํ์ง๋ ์์ง๋ง ์์ ๋ฅผ ์ดํด ๋ณด์์ง๋ง ?
์ด ๋ ์ด์ ๋์ ๋๊ฒ ๋ณด์ด๊ฒ ๋ง๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๊ทธ๋. ์ผ๋ฐ์ ์ผ๋ก ๊ธฐํธ๋ ์ผ๋ฐ ์ธ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ชจ๋์์ ๊ตฌ์กฐํ์ ๋ ๋ง์ด ์ฌ์ฉ๋๋ฏ๋ก ์ผ์ข ์ ํค์๋๊ฐ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@CryZe : ์๋ง๋ ?try
์ ๊ฐ์ ๊ฒ์ด ์ผ์ข
์ ํค์๋ ์ผ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์์งํ ๋๋ ๊ทธ๊ฒ์ ์ข์ํ์ง ์๋๋ค ( ?try
).
@eddyb
๊ฒ์ ๊ธฐ๋ฅ๋ ์๋ํฉ๋๋ค.
?
ํ๋ฉด ์ค ํ์ง๊ฐ ๋ฐ์ํ์ง๋ง ๋ ๊ธด ๋ฒ์ ์ ๊ทธ๋ ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ฒ์ ์ค? ๋ ๊ธด ๋ฒ์ ์ ๊ทธ๋ ์ง ์์ ๊ฒ์ ๋๋ค.
๊ตฌ๋ฌธ ํ์ด ๋ผ์ดํฐ๊ฐ์ด๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฒ๋ฆฌ ํ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค (๊ฐ์ ์ฑ ๋ฐฉ์ง). ์ฌ์ค, ํ๋ฆฐ์ง (์ค ๋ฒํธ ์)์ "๋ฐํ ํ ์์๋"๋ง์ปค๋ฅผ ์ฝ์ ํ ์๋ ์์ต๋๋ค.
์๋ฅผ ๋ค๋ฉด
์์ฐ, ํ์คํ ๋ง์ ๋์์ด๋ฉ๋๋ค. ํ์ง๋ง ๋น์ ์ ์ ๋ง๋ก ๋น์ ์ด
ํธ์ง๊ธฐ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑํด์ผํฉ๋๋ค. ํญ์ ์ํ ํ ์๋ ์์ต๋๋ค (์ :
์๋ฅผ ๋ค์ด GitHub์์).
2016-09-15 23:52 GMT + 02 : 00 Steven Allen [email protected] :
์๋ฅผ ๋ค๋ฉด
[์ด๋ฏธ์ง : screen-2016-09-15-175131]
https://cloud.githubusercontent.com/assets/310393/18568833/1deed796-7b6d-11e6-99af-75f0d7ddd778.pngโ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/31436#issuecomment -247465972,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ABYmbjyrt07NXKMUdmlBfaciRZq7uBVEks5qqb4sgaJpZM4HUm_-
.
@CryZe GitHub๊ฐ ์คํ ์์ค ๊ตฌ๋ฌธ
๋๋ ์ผ๋ฐ์ ์ผ๋ก Rust ํ๋ก์ ํธ๊ฐ Rust์ ๊ตฌ๋ฌธ ํ์ด ๋ผ์ดํฐ๊ฐ ๊ฐ์์ฑ์ ๋ํ ์ฐ๋ ค์ ๊ท ํ์ ๋ง์ถ๊ธฐ ์ํด ?
์์ ๋งค์ฐ ๋์ ์ ๋๋ ์คํ์ผ์ ์ฌ์ฉํด์ผํ๋ค๊ณ ์ถ์ฒํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ?
์ด ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ํ ์์๋ ์ต์ ์ ์ ํ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ์ฐ๋ฆฌ๋ Miri ์์ ๊ฝค ๋ง์ด ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์๋์ ๋๊ธฐ๋ก ๋์๊ฐ์ try!(...)
๋ ๋์ ๊ฑฐ์ฌ ๋ฆฌ๊ณ ์ค๋ฅ์ ํ๋ฆ์ ๋ฌด์ํ๊ณ ํ๋ณตํ ๊ธธ์ ์ฝ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ ์ ํต์ ์ธ ์ธ์ด์ ๋ณด์ด์ง ์๋ ์์ธ์ ๋นํด ๋จ์ ์
๋๋ค. ?
๋ฅผ ๋ ๊ด๋ จ์ฑ์ด ๋์ ํค์๋๋ก ํ์ฅํ๋ฉด ๋์ผํ ๋จ์ ์ด ์์ต๋๋ค.
๋ฐ๋ฉด์ ?
๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ์ ํ๋ฆ์ ์ ๊ฒฝ ์ฐ์ง ์์ผ๋ฉด ๋ฌด์ํ๊ณ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์ฌ๋ผ์ง๊ฒ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์ ๋ง๋ก ์ค๋ฅ์ ํ๋ฆ์ ์ ๊ฒฝ์ ์จ๋ ?
๋ ๊ด์ฐฎ์ต๋๋ค. ?
๋ฐ๊ฒ ๊ฐ์กฐํ๋ ๊ฒ์ ๋์๊ฒ๋ ํ์ํ์ง ์์ง๋ง ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ๋์์ด๋๋ค๋ฉด ์ข์ต๋๋ค. ์ด๊ฒ์ ๋ณด์ด์ง ์๋ ์์ธ์ try!
๋ ๋ค์ ๋ํ ๊ฐ์ ์
๋๋ค.
?!
์ ๊ฐ์ด ์ฌ์ํ์๊ธธ๋ก ์ ํํ๋ ๊ฒ์ ์ด๋ค ์ ์ผ๋ก๋ ๋์์ด๋์ง๋ ์์ง๋ง ์ค๋ฅ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ ์ฝ๊ฐ ๋ ๋๋น ์ง๋๋ค.
๋ง์ง๋ง ๋๊ธ์ ์์ฑ ํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค ( ์ด์ ๋ด๋ถ ์ค๋ ๋๋ ํฌํจ ). ์ง๊ธ๊น์ง ๊ฐ์ฅ ๋ง์ด ์ธ๊ธ ๋ RFC์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์์ ํ์ ๋ํ ๋ ผ์๊ฐ ํ๋ฐํ๊ฒ ์งํ๋๊ณ ์๋ค๋ ์ฌ์ค์ ๋๋์ง ์์ต๋๋ค.
๋จผ์ ์ถ์ ์ ์์ํ๊ฒ ์ต๋๋ค . @ rust-lang / lang ํ์ Result
์ ํ์ ๊ฐ์ ์ ์ฉ๋ ๋ ?
์ฐ์ฐ์๋ฅผ ์์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. catch
๊ธฐ๋ฅ์ ์์ ํ๋์ง ์์์ผ๋ฉฐ ์ค์ ๋ก ์์ง ๊ตฌํ๋์ง ์์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ?
๋ฅผ Option
์ ๊ฐ์ ์ ํ์ผ๋ก ํ์ฅํ๋ ์๋จ ์ธ ์์ "์ด๋ฐ์ ํน์ฑ"์ ์์ง RFC ์ด์ ๋
ผ์ ๋จ๊ณ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ค์ Carrier
ํน์ฑ์ ์ถ๊ฐ ํ ์ ์๋๋ก ํ์ฌ ๊ตฌํ์์ ๋จ๊ณ๋ฅผ ์ํํ์ต๋๋ค (์ถ๋ก ๊ณผ์ ์ ์ฌ์ ์ํธ ์์ฉ์ ๋ํ ์ด์ ์ฐ๋ ค ์ฌํญ ์ค ์ผ๋ถ๋ฅผ ํด๊ฒฐ ํจ).
8 ์ 22 ์ผ FCP๊ฐ ์์๋ ์ดํ๋ก ์งํ๋ ๋ ผ์๋ฅผ ์์ฝํ๊ธฐ ์ํด ์ ์ ์๊ฐ์ ํ ์ ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฌํ ํ ๋ง์ ๋๋ถ๋ถ์ ์๋ RFC ์ค๋ ๋ ์์๋ ๋ฐ์ํ์ต๋๋ค. ์ค๋ ๋๋ฅผ ์ฝ๋ ๋ฐ ๊ด์ฌ์ด ์๋ค๋ฉด ํด๋น ์ค๋ ๋์ FCP ์ฃผ์ ๊ณผ ์์ฝ ์ฃผ์ ์ด ๋ํ๋ฅผ ์ฌ๋์๊ฒ ๋ค๋ฃจ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋์ด ์ค๋ ๋์ ํด๋นํ๋ ๊ฒ๋ณด๋ค ๋ ์ฌ๋์๋ ๊ฒฝ์ฐ ์๋ ์ค๋ ๋์ ์ฃผ์์ ๋งํฌ ํ ๊ฒ์ ๋๋ค.
?
์ฐ์ฐ์์ ๋ฒ์๋ ํ์ฌ ํจ์๊ฐ ์๋ ํ์ฌ ํํ์์ด์ด์ผํฉ๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋์ try!
๋งคํฌ๋ก๋ ํด๋น ์ค๋ฅ๋ฅผ ํธ์ถ ํจ์์ ๋ฌด์กฐ๊ฑด ์ ํํฉ๋๋ค (์ฆ, ์ค๋ฅ์ ํจ๊ป return
๋ฅผ ์คํ ํจ). ํ์ฌ ์ค๊ณ๋๋๋ก ?
์ฐ์ฐ์๋์ด ์ ๋ก๋ฅผ ๋ฐ๋ฅด์ง๋ง ์ฌ์ฉ์๊ฐ ๋ ์ ํ๋ ๋ฒ์๋ฅผ ์ง์ ํ ์ ์๋๋ก ํ์ฉํ๋ catch
ํค์๋๋ฅผ ์ง์ํฉ๋๋ค. ์ด๋ ์๋ฅผ ๋ค์ด x.and_then(|b| foo(b))
๋ฅผ catch { foo(x?) }
๋ก ์ธ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ฉด, ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ and_then
์ ์ฌํ ๊ฒ์ ์๋ฏธํฉ๋๋ค
๊ถ๊ทน์ ์ผ๋ก catch
๊ฐ ๊ตฌํ๋๋ฉด ์ด๊ฒ์ ๊ธฐ๋ณธ๊ฐ ๋ฌธ์ ์
๋๋ค . ๊ทธ๋ฆฌ๊ณ Rust์ ?
์ "break out of function"(์ฌ์ฉ์ ์ ์ ์ต์
ํฌํจ)์ ๊ธฐ๋ณธ๊ฐ์ด ๋ ์ ์ ํ๋ค๊ณ ์๊ฐํ๋ ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
try!
๋งคํฌ๋ก๋ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ๋ฌ ๋ฒ ์
์ฆ๋์์ต๋๋ค . ?
๋ try!
๋์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋์ผํ๊ฒ ์๋ํ๋ ๊ฒ์ด ๋น์ฐํฉ๋๋ค.?
๋ ์ฃผ๋ก ๊ฒฐ๊ณผ ๋ฅผ ์ ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ์์ธ์ ๋ ์ ์ฌํฉ๋๋ค. ๋ชจ๋ ์์ธ ์์คํ
์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฌ ํจ์์์ ํธ์ถ์์๊ฒ ์ค๋ฅ๋ฅผ ์ ํํฉ๋๋ค (Swift์ ๊ฐ์ด์ด๋ฅผ ์ํด ํค์๋๊ฐ ํ์ํ ์์คํ
๋ ํฌํจ).?
๋ null ๊ฐ ๋๋ ์ต์
์ ํ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.?
์ฐ์ฐ์๋ ์ฌ์ ํ ์ธ๊ธ ๋ ์๋๋ฆฌ์ค (ํนํ catch
์ ํจ๊ป ์ฌ์ฉ)์์ ์ฌ์ฉํ ์ ์์ง๋ง _main_ ์ฌ์ฉ ์ฌ๋ก๋ ์๋๋๋ค.and_then
๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉ์๋ ํ๊ธฐ๋ฒ์ผ๋ก๋ ์๋ํ์ง ์์ต๋๋ค . ์ด๋ค ๊ฒฝ์ฐ์ (๋ฏธ๋์์์ ๊ฐ์) ์ผ๋ถ ์์ธก ๋ ๋ฏธ๋ ์ฌ์ฉ ์ ๋น๋๊ธฐ-๋๊ธฐ ๋ณํ์ ํฌํจ๋ ์ ?
์๋ณํ๊ธฐ ์ด๋ ต ๊ธฐ ๋๋ฌธ์ ์ ์ด ํ๋ฆ์๊ฐ๋ฆฝ๋๋ค.
์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ ?
์ฐ์ฐ์๊ฐ ๋๋ฌด ์ฝ๊ฒ ๊ฐ๊ณผ๋๋ค๋ ๊ฒ ์
๋๋ค. ์ด๊ฒ์ ๋ถ๋ช
ํ ๊ท ํ ์กํ ํ๋์
๋๋ค. ๊ฒฝ๋ ์ฐ์ฐ์๋ฅผ ๊ฐ๋ ๊ฒ์ ๊ทธ๊ฒ์ด ์ฝ๊ฒ "ํ๋ณตํ ๊ฒฝ๋ก"๋น์ ์ด ์ํ๋ ๊ฒฝ์ฐ์ ์ด์ ์ ํ ์ ์์ต๋๋ค -ํ์ง๋ง ์ค๋ฅ๊ฐ (์์ ์ ์ ์ด ํ๋ฆ์ ์๊ฐ ์์ธ๋ ๋ฌ๋ฆฌ)๊ฐ ๋ฐ์ํ ์์๋ ์ด๋ค ํ์๋ฅผํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ํ ๊ตฌ๋ฌธ ๊ฐ์กฐ ํ์ (์ : 1 , 2 )๋ฅผ ํตํด ?
์ฝ๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
๋ฐฉ๋ฒ ๋งคํฌ๋ก๋ ์ ์๋ฉ๋๊น?
?
์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ ์์ ํ ์์น์์ ์ฌ์ฉํ ์ ์์ง๋ง
foo.try!
์ ๊ฐ์ "๋ฉ์๋ ๋งคํฌ๋ก"์์ ์ ์ฌํ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค . ์ฌ์ค์ด์ง๋ง, ๋ฉ์๋ ๋งคํฌ๋ก ๋ ํนํ ๋ฉ์๋ ์ฒ๋ผ ๋์ํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ ์์ฒด์ ์ผ๋ก ๋ง์ ๋ณต์ก์ฑ์ ์ด์ด์ค๋๋ค (์ : ์ดํ ๋ฒ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์์ ์ ์ ํ ์ ๋ฐ๋ผ ์ ๋ฌ๋จ). ๋ํ foo.try!
์ ๊ฐ์ ๋ฉ์๋ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด foo?
๋ณด๋ค ํจ์ฌ ๋ ๋ฌด๊ฑฐ์ด ๋ฌด๊ฒ๊ฐ์ ๋๋ ์ ์์ต๋๋ค (์ด์ ์์ ์ฐธ์กฐ).
From
๋ ์ด๋ค ๊ณ์ฝ์ ์ ๊ณตํด์ผํฉ๋๊น?
์๋ RFC ํ ๋ก ์์ ์ฐ๋ฆฌ๋ [ From
๋ํ "๊ณ์ฝ"์ด ์์ด์ผํ๋์ง ์ฌ๋ถ] ((https://github.com/rust-lang/rust/issues/31436#issuecomment)์ ๋ํ ์ง๋ฌธ์ ์ฐ๊ธฐํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. lang ํ์ ์ผ๋ฐ์ ์ธ ํฉ์ ๋ ?
์ฐ์ฐ์๋ฅผ From
ํน์ฑ์ ํธ์ถํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ ํด์ผํ๋ฉฐ From
ํน์ฑ impls๊ฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฌด์์ด๋ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. From
ํธ๋ ์ด ํธ์ ์ญํ ์ ์ด์จ๋ ์ฌ๊ธฐ์์ ์๋นํ ์ ํ์ ์ด๋ผ๋ ์ ์ ์ ์ํ์ญ์์ค. ์ด๊ฒ์ ๋จ์ํ ํ ์ข
๋ฅ์ ์ค๋ฅ์์ ๋ค๋ฅธ ์ข
๋ฅ์ ์ค๋ฅ๋ก ๋ณํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค (ํ์ง๋ง ํญ์ Result
์ ์ปจํ
์คํธ์์
๊ทธ๋ฌ๋ "๋ณด์ ์"ํน์ฑ์ ๋ํ ๋
ผ์๊ฐ ์งํ ์ค์ด๋ฉฐ์ด ์๋๋ฆฌ์ค์์ ๊ฐ๋ ฅํ ๊ด์ต์ ์ฑํํ๋ ๊ฒ์ด ๋ ์ค์ํ๋ค๋ ์ ์ ์ฃผ๋ชฉํ๊ณ ์ถ์ต๋๋ค. ํนํ, ์บ๋ฆฌ์ด ํธ๋ ์ด ํธ๋ ์ด๋ค ์ ํ์ "์ฑ๊ณต"๊ณผ "์คํจ"๋ฅผ ๊ตฌ์ฑํ๋์ง, ํ ์ข
๋ฅ์ ๊ฐ (์ : Option
)์ด ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํ ๋ ์ ์๋์ง ์ฌ๋ถ (์ : Result
). ๋ง์ ์ฌ๋๋ค์ด "์ค๋ฅ ์ ์ฌ"์ ํ ๊ฐ์ ์์์ ์ํธ ๋ณํ์ ์ง์ํ์ง ์๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์ฃผ์ฅํ์ต๋๋ค (์ : ?
๋ Option
๋ฅผ Result
๋ก ๋ณํ ํ ์ ์์ด์ผํฉ๋๋ค). ๋ถ๋ช
ํ ์ต์ข
์ฌ์ฉ์๋ ์์ ์ด ์ ํํ ์ ํ์ ๋ํด Carrier
ํน์ฑ์ ๊ตฌํํ ์ ์์ผ๋ฏ๋ก ์ด๋ ๊ถ๊ทน์ ์ผ๋ก ์ง์นจ์ด์ง๋ง ์ค์ํ ๊ฒ์
๋๋ค.
ํฌํธ ์๋! ์ฌ์ฉ ?
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ญ ํธํ ์ ์ผ๋ก ํ ์ ์๋ค๊ณ ์๊ฐํ๋ฉฐ try!
์ ๊ตฌํ์ ๊ทธ๋๋ก ๋์ด์ผํฉ๋๋ค. try!
ํ๊ธฐํด์ผํฉ๋๊น?
@nrc ์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ต๋๊น?
@withoutboats try!(x)
๋ (x : Result<_, _>)?
์ด๋ฉฐ ์ฐ๋ฆฌ๊ฐ _ ์ํ๋ค๋ฉด ๊ทธ๋ ๊ฒ ๊ตฌํํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก x?
๋ Carrier
๋ฅผ ์ง์ํ๋ ๋ชจ๋ ๊ฒ์ ์ถ๋ก ํ ์ ์์ต๋๋ค. ํน์ฑ (ํฅํ), ํ ๊ฐ์ง ์๋ iter.collect()?
์ด๋ฉฐ try!
๊ฒฝ์ฐ Result
๋ฟ์ด์ง ๋ง ํ์ค์ ์ผ๋ก Option
์์ต๋๋ค.
๋ง์ด ๋๋ค์. ๋๋ ์ฐ๋ฆฌ๊ฐ std์ impls๋ฅผ ์ถ๊ฐํ๋ฉด ์ถ๋ก ์ด ๋ชจํธํด์ง ์ ์๋ค๋ ๊ฒ์ ๋ฐ์ ๋ค์๋ค๊ณ ์๊ฐํ์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์๋ค์ด์ง ์๊ฒ ์ต๋๊น?
์ด๋ ์ชฝ์ด๋ , try!
๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
? ์ปจํ ์คํธ์ ๊ฐ์ ๋น๋ ํจํด์์ ๋ ์ ์ฉํ์ง๋ง try๋ ์ปจํ ์คํธ์ ๊ฐ์ ์ค์ฒฉ ๋ ๋ฉ์๋์์ ๋ ์ ์ฉํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌด์์ด๋ ๋น์ถ์ฒ๋์ด์๋ ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
@ est31 ์ถ๋ก ์ ์ ์ธํ๊ณ ๋ ์ง๊ธ ์ ํํ ๋๊ฐ์ ์ผ์ํฉ๋๋ค. ์ ํํ ๋ฌด์์ ์๋ฏธํ๋์ง ํ์คํ์ง ์์ง๋ง ?
์ ์ผ๋ฐ์ ์ผ๋ก ์๊ฒฉํ๊ฒ ๋ ๋ช
ํํฉ๋๋ค (๋ค์ ๋ชจ๋๋ก ์ถ๋ก ). ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น?
@eddyb foo()?.bar()?.baz()
๋ try!(try!(foo()).bar()).baz()
๋ณด๋ค ์ข์ผ๋ฉฐ foo()?.bar()?.baz()
try!(bar(try!(foo())))
๋ bar(foo()?)?
๋ณด๋ค ์ข์ต๋๋ค
๋ ๊ฒฝ์ฐ ๋ชจ๋ ?
๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ๋ถํ์ํ ๊ดํธ ํผ๋์ ์ค์
๋๋ค.
์ธ์ ์์ ์ํ๊ฐ ๋ ๊น์?
@ofek ์ด๊ฒ์ ์์ง ์์ ํ์ง ์์ ๋ชจ๋ ๊ฒ์์ํ ๊ฒ์ด๋ฏ๋ก ๋งํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค. https://github.com/rust-lang/rust/pull/36995 ๋ 1.14์์ ์์ ์ ์ด์ด์ผํ๋ ๊ธฐ๋ณธ ?
๊ตฌ๋ฌธ์ ์์ ํํ์ต๋๋ค.
์ถ๊ฐํ๋ ๊ฒ์ ์์ง ๋ง์ธ์? ์ด์ ์์ ์ ์ธ ์ฐธ์กฐ ์ฐ์ฐ์ : https://doc.rust-lang.org/nightly/reference.html#unary -operator-expressions
๊ทธ๋ฆฌ๊ณ @bluss ๋ ์ฑ ์ด ๊ตฌ์์ด๋ผ๊ณ ์ง์ ํ์ต๋๋ค : https://doc.rust-lang.org/nightly/book/syntax-index.html
ํ ๋ง์นด
๋๋ ์ฐ์ฅํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๊น? ์ต์ .
์ค๋ฅ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, get
๋ฅผ ๊ฐ์ ธ ์์ ์ด๋ค ํจ์๋ก ๋งคํํ๋ ๋ํผ ๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด None
์ผ์ด์ค๋ฅผ ์ ํ ํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
? ๋จ์ง ์ค๋ฅ์ ๋ํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์์ต๋๋ค. ์ด์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ ํ์ ๋ํ ๋ ์ผ๋ฐ์ ์ธ do ํ๊ธฐ๋ฒ์ ๋ชฉํ๊ฐ ์๋๋๋ค.
2016 ๋ 10 ์ 29 ์ผ 11:08 -0400, ticki [email protected] , ์์ฑ :
@tomaka (https://github.com/tomaka)
๋๋ ์ฐ์ฅํ๋ ๊ฒ์ ๋ฐ๋ํฉ๋๊น? ์ต์ .
์ค๋ฅ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ ํ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, get์ ๊ฐ์ ธ ์์ ์ผ๋ถ ํจ์๋ก ๋งคํํ๋ ๋ํผ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด None ์ผ์ด์ค๋ฅผ ์ ํ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
โ
๋น์ ์ด ์ธ๊ธ ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๊ณ ์์ต๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub (https://github.com/rust-lang/rust/issues/31436#issuecomment-257096575)์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐ (https://github.com/notifications/unsubscribe)ํฉ๋๋ค. -auth / AABsipGIpTF1-7enk-z_5JRYYtl46FLPks5q42DCgaJpZM4HUm_-).
์ด (= ?
์์ฒด)๋ ์ด์ ์์ ์ ์ธ ๊ธฐ๋ฅ์
๋๋ค! (Rust 1.13๋ถํฐ)
๋ ๊ฐ์ง ๋ฌธ์ ๋ฌธ์ :
Carrier
ํธ๋ ์ด ํธ ๋ฌธ์ ์
๋ฐ์ดํธcatch
๋๋ Carrier
ํธ๋ ์ด ํธ๋ ์์ง ์ ๋๋ก ๊ตฌํ๋์ง ์์์ผ๋ฉฐ, ๋ฒ ์ด ?
๊ธฐ๋ฅ
Carrier
์ด ์กด์ฌํ๊ณ ?
์ฌ์ฉํ ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ์ด๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก Carrier ๋ฌธ์ ๊ฐ ๊ฑฐ๋ถ๋๋ ๊ฒ๋ณด๋ค ์์ ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ๋ฌธ์๋ Option์ ๋ํด ๊ตฌํ๋๋ ๊ฒ์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์๋ ์
๋ฐ์ดํธํด์ผํฉ๋๋ค. (๊ฑฐ์ง).
Carrier
๋ํ ์ธ๊ธ์ ์ ๊ฑฐํด์ผํฉ๋๋ค. ์ ์ด๋ Carrier
๋ฌธ์์์ Option
๋ฉ์
์ ์ ๊ฑฐํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.Carrier
ํธ๋ ์ด ํธ์์ ์ํธ ์์ฉ์ผ๋ก ์ธํด์ด ๋ฌธ์ ์ T-libs
์ ์ถ๊ฐํฉ๋๋ค.
@cramertj ๊ฐ ๋ง๋ ์ง๋ฌธ : https://internals.rust-lang.org/t/grammatical-ambiguity-around-catch-blocks/4807
์๋
ํ์ธ์; # 31954์์ ์ค๋ฅ ์ ํ์ ๋ํ ์
์บ์คํธ๋ From
(๋ฐ ํ์ฌ head ์์๋ ๋์ผ)์ ์ฌ์ฉํ์ฌ ์ํ๋์ง๋ง RFC 243 ์์๋ ๋ณํ์ Into
์ฌ์ฉํด์ผํ๋ค๊ณ ๋ถ๋ช
ํ ๋ช
์ํฉ๋๋ค.
From
๊ฐ ๋์ ์ฌ์ฉ ๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ผ๋ฐ ์ค๋ฅ ์ ํ (์ : io::Error
๋๋ ์ธ๋ถ ํฌ๋ ์ดํธ์ ๋ค๋ฅธ ํญ๋ชฉ)์ผ๋ก ์
์บ์คํธํ๋ ค๊ณ ํ ๋ ๋ก์ปฌ ์ค๋ฅ ์ ํ์ ๋ํด From
๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
(RFC 243์ ์์ฑ์ ์ธ FWIW๋ From
๋๋ Into
๊ฐ ๋ ๋ซ๋ค๊ณ ์๊ฐํ์ง ์์์ผ๋ฉฐ ์ฌ๋ฐ๋ฅธ ์ ํ์ํ์ ์๋ ์๋ ์๋ ์์ต๋๋ค. ์ง๋ฌธ์ RFC์ ์ฐ์ฌ์ง ๋ด์ฉ์ด ์๋ ์ฅ์ (์ด ์์ ์์ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ํฌํจ ํ ์ ์์)์ ๋ฐ๋ผ ๊ฒฐ์ ๋์ด์ผํฉ๋๋ค.)
์ฌํ๊ฒ๋ ํ๊ท๊ฐ์์ ๊ฒ์
๋๋ค. ์๋ (์ ์ง ์์) ๊ฒฝ์ฐ From<...>
์ฌ์ฉํ ๋ ๊ตฌํ๋๋ ์ค๋ฅ ์ ํ ์ธ์คํด์ค ์ปดํ์ผ๋ฌ๋ ํน์ ๊ฒฝ์ฐ์ ํ์
์ ์ถ๋ก ํ ์ ์ด๋์ ๊ทธ๊ฒ์ ์ถ๋ก ํ ์ Into
์ (์ธํธ From
์ธ์คํด์ค๋ ํ์ฌ ํฌ๋ ์ดํธ์ ์ํด ์ ํ๋๋ฉฐ Into
์ธ์คํด์ค์ ์ ์ฒด ์ธํธ๋ ํฌ๋ ์ดํธ๋ฅผ ์ปดํ์ผํ๋ ๋์ ์ ์ ์์ต๋๋ค.
์ฐธ์กฐ https://play.rust-lang.org/?gist=6d3ee9f93c8b40094a80d3481b12dd00๋ฅผ (ํฌํจํ๋ ์ค์ ๋ฌธ์ ์์ "๋จ์ํ" fmt::Error
์ SRC / librustc / ํด๋์ ์ ํธ๋ฆฌํฐ / ppaux.rs # L81 )
?
๋ฅผ ์ค๋ช
ํ๋ ์ธก๋ฉด์์ ์ด์ RFC๋ฅผ ๋์ฒด ํ ์๋ก์ด RFC๊ฐ ์์ต๋๋ค. rust-lang / rfcs / pull / 1859
catch
๋ธ๋ก์ด ์ด๋ฏธ ํจ์ฌ ๋ ๊ฐ๊ฒฐ ํ ๋ ๋๋ -1์
๋๋ค.
ํด๋ก์ ๋ ํ๋ฆ ์ ์ด ๋ฌธ์ ๋ฐฉํดํฉ๋๋ค. ( break
, continue
, return
)
https://github.com/rust-lang/rfcs/pull/1859 ๊ฐ ๋ณํฉ๋์๊ณ ์ด ๋ฌธ์ ๋ฅผ ์ถ์ ๋ฌธ์ ๋ก ์ฌ์ฌ์ฉํ๋ค๊ณ ์ฃผ์ฅ ํ์ผ๋ฏ๋ก catch
์ฌํ๊ฐ ํ ๊ฒ์ ์ ์ํฉ๋๋ค. RFC 243์
๋๋ ์ฐ๋ฆฌ๊ฐ ์ฒ ์ ํ๊ฒ ๊ทธ๊ฒ์ ์ ๊ฑฐ ๊ฒ์ ์ ์ํ์ง๋ง, ๋ํ ์ด์ ์๋์์ catch
๊ทธ๊ฒ์ ์ํด์ด์๋ค ์๋ํ๋ก ๊ฒฐ์ฝ ?
๋๋ ๊ทธ๊ฒ์ ๊ฐ์น๊ฐ ์๋์ง ์ฌ์ ํ ๋น์ ์๋ฏธ๊ฐ ์์์ ๋ง๋ค ์๊ฐ ?
๋ฅผ ์ํด ๋ฑ์ฅํ์ผ๋ฉฐ Try
์ ๋น์ถ์ด ๋ฑ์ฅ ํ ๊ฒ์ผ๋ก ์์๋๋ ๊ด์ฉ๊ตฌ์
๋๋ค.
๋๋ ์ฌ์ ํ ์ก๊ธฐ๋ฅผ ์ด๋งํฉ๋๋ค. ์ค๋ ์ผ์ฐ ๋๋ catch๊ฐ ์์ ์ ์ด๋ผ๋ฉด ํผํ ์์๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ ํด์ผํ๋ค.
์ด ๊ธฐ๋ฅ์ do catch
๊ตฌ๋ฌธ์ผ๋ก ์ผ๊ฐ์ ๊ตฌํ๋์์ต๋๋ค. ๊ทธ๋ ์ง ์์ต๋๊น?
@withoutboats ์, catch { ... }
๋ ๊ตฌ์กฐ์ฒด ๋ฆฌํฐ๋ด ( struct catch { }; catch { }
)๊ณผ ์ถฉ๋ํ๋ฏ๋ก ํ์ฌ do catch
์
๋๋ค.
.
@archshift @SimonSapin ์ด ์์์ ์ง์ ํ๋ฏ์ด, ํด๋ก์ ๋ break
, continue
๋ฐ return
๋ฐฉํดํฉ๋๋ค.
@bstrie ์์ฆ์๋ catch
์์ฃผ ์ํฉ๋๋ค. ๋ฆฌํฉํ ๋ง ์ค์ ๋ง์ด ๋ฐ์ํฉ๋๋ค.
๊ตฌ๋ฌธ์ผ๋ก do catch
์ (๋ฅผ) ์๊ตฌํ ๊ณํ์ด๋ผ๋ ์ฌ์ค์ ๋ชฐ๋์ต๋๋ค. ์ค์ ํ์์ ์ํ์ด ๋งค์ฐ ๋ฎ๋ค๋ ์ ์ ๊ฐ์ํ ๋ (๋ ๋ค ๊ตฌ์กฐ์ฒด ์ด๋ฆ ์ง์ ์ง์นจ์ ์๋ฐํ๊ณ ์์ฑ์๊ฐ ๋ช
๋ น๋ฌธ์ ์ฒซ ๋ฒ์งธ ํํ์ (๋ฐํ ์์น ๋ฐ์์๋ ๋๋ญ
๋๋ค)์ด์ด์ผ ํจ)์ ๊ณ ๋ คํ ๋ rustfmt๋ฅผ ํ์ฉํ์ฌ ๋ฌธ์ ๊ฐ๋๋ ์๋ณ์๋ฅผ catch_
๋ค์ ์์ฑ ํ์๊ฒ ์ต๋๊น? ๊ทธ๋ ๊ฒํ๊ธฐ ์ํด Rust 2.0์ด ํ์ํ๋ค๋ฉด, ๊ธ์์, ์ ๋ Rust 2.0์ด ์ด์จ๋ ์ฌ์ํ ๋ณ๊ฒฝ ์ฌํญ ๋ง ํฌํจํด์ผํ๋ค๊ณ ํญ์ ๋งํ๊ณ ์์ต๋๋ค ... : P
@bstrie ์ฐ๋ฆฌ๋ ์ ๋์ ์ผ๋ก do catch
์ฅ๊ธฐ๋ฅผ ์๊ตฌํ๊ณ ์ถ์ง ์์ต๋๋ค. ํ์ฌ ํด๋น ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๊ฒ ๋ ํ ๋ก ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. https://github.com/rust-lang/rust/pull/39921
ํ๋ฅญํฉ๋๋ค. ์ปจํ ์คํธ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋๋ ํฌ๋ง ๋๋ฌธ์ ๋ ๊ทธ๋ฅ ์ฌ๊ธฐ ์จ catch
๋ ์์ , ๊ทธ๊ฒ์ ๋ฐฐ์์ผํ๋ค๋์ง ์๋ - ๊ทธ๋์ ์, ์ ๋์ ์ผ๋ก, ์ง๊ธ ?
์์ ์ ์ด๊ณ , ๋ํ ๊ฐ์ง๊ณ ํฐ ๊ฒ catch
.
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ๋๋จธ์ง ๋ถ๋ถ์ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๋๋ฌํ๋์ง๋ณด๊ณ ์ถ์๊ณ do catch ํ ๋ก ์ ๋ณด์์ต๋๋ค.
๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๋์์ด ๋ ์ด๋ฆฌ์์ ์์ด๋์ด๋ฅผ ๊ณ ๋ คํด ์์ต๋๋ค. ์ ํ์ ์ผ๋ก ํค์๋ ์ ๋์ฌ์ @ ๋๋ ๋ค๋ฅธ์๊ธธ์ ํ์ฉ ํ ๋ค์ ๋ชจ๋ ์ ํค์๋์์๊ธธ ๋ง ์ฌ์ฉํ๋๋กํฉ๋๋ค. ์ฝ ๋ฃจํด ํ ๋ก ์์๋ ๋น์ทํ ๋ฌธ์ ๊ฐ์์์ต๋๋ค. ๋ด๊ฐ ๊ฑฐ๊ธฐ์ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ค์ด ๊ฐ๋์ง ๊ธฐ์ต์ด ๋์ง ์์ง๋ง-๋ด๊ฐ ๊ฐ์ง ์๋ ์์ง๋ง-์ด๊ฒ์ด ๊ณ์ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.
FWIW, C #์ ์ค์ ๋ก ํค์๋๋ฅผ ์๋ณ์๋ก ์ฌ์ฉํ๊ธฐ ์ํด @
๋ฅผ ์ง์ํฉ๋๋ค. HTML ๋
ธ๋์์ ์์ฑ์ ์ค์ ํ๊ธฐ ์ํด new { <strong i="6">@class</strong> = "errorbox" }
์ ๊ฐ์ ๊ฒ์ ์ ๋ฌํ๋ Razor์์ ํํ ๋ณผ ์ ์์ต๋๋ค.
๋ฟก๋ฟก
๊ทธ ํฅ๋ฏธ ๋กญ๊ตฐ์. ๋๋ ๊ทธ๊ฒ์ ๋ํด ๋ชฐ๋๋ค. ๊ทธ๋ฌ๋ Rust์ ๊ฒฝ์ฐ ํธํ์ฑ ๋๋ฌธ์ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ผํฉ๋๋ค.
๊ทธ๋๋ ๊น๋ํ ์์ด๋์ด. .net ์ํ๊ณ์๋ ์๋ก ๋ค๋ฅธ ํค์๋๋ฅผ ์ฌ์ฉํ๊ณ ๋ชจ๋ ์๋ก ์ ํ ํ ์์๋ ๋ง์ ์ธ์ด๊ฐ ์์ต๋๋ค.
ํค์๋์ ๋ฏธ๋์ ๋ํ ๋ ํ๋์ ๊ฐ๋ฅ์ฑ : ์ผ์ข
์ ์์ ์ ์ธ #[feature]
๊ฐ์ ์์ฑ ๋ค์ ํค์๋๋ฅผ ๋ฐฐ์นํ๋ ๊ฒ์
๋๋ค.
์ด ๋ฌธ์ ๋ ์ฅ๊ธฐ์ ์ผ๋ก ๋ ์ผ๋ฐ์ ์ธ ํด๊ฒฐ์ฑ ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@camlorn ์ด ์ค๋ ๋, ํนํ Rust "epochs"์ ๋ํ Aaron์ ์์ด๋์ด์ ๊ด์ฌ์ด์์ ์ ์์ต๋๋ค. https://internals.rust-lang.org/t/pre-rfc-stable-features-for-breaking-changes/5002
์ฌ๊ธฐ ๋ฌธ์ ์ค๋ช ์์ https://github.com/rust-lang/rust/issues/42327 ์ ๋งํฌํด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. (๋ํ RFC ํ ์คํธ๋ฅผ ์ฌ๊ธฐ ๋์ ๋งํฌํ๋๋ก ์ ๋ฐ์ดํธํด์ผ ํ ์๋ ์์ต๋๋ค.)
(ํธ์งํ๋ค : ๋๋ ๊ฑฐ๊ธฐ์ ๋๊ธ์ ์ฌ๋ ธ๊ณ , ๋๊ฐ ์ด๋ฏธ ๊ทธ๊ฒ์ ๊ตฌ๋ ํ๋์ง ํ์คํ์ง ์์ต๋๋ค!)
@camlorn ๊ทธ๋ฌ๋ "rustfmt๋ ์ ์ ๋์ ์ฌ์ํ ์ฌ ์์ฑ์ ํ ๋ค์ ํค์๋๊ฐ๋ฉ๋๋ค"๊ฒฝ๋ก๋ฅผ ์ด ์ ์์ต๋๋ค. AKA๋ ์์ ์ฑ ๋ณด์ฅ์์ "๋ ๊ฐ์ง ๋ชจ๋์์ ์๋ํ๋๋ก ์์ฑ ๋ ์์๋ ์ถ๊ฐ ์ฃผ์์ด ์์ผ๋ฉด ๊นจ์ง์ง ์์ต๋๋ค."์ด์ค์ผ์ดํ ํด์น๋ฅผ ํ์ฉํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ถ๋ก ๋ณ๊ฒฝ์์ํ UFCS์ ์ ์ฌํ๊ฒ ๊ฐ์์ "์์ ํ ์ ๊ตํ ํํ์ ์ ์ฅ์"๋ชจ๋ธ์ ์ค๋๋ ์์๋ฅผ ๊ณ์ ์๋์ํฌ ์ ์์ต๋๋ค.
catch ๋ธ๋ก์ ๊ตฌ๋ฌธ์ด do { โฆ }
๋๋ ?{ โฆ }
๋ผ๋ ์๊ด ์์ต๋๋ค.
do
์๋ ์ด๋ฏธ ํค์๋๋ผ๋ ์ข์ ์์ฑ์ด ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ณผ๊ฑฐ์ ์ฌ์ฉ์ ๋ฉ์ถ์ง ์์์ง๋ง Haskell๊ณผ ๊ฐ์ do
-notation์ ํธ์ถํ๋ ๋ชจํธํ (๋น์ ์ ๊ด์ ์ ๋ฐ๋ผ) ์์ฑ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด๊ฒ์ ์ฌ์ฉ ์ฌ๋ก์์ ๋ค์ ๋ ๊ฐ๊น์ต๋๋ค.
๊ทธ๊ฒ์ ๋ํ ๋น์ทํ์ง๋ง ์ ์ ๋ ์๋ฐ ์คํฌ๋ฆฝํธ ์ ๋ค๋ฅด๊ฒ ์๋
์ด ์ ์์ ์ด๋ฏธ ๋ฒ ์ด ๋ธ๋ก์ ํํ์์ผ๋ก ์ฌ์ฉํ๋ Rust์๋ ๊ด๋ จ์ด ์์ต๋๋ค.
๋๋ ๋ ๋ค ๋๊ฐ์ ๋ณด์ด์ง๋ง ์์ ํ ๋ค๋ฅธ ์ผ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ํผ๋์ ์ง์ ํ์ต๋๋ค.
Haskell๊ณผ ์ ์ฌํ do-notation์ ํธ์ถํ๋ ๋ชจํธํ (๋น์ ์ ๊ด์ ์ ๋ฐ๋ผ) ์์ฑ์ด ์์ต๋๋ค.
@rpjohnst Result ๋ฐ Option์ ๋ชจ๋๋์ด๋ฏ๋ก ์ต์ํ ๊ฐ๋ ์ ์ผ๋ก ์ ์ฌํฉ๋๋ค. ๋ํ ์์ผ๋ก ๋ชจ๋ ๋ชจ๋๋๋ฅผ ์ง์ํ๋๋ก ํ์ฅํ๋ ค๋ฉด ํฌ์๋ ํธํ์ด ๊ฐ๋ฅํด์ผํฉ๋๋ค.
๋ง์ต๋๋ค. ๊ณผ๊ฑฐ์๋ ๋ชจ๋๋์ ๊ฐ๋
์ ์ผ๋ก ์ ์ฌํ ๊ฒ์ do
๋ฅผ ์ถ๊ฐํ๋ฉด ์์ ํ ์ง์ํ์ง ์์ผ๋ฉด ์ฌ๋๋ค์ ์ฌํ๊ฒ ํ ๊ฒ์ด๋ผ๋ ์ด์๊ฐ์์์ต๋๋ค.
๋์์, ์ ์ฒด do-notation๊ณผ ํฌ์๋ ํธํ์ด ๊ฐ๋ฅํ๋๋ก ๋ง๋ค ์ ์์ง๋ง ์ ์ฒด do-notation์ ์ถ๊ฐ ํด์๋ ์๋ฉ๋๋ค . if
/ while
/ for
/ loop
๋๋ break
/ continue
/์ ๊ฐ์ ์ ์ด ๊ตฌ์กฐ๋ก๋ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค. return
, catch
(๋๋์ด ๊ฒฝ์ฐ do
) ๋ธ๋ก ๋ด๋ถ ๋ฐ ์ ์ฒด ์์ ์ฌ์ฉํ ์ ์์ด์ผํฉ๋๋ค. (์ด๊ฒ์ ์ ์ฒด do-notation์ด ๊ณ ์ฐจ ํจ์ ์ธก๋ฉด์์ ์ ์๋๊ณ catch
๋ธ๋ก์ ๋ด์ฉ์ ์ผ๋ จ์ ์ค์ฒฉ ๋ ํด๋ก์ ์ ์ฑ์ฐ๋ฉด ๊ฐ์๊ธฐ ๋ชจ๋ ์ค๋จ ํ๋ฆ์ ์ ์ดํ๊ธฐ ๋๋ฌธ์
๋๋ค.)
๊ทธ๋์ ๊ฒฐ๊ตญ ์ด๋ฌํ ๋จ์ do
์ค์ ๋ก์๋ DO-ํ๊ธฐ์์ด ํ ํ๊ธฐ๋ฒ๊ณผ ๊ฐ์ ๋ฐ DO-ํ๊ธฐ๋ฒ์ด๋๊ธฐ ์ํด ์์ผ๋ก ์ข์ ๊ฒฝ๋ก ์๊ณ ์๋ค๋ ์ ์ด๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ Rust๊ฐ ์ด์จ๋ do
ํ๊ธฐ๋ฒ์ ์ป์ง ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ผ๋ก ์์ ํ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํผ๋์
๋๋ค.
@nikomatsakis , #
catch
ํค์๋๋ฅผ ๋ฌธ๋งฅ์ ๋ง๊ฒ ๋ง๋ค ์ ์์ง๋ง struct catch
์ด ๋ฒ์ ๋ด์ ์์ผ๋ฉด ๋นํ์ฑํํ๊ณ ์ง์ ์ค๋จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐํ ํ ์ ์์ต๋๊น?
์ด๊ฒ์ด ์ผ๋ง๋ ์ ์ ํ ์ง ํ์คํ์ง ์์ง๋ง ์ข
์ข
์ํ๋ ๊ฒฝ์ฐ return
๋ฅผ ์ฌ์ฉํ ๋ ํ์ฌ ๊ฐ๋ฅํ ์ค๋ฅ ๊ฐ์ด ์๋ ok๋ฅผ ์ค๋จํ๋ ค๋ ๊ฒฝ์ฐ๊ฐ ์๋ค๋ ์ ์์ ํด๊ฒฐํ ํ์๊ฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. _outer_ ok๋ฅผ ํตํด _inner_ ์ค๋ฅ๋ฅผ ์ค๋จํฉ๋๋ค. say ํจ์๊ฐ Option<Result<_,_>>
๋ฅผ ๋ฐํ ํ ๋์ ๊ฐ์ด ๋ฐ๋ณต์์์ ํํ ๋ณผ ์ ์์ต๋๋ค.
ํนํ ์ง๊ธ ๋น์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํ๋ก์ ํธ์ ๋งคํฌ๋ก๊ฐ ์์ต๋๋ค.
macro-rules! option_try {
( $expr:expr ) => {
match $expr {
Ok(x) => x,
Err(e) => return Some(Err(e.into())),
}
}
}
Iterator::next
๊ตฌํ ๋ด์์ ํธ์ถ ๋ ํจ์๊ฐ ์คํจ์ Some(Err(e))
์ ํจ๊ป ์ฆ์ ์ค๋จ๋์ด์ผํ๋ ๊ฒ์ ๋งค์ฐ ์ผ๋ฐ์ ์
๋๋ค. ์ด ๋งคํฌ๋ก๋ ์ผ๋ฐ ํจ์ ๋ณธ๋ฌธ ๋ด๋ถ์์ ์๋ํ์ง๋ง catch ๋ธ๋ก ๋ด๋ถ์์๋ ์๋ํ์ง ์์ต๋๋ค. catch๋ ๋ฒ์ฃผ ์ ์ผ๋ก return
๊ฐ์ ธ ์ค์ง ์๊ณ ํน์ํ ?
๊ตฌ๋ฌธ
๊ฒฐ๊ตญ ๋ ์ด๋ธ ๋ฐํ์ ์ ์ฒด catch
๋ธ๋ก ์์ด๋์ด๋ฅผ ์ค๋ณต๋๊ฒ ๋ง๋ค ๊ฒ์ด์ง๋ง ๊ทธ๋ ์ง ์์ต๋๊น?
# 41414๊ฐ ์๋ฃ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๊ตฐ๊ฐ OP๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๊น?
์
๋ฐ์ดํธ : RFC rust-lang / rfcs # 2388์ด ์ด์ ๋ณํฉ๋์์ผ๋ฏ๋ก catch { .. }
๋ try { .. }
๋ก ๋์ฒด๋ฉ๋๋ค.
์ด ๋๊ธ ๋ฐ๋ก ์์์๋ ์ถ์ ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ธ์.
์ด๊ฒ์ด 2015 ๋
ํ์์ ์๋ฏธํ๋ ๋ฐ๋ do catch { .. }
๊ตฌ๋ฌธ์ด ์ฌ์ ํ ์์ ํ ๊ณผ์ ์์๋ ๊ฒ์
๋๊น? ์๋๋ฉด 2018 ๋
ํ ์ด์์์ try { .. }
๋ฅผ ํตํด์๋ง ์ญ์ ๋๊ณ ์ง์๋ฉ๋๊น?
@ Nemo157 ํ์.
ํ์ฌ ์ ์์์ try ... catch ...
๋ ๊ฐ ๋ฌธ์ด ์์ต๋๊น? ๊ทธ๋ ๋ค๋ฉด ์๋ฏธ๋ฅผ ์ป์ง ๋ชปํฉ๋๋ค.
์ด์จ๋ ,์ด ์ ์์ด ๋จ์ง ํ๋น์ ๊ดํ ๊ฒ์ด๋ผ๋ฉด ๋๋ ๊ทธ๊ฒ์ ๋ํด ๋ฉ์ง๋ค. ์ฆ, catch
๋ธ๋ก์ ?
์ฐ์ฐ์๊ฐ ์ข
๋ฃํ๋ ์์น๋ฅผ ๋ณ๊ฒฝํฉ๋๊น?
๋ชจ๋ ํ์ธ๋์ด ์๋จ ๊ฒ์๋ฌผ์ ํ์๋์ด ์์ผ๋ฏ๋ก ์ธ์ ์์ผ๋ก ๋์๊ฐ๊น์? ์ฌ์ ํ ํด๊ฒฐ๋์ง ์์ ๋ฌธ์ ๊ฐ์๋ ๊ฒฝ์ฐ ์ ํ์ธ๋์ ์ถ๊ฐํด์ผํฉ๋๋ค.
๊ธฐ๋ก๋์ง ์์ ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ์ด ๋ง์ด ๋จ์์์ ๊ฒ์
๋๋ค.
์๋ฅผ ๋ค์ด ok-wrapping ๋์์ด lang ํ ๋ด์์ ํด๊ฒฐ๋์ง ์๊ณ Try
์ ๋์์ธ์ด ์๋ฃ๋์ง ์๋ ๋ฑ์ ์์
์ด ์งํ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์ ์ฉ์ฑ๋ณด๋ค ์ค๋๋์์ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฏ๋ก์ด ๋ฌธ์ ๋ฅผ ๋ ๋ง์ ๋ชฉํ๋ฅผ ๊ฐ์ง ์ฌ๋ฌ ๋ฌธ์ ๋ก ๋ถํ ํด์ผํฉ๋๋ค.
ํ ..์ด ์ง๋ฌธ์ด ๊ธฐ๋ก๋์ง ์์๋ค๋ ๊ฒ์ด ์ ๋ฅผ ๊ดด๋กญ ํ๋๋ค.
@ mark-im ๊ทธ๋์ ๋ช ํํํ๊ธฐ ์ํด ๊ทธ๋ค์ด ์ด๋๊ฐ์ ์์๋ค๊ณ ์๊ฐํฉ๋๋ค; ๊ทธ๋ฌ๋ ํ ์์น์๋ ์์ต๋๋ค. ๋ค์ํ RFC ๋ฐ ๋ฌธ์ ๋ฑ์ ์ฝ๊ฐ ํฉ์ด์ ธ์๋ atm์ด๋ฏ๋ก ์ ์ ํ ์์น์ ๊ธฐ๋กํด์ผํฉ๋๋ค.
์ง์ ํน์ฑ์ ๋์์ธ์ https://github.com/rust-lang/rust/issues/42327 ์์ ์ถ์ ๋ฉ๋๋ค
๊ทธ๋์ ์ ๋ ์ฌ๊ธฐ์ try{}
๋ง ๋จ์๊ณ , ์ ๊ฐ ์๋ ์ ์ผํ ๋ถ์ผ์น๋ RFC์์ ํด๊ฒฐ๋๊ณ ์์์ ์ธ๊ธ ํ ๋ฌธ์ ์ค ํ๋์์ ์ฌํ์ธ ๋ ๊ฒ์
๋๋ค. ๊ทธ๋๋ ๋๋ ทํ ์ถ์ ๋ฌธ์ ๊ฐ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
์์ง ์ํํด์ผํ๋ ๋ณด๋ฅ์ค์ธ ๊ตฌํ ์์ ์ ๋ํ ํ์ธ๋์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
๋๋ @joshtriplettํฉ๋๋ค (์์ ์ธ๊ธ OK-ํฌ์ฅ์ ๋ํ ์ฐ๋ ค๊ฐ ์์๋ค ์๊ณ @scottmcm try
RFC๋ฅผ) ๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ ์ ํ ํ ๊ฒ break
์ ์ด๊ธฐ ์์ ํ์ try { .. }
๊ทธ๋ ๊ฒ loop { try { break } }
๋ฑ์ ํ ์ ์์ต๋๋ค.
์ผํธ๋ฆด
loop { try { break } }
ํ ์ ์๋๋ก
์ง๊ธ ๋น์ฅ์ ๋น ๋ฃจํ ๋ธ๋ก์์ break
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์ ํํฉ๋๋ค. break
๋ ๋ฃจํ์์๋ง ์ฌ์ฉํด์ผํฉ๋๋ค. try
๋ธ๋ก์ ์ผ์ฐ ๋ ๋๋ ค๋ฉด ํ์ค ๋ฐฉ์์ Err(e)?
์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ด๊ธฐ ์์ด ํญ์ "๋น์ ์์ ์ธ"ํต์ ๊ฒฝ๋ก์ ์๋๋ก ๊ฐ์ ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ด ์ ์์ ํ์๋ ์ฝ๋๊ฐ ํ์ฉ๋์ด์ผํ๋ฉฐ try
๋ ๋๋ ๊ฒ์ด ์๋๋ผ loop
๊นจ์ผํฉ๋๋ค.
์ฆ๊ฐ์ ์ธ ์ด์ ์ break
๊ฐ ํ์ ๋ ๋ ๋ฃจํ์์ ์ค๋จ๋๋ค๋ ๊ฒ์ ์ ์ ์์ผ๋ฉฐ ํญ์ continue
๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋ํ try
๋ด๋ถ์์ loop
try
๋ธ๋ก์ ์ฌ์ฉํ๊ณ ๋ฃจํ๋ฅผ ์ข
๋ฃํ๋ ค๋ ๊ฒฝ์ฐ ์ค๋จ ์ ์ ๋ ์ด๋ธ์ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
@Centril ํค์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
break
์ ๊ดํด์๋ ๊ฐ์ธ์ ์ผ๋ก try
๋ break
์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ณ ํฌํจํ๋ ๋ฃจํ๋ฅผ ํต๊ณผํ๋ค๊ณ ๊ฐ๋จํ ๋งํ๋ฉด ๊ด์ฐฎ์ ๊ฒ์
๋๋ค. break
์ด try
์ (๊ณผ) ์ํธ ์์ฉํ๋ ๊ฒ์ ์ ํ ์ํ์ง ์์ต๋๋ค.
Ok
-wrapping์ ๊ฒฝ์ฐ ์, try
์ (๋ฅผ) ์์ ํํ๊ธฐ ์ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ถ์ต๋๋ค.
@centril ์, ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋ฌธ์ ๋ฅผ ์ ๊ธฐ ๋ค์ ์ฌ์์ด ๊ฒ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. RFC ๋ ๊ทธ๊ฒ์ ๊ฐ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ๊ทธ๊ฒ ์์ด ๊ตฌํ๋์์ง๋ง ์๋ ์๋๋ _again_ ์ทจํด์ก๊ณ ๊ตฌํ์ RFC๋ฅผ ๋ฐ๋ฅด๋๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ๊ทธ๋์ ์ ์ ํฐ ์ง๋ฌธ์ ์ค์ํ ์ฌ์ค์ด ๋ณ๊ฒฝ๋์๋์ง ์ฌ๋ถ์ ๋๋ค. ํนํ ์ด๊ฒ์ด RFC + IRLO์์ ๋ ผ์ํ ๊ฒ ์ค ๊ฐ์ฅ ์๋๋ฌ์ด ์ฃผ์ ์ค ํ๋๋ผ๋ ์ ์ ๊ฐ์ํ ๋.
@scottmcm ๋ฌผ๋ก ์์๋ค์ํผ, ์ ๋ Ok
-wrapping;) ์ ์ง์ ๋์ํ๋ฉฐ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ์ณ์์ง ํ์คํ์ง ์์ ๊ฒ์ ๋ํด ์ธ๊ธํ๊ณ ์ถ์์ต๋๋ค.
๋ณธ์ง์ ์ผ๋ก ๋ด๊ฐ ๊ฐ์ง ์ํฉ์ GUI ํ๋ ์ ์ํฌ์ ์ฝ๋ฐฑ์
๋๋ค. Option
๋๋ Result
๋ฅผ ๋ฐํํ๋ ๋์ UpdateScreen
๋ฅผ ๋ฐํํด์ผํฉ๋๋ค. ์
๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค. ์ข
์ข
๋๋ ๋ก๊น
์ด ์ ํ ํ์ํ์ง ์์ผ๋ฉฐ (๋ชจ๋ ์ฌ์ํ ์ค๋ฅ์ ๋ก๊ทธ์จํ๋ ๊ฒ์ ์ค์ฉ์ ์ด์ง ์์) ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด UpdateScreen::DontRedraw
๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ์ฌ ?
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผํฉ๋๋ค.
let thing = match fs::read(path) {
Ok(o) => o,
Err(_) => return UpdateScreen::DontRedraw,
};
Try ์ฐ์ฐ์๋ฅผ ํตํด Result::Err
์์ UpdateScreen::DontRedraw
๋ก ๋ณํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋งค์ฐ ์ง๋ฃจํด์ง๋๋ค. ์ข
์ข
์คํจ ํ ์์๋ ํด์ ๋งต์์ ๊ฐ๋จํ ์กฐํ๋ฅผํฉ๋๋ค (์ค๋ฅ๊ฐ ์๋๋๋ค. )-๋๋ฌด ์์ฃผ ํ๋์ ์ฝ๋ฐฑ์์ ?
์ฐ์ฐ์๋ฅผ 5-10 ๋ฒ ์ฌ์ฉํ์ต๋๋ค. ์์์ ์ฐ๊ธฐ์ ๋งค์ฐ ์์ธํ๊ธฐ ๋๋ฌธ์, ๋ด ํ์ฌ์ ์๋ฃจ์
์ด๋ค impl From<Result<T>> for UpdateScreen
๊ณผ ๊ฐ์ด , ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋ฐฑ์์ ๋ด๋ถ ํจ์๋ฅผ ์ฌ์ฉ
fn callback(data: &mut State) -> UpdateScreen {
fn callback_inner(data: &mut State) -> Option<()> {
let file_contents = fs::read_to_string(data.path).ok()?;
data.loaded_file = Some(file_contents);
Some(())
}
callback_inner(data).into()
}
์ฝ๋ฐฑ์ด ํจ์ ํฌ์ธํฐ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ -> impl Into<UpdateScreen>
์ฌ์ฉํ ์ ์์ต๋๋ค (์ด๋ค ์ด์ ๋ก impl
๋ฐํํ๋ ๊ฒ์ ํ์ฌ ํจ์ ํฌ์ธํฐ์ ๋ํด ํ์ฉ๋์ง ์์ต๋๋ค). ๊ทธ๋์ ์ ๊ฐ Try
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ด๋ถ ํจ์ ํธ๋ฆญ์ ์ํํ๋ ๊ฒ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค.
impl<T> Try<Result<T>> for UpdateScreen {
fn try(original: Result<T>) -> Try<T, UpdateScreen> {
match original {
Ok(o) => Try::DontReturn(o),
Err(_) => Try::Return(UpdateScreen::DontRedraw),
}
}
}
fn callback(data: &mut State) -> UpdateScreen {
// On any Result::Err, convert to an UpdateScreeen::DontRedraw and return
let file_contents = fs::read_to_string(data.path)?;
data.loaded_file = Some(file_contents);
UpdateScreen::Redraw
}
ํ์ฌ ์ ์์์ ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ง ํ์คํ์ง ์์ผ๋ฉฐ ๊ณ ๋ คํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ต๋๋ค. ์ปค์คํ Try ์ฐ์ฐ์๊ฐ ์ด์ ๊ฐ์ ๊ฒ์ ์ง์ํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
ํธ์งํ๋ค:
์ ๊ฐ ์ค์๋ฅผ.
์ด ๊ฒ์๋ฌผ ๋ฌด์
์ ํ ์ถ๋ก ์ผ๋ก ๋ ์ ์๋ ํ ์ ์์ต๋๊น? ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์คํจํฉ๋๋ค.
fn test_try(a: u32, b: u32) {
let div = if b != 0 {
Some(a / b)
} else {
None
};
let x // : Option<_> // why is this type annotation necessary
= try { div? + 1 };
println!("{:?}", x);
}
try ๋ธ๋ก ๋์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ค์ ์์ฑํ๋ฉด (๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์์ ๋์จํ ์๋ ๋ํ),
fn test_closure(a: u32, b: u32) {
let div = if b != 0 {
Some(a / b)
} else {
None
};
let x = (|| (div? + 1).into())();
println!("{:?}", x);
}
์ ํ ์ด๋ ธํ ์ด์ ์ด ํ์ํ์ง ์์ง๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ํํด์ผํฉ๋๋ค.
@KrishnaSannasi ํด๋ก์ ๊ธฐ๋ฐ ์์ ์๋ Into
๊ฐ ์ถ๋ ฅ์ ์ ํํ์ง ์๊ณ ๋์ค์ ์ํํ๋ ๊ณณ์์๋ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ํ ์ถ๋ก ์คํจ ( playground )๋ ์์ต๋๋ค.
์ด๊ฒ์ try
๋ธ๋ก์ด ์๋ Try
ํธ๋ ์ด ํธ์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. Into
์ ์ ์ฌํ๊ฒ ์
๋ ฅ์์ ์ถ๋ ฅ์ผ๋ก ์ด๋ค ์ ํ ์ ๋ณด๋ ์ ํํ์ง ์์ต๋๋ค. ์ถ๋ ฅ ์ ํ์ ๋์ค์ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ํ ์ ์์ด์ผํฉ๋๋ค. https://github.com/rust-lang/rust/issues/42327 ์ ํน์ฑ์ ๋ํ _ ๋ง์ _์ ํ ๋ก ์ด ์์ต๋๋ค. ์์ง ์ฝ์ง ์์๊ธฐ ๋๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์์๋ ์ ์์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
ํํ
์, ์ฝ๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ๋ง์ง๋ง ์๊ฐ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ํ ์คํธํ์ง ์์์ต๋๋ค. ๋ด ์๋ชป์ด์ผ.
try ๋ธ๋ก ์์ ํ์์ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์์ต๋๊น? ๊ทธ๊ฒ์ ๋ด๊ฐ ์ผ๊ฐ์์ ํ์ํ ์ ์ผํ ๊ธฐ๋ฅ์ ๋๋ค : D
์ ๋ฆฌ๊ทธ ๋๋ฅด
์ผ๋จ ์ด๊ฒ์ด ๋๋๋ฉด ์์ ๋ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
๋ธ๋ก try {} catch (๋๋ ๊ธฐํ ํ์ ID)๋ฅผ ์ฌ์ฉํ์ฌ ๋ฏธ๋๋ฅผ ์ํด ๋์์ธ ๊ณต๊ฐ์ ์ด์ด๋๊ณ ๋์ ๋งค์น๋ก ์ํ๋ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋๋ค.
ํ์ฌ ๊ธฐ๋ฅ์ ํ์ฉํ๋ฉด์ ๋ฏธ๋๋ฅผ ์ํด ๋์์ธ ๊ณต๊ฐ์ ์ด์ด ๋ ์์๋ ๊ฐ๋ฅ์ฑ์ ํ์ฉํ๋ ์ค๊ฐ ๋์์ธ์ด ์์ต๋๊น (๋ฐ๋ผ์ ๊ฒฐ๊ตญ catch
๋ธ๋ก)?
๋ด๊ฐ ๋ง๋ PR์ ์ด์จ๋ ๊ทธ ์์๋ฅผ ์ฒดํฌํด์ผํฉ๋๋ค. CC @nikomatsakis
๋๋ ์ด์ ์ฒ์์ผ๋ก ์ด๊ฒ์ ์ฌ์ฉํด ๋ณด์๊ณ ์ด๊ฒ์ด ์กฐ๊ธ ๋๋์ต๋๋ค.
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: () = try {
Err(())?
}?;
Ok(x)
}
๋๋ฌธ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค
error[E0284]: type annotations required: cannot resolve `<_ as std::ops::Try>::Ok == _`
์ฐจ๋ผ๋ฆฌ ๋๋ํด์ผํ๋ค
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: Result<(), ()> = try {
Err(())?
};
let x = x?;
Ok(x)
}
๋์ .
์ฒ์์๋ ํผ๋ ์ค๋ฌ์ ์ผ๋ฏ๋ก ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ --explain
?
์ฒซ ๋ฒ์งธ ์์์ ๋ฌผ์ํ๋ฅผ ์ฝ๊ฐ ์๋๋ก ์ด๋ํ๋ฉด
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let x: () = try {
Err(())?
};
Ok(x?)
}
๋ ๋์ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ด ์ค๋ฅ๋ Rust๊ฐ try { ... }
๋ฅผ ํด๊ฒฐํ ์ ํ์ ๊ฒฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ์ด ์ ํ์ ํด๊ฒฐํ ์ ์๊ธฐ ๋๋ฌธ์ <_ as Try>::Ok
์ ํ์ด ๋ฌด์์ธ์ง ์ ์ ์์ผ๋ฏ๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. (๋๋ฌธ์ ?
์คํผ๋ ์ดํฐ๊ฐ ์ธ๋ฉ Try
์ ํ๊ณผ ๋ฐฐ๋ฉด ์ ๊ณต Try::Ok
์ ํ). Rust๋ ์์ฒด์ ์ผ๋ก Try::Ok
์ ํ์ผ๋ก ์๋ ํ ์ ์์ต๋๋ค. Try
ํน์ฑ๊ณผ ํด๋น ํน์ฑ์ ๊ตฌํํ๋ ์ ํ์ ํตํด ํด๊ฒฐ๋์ด์ผํฉ๋๋ค. (ํ์ฌ ์ ํ ๊ฒ์ฌ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ์ ํ ์ฌํญ)
์ด ๊ธฐ๋ฅ์ ๋ํ ๋ชจ๋ ๊ฒ์ด ๊ตฌํ๋์์ต๋๋ค. ๋ง์ต๋๊น? ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด, ์์ ๋๊ธฐ ์ ์ ์ผ๋ง๋ ์ค๋ ์์๋ณด์์ผํ ๊น์?
๋๋ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ํ๋์ง ์ฌ๋ถ์ ๋ํ ์ด๋ฆฐ ์ง๋ฌธ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ํนํ ์ฌ๊ธฐ์ ์์ธ ์ธ์ด (try, catch)๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ๋ ผ์๊ฐ์์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ Rust๊ฐ ์์ธ์ ๊ฐ์ ๊ฒ์ ๊ฐ์ง๊ณ ์๋ค๋ ์ธ์์ ์ฃผ๋ ค๋ ์๋๋ฅผ ๊ฐ๋ ฅํ ๋ฐ๋ํฉ๋๋ค. ํนํ catch
๋ผ๋ ๋จ์ด์ ์ฌ์ฉ์ ์์ธ๊ฐ์๋ ์ธ์ด์์ ์จ ๋ชจ๋ ์ฌ๋์ด ์ด๊ฒ์ด ํ๋ฆฐ๋ค ๊ณ ๊ฐ์ ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ฐ๋ฅด์น๋ ๊ฒ์ด ํผ๋์ค๋ฝ๊ณ ๊ณ ํต ์ค๋ฌ์ธ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
ํนํ ์ฌ๊ธฐ์ ์์ธ ์ธ์ด (try, catch)๋ฅผ ์ฌ์ฉํ ๊ฒ์ธ์ง์ ๋ํ ๋ ผ์๊ฐ์์์ต๋๋ค.
๋๋ https://github.com/rust-lang/rfcs/pull/2388์ด try
์ด๋ฆ์ด ํ์ฉ๋๋์ง ์ฌ๋ถ๋ฅผ ํ์คํ ๊ฒฐ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ๊ณต๊ฐ ๋ ์ง๋ฌธ์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ Try
ํน์ฑ๊ณผ Ok
-wrapping์ ์ ์๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
Ok
๋ํ์ ์๋ RFC์์ ์ด๋ฏธ ๊ฒฐ์ ๋ ํ ๊ตฌํ ์ค์ ์ ๊ฑฐ๋๊ณ ๋์ค์ ๋ค์ ์ถ๊ฐ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ด๋ฆฐ ์ง๋ฌธ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@rpjohnst ๊ธ์์, ์๋ RFC์ ๊ฒฐ์ ์ ๋์ํ์ง ์๋ Josh์ ๋ํ์
๋๋ค ... :) ๊ทธ๊ฒ์ ์ ์๊ฒ ํด๊ฒฐ ๋ ๋ฌธ์ https://github.com/rust-lang/rust/issues/31436#issuecomment -427096703, https://github.com/rust-lang/rust/issues/31436#issuecomment -427252202 ๋ฐ https : //๋ฅผ ์ฐธ์กฐ ํ์ธ์ . github.com/rust-lang/rust/issues/31436#issuecomment -437129491. ์ด์จ๋ ... ๋ด ์๊ฒฌ์ ์์ ์ "์์ธ ์ธ์ด"๋ก์ try
๊ฐ ํด๊ฒฐ ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์
๋๋ค.
์์ฐ, ์ธ์ ์ด๋ฐ ์ผ์ด ์์๋์? ๋ง์ง๋ง์ผ๋ก ๊ธฐ์ต ๋๋ ๊ฒ์ ๋ด๋ถ์ ๋ํ ํ ๋ก ์ด์์ต๋๋ค. ๋๋ Ok-wrapping์ ๋งค์ฐ ๋ฐ๋ํฉ๋๋ค.
์ผ์ผ. ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ๋ฏฟ์ ์ ์์ต๋๋ค. Ok
๋ฉํ์ ๋๋ฌด ๋์ฐํฉ๋๋ค (ํจ์์ ๋ชจ๋ ๋ฐํ ํํ์์ด ํจ์์ ๋ฐํ ์ ํ์ด์ด์ผํ๋ค๋ ๋งค์ฐ ํ๋ช
ํ ์ง๊ด์ ๊นจ๋จ๋ฆฝ๋๋ค). ๋ค, ํ์คํ @ mark-im๊ณผ ํจ๊ปํฉ๋๋ค. Josh์ ์๊ฒฌ ๋ถ์ผ์น๊ฐ์ด ๋ฌธ์ ๋ฅผ ๊ณต๊ฐ ๋ ๋ฌธ์ ๋ก ์ ์งํ๊ณ ๋ ๋ง์ ํ ๋ก ์ ํ ์์์๋งํผ ์ถฉ๋ถํ๊ฐ์? ํ์์ด ์๋๋ผ๋ ์๋ฏธ๊ฐ ์๋๋ผ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
Ok
RFC 243์ ์ ์๋ก -wrapping (๋ฌธ์๋ก ์ ์ ๋ ?
์ด ์ธ์ ์ผ์ด ๋ฌ๋์ง ๊ถ๊ธํด ๊ฒฝ์ฐ, ์ด์ ์๊ฐ) ํจ์ ๋ฐํ ์ '์ ํ์ ๋ํ๋์ง ๋ณ๊ฒฝ ์๋ฌด๊ฒ๋ ์์ต๋๋ค. ์ด๊ฒ์ด RFC 243์ด ์ ์ํ ๋ฐฉ๋ฒ์
๋๋ค : https://github.com/rust-lang/rfcs/blob/master/text/0243-trait-based-exception-handling.md#catch -expressions
์ด RFC๋
?
์ฐ์ฐ์๋ฅผ "๋ฒ์ ์ง์ "ํ๋ ๋ฐ ์ฌ์ฉ๋๋catch {..}
ํํ์ ์์๋ ๋์ ํฉ๋๋ค.catch
์ฐ์ฐ์๋ ๊ด๋ จ ๋ธ๋ก์ ์คํํฉ๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ๊ฒฐ๊ณผ๋Ok(v)
์ด๋ฉฐ ์ฌ๊ธฐ์v
๋ ๋ธ๋ก์ ๊ฐ์ ๋๋ค. ๊ทธ๋ ์ง ์๊ณ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๊ฒฐ๊ณผ๋Err(e)
์ ๋๋ค.
catch { foo()? }
๋ ๋ณธ์ง์ ์ผ๋กfoo()
์ ๋์ผํฉ๋๋ค.
์ฆ, T
์ ํ์ ๋ธ๋ก์ ๊ฐ์ ธ์ ๋ฌด์กฐ๊ฑด ๋ํํ์ฌ Result<T, _>
์ ํ์ ๊ฐ์ ์์ฑํฉ๋๋ค. ๋ธ๋ก์์๋ return
๋ฌธ์ ์์ ํ ์ํฅ์๋ฐ์ง ์์ต๋๋ค. ๋ธ๋ก์ด ํจ์์ ๊ผฌ๋ฆฌ ํํ์ ์ธ ๊ฒฝ์ฐ ํจ์๋ Result<T, _>
๋ฐํํด์ผํฉ๋๋ค.
์ฐ๋ น๋์ ๋ฐ๋ผ ์ผ๊ฐ์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์์ต๋๋ค : https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=88379a1607d952d4eae1d06394b50959. ์ด๊ฒ์ lang ํ์ด์ด ์ค๋ ๋์์ ๋ง์ ํ ๋ก ์ ํ ํ ์ํ๋์์ผ๋ฉฐ ๋ค์ ์ค๋ ๋์์ ์ฐ๊ฒฐ๋์์ต๋๋ค. rust-lang / rust # 41414 (์ด ๋ฌธ์ ์ ์๋จ์๋ ๋งํฌ๋์ด ์์ต๋๋ค).
2019 ๋ 5 ์ 28 ์ผ ์คํ 5:48:27 PDT์ Alexander Regueiro [email protected]์ด ์์ฑํ์ต๋๋ค.
์ผ์ผ. ์ด๋ฐ ์ผ์ด ์ผ์ด๋ฌ๋ค๋ ๊ฒ์ ๋ฏฟ์ ์ ์์ต๋๋ค.
Ok
ํฌ์ฅ์ด ๋๋ฌด ๋์ฐํฉ๋๋ค.
๋ชจ๋ ํํ์ ๋ฐํํ๋ ๋งค์ฐ ํ๋ช ํ ์ง๊ด์ ๊นจ๋จ๋ฆฝ๋๋ค.
ํจ์๋ ํจ์์ ๋ฐํ ์ ํ์ด์ด์ผํฉ๋๋ค). ๊ทธ๋, ํ์คํ
@ mark-im๊ณผ ํจ๊ป. ์กฐ์ฌ์ ์๊ฒฌ ์ฐจ์ด๊ฐ
๋ฌธ์ ๋ฅผ ์ด๊ณ ๊ทธ๊ฒ์ ๋ํด ๋ ๋ง์ ํ ๋ก ์ ์ป์ต๋๊น? ๊ธฐ๊บผ์ด ๊ทธ๋ฅผ ์ง์ํ๊ฒ ์ต๋๋ค
์ด ์ธ์์์ ํ์์ด ์๋๋ผ๋ ์๋ฏธ๊ฐ ์๋๋๋ค.
๊ฐ์ฌํฉ๋๋ค. ๋๋ ๋ ์์ ์ ์ํด์๋ง ์ด๊ฒ์ ๋์ํ์ง ์์ต๋๋ค. ๋๋ ๋ํ ๋ด๊ฐ ๋ณธ ๊ฒ๊ณผ ๊ฐ์ ์ ์ฅ์ ํํํ ์๋ง์ ์ฌ๋๋ค์ ๋ํํ๊ณ ์๋ค.
ํธ์ ๋ด์ ๊ฐ๊ธฐ
Ok
๋ฉํ์ด ๊ทธ๋ ๊ฒ ๋์ํ์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ฑฐ๋ ์ด์ ์ ์ค๋ช
๋ ๋งํฌ๋ฅผ ์ ๊ณต ํ ์ ์์ต๋๊น? ๋๋ ๋ณด๋ฌ ๊ฐ์ง๋ง ํผ์์ ์ผ๋ก๋ณด๊ธฐ์๋ ์๋ฌด๊ฒ๋ ๋ณด์ง ๋ชปํ๋ค. ๋๋ ์ด๊ฒ์ ๋ง์ด ์์ต๋๋ค (๋๋ ๋ชจ๋ ์์ ์ฒดํฌ๋ฅผ ๋ณด์๊ณ ํ ๋ฌ ๋์ ํ ๋ก ์ด ์์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ํด ๋ง ๊ทธ๋๋ก ์ธ๊ธํ์ต๋๋ค). ๊ทธ๋ฌ๋ ์ด์ ์ด ๋ง๋ฒ์ ๋ฅ์ง๋ฅผ ๊ฑท์ด ์ฐผ์ผ๋ฏ๋ก ๋๋ ๋
ผ์์ ๋ ์ ์ดํดํ๊ณ ์ถ์ต๋๋ค.
2019 ๋ 5 ์ 28 ์ผ ํ์์ผ ์คํ 03:40:47 -0700 Russell Johnston์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
Ok
๋ํ์ ์๋ RFC์์ ์ด๋ฏธ ๊ฒฐ์ ๋ ํ ๊ตฌํ ์ค์ ์ ๊ฑฐ๋๊ณ ๋์ค์ ๋ค์ ์ถ๊ฐ๋์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ์ด๋ฆฐ ์ง๋ฌธ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๋๋ ๋น์ ์ด ๋น์ ์์ ์ ์ง๋ฌธ์ ๋ถ๋ถ์ ์ผ๋ก ๋๋ตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ๋ชจ๋๋ฅผ ์๊ฐํ์ง ์๋๋ค
์๋ RFC ํ ๋ก ์ ์ฐธ์ฌํ ๋ด์ฉ์ ๊ฐ์ ํ์ด์ง์์์์ต๋๋ค. try
์ ๋์ ์ผ๋ก ๋ง์ ์ฌ๋๋ค์ด ์ํ์ง๋ง ํฉ์๊ฐ ์์์ต๋๋ค.
Ok-wrapping์ ์ํด.
2019 ๋ 5 ์ 28 ์ผ ํ์์ผ 03:44:46 PM -0700์ Mazdak Farrokhzad๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
์ด์จ๋ ... ๋ด ์๊ฒฌ์ ์์ ์ "์์ธ ์ธ์ด"๋ก์
try
๊ฐ ํด๊ฒฐ ๋ ๋ฌธ์ ๋ผ๋ ๊ฒ์ ๋๋ค.
์ค๋ช
ํ์๋ฉด "์์ธ"๋ผ๋ ์์ ๊ฐ ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํ์ง ์์ต๋๋ค.
try-fn ๋ฐ Ok-wrapping๊ณผ ๊ฐ์ ๋ง์ ์๋๋
์์ธ์ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง ๊ฐ์ง ์ธ์ด๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
ํ์ง๋ง try
์์ฒด๋ ๋ค๋ฅธ ๊ณณ์์ ?
๋ฅผ ์ก๋ ์๋จ์ผ๋ก
ํจ์ ๊ฒฝ๊ณ๋ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ๋ก ์ดํด๋ฉ๋๋ค.
2019 ๋ 5 ์ 28 ์ผ ํ์์ผ ์คํ 11:37:33 -0700์ Gabriel Smith๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
Ok
ํฌ์ฅ์ด ๊ทธ๋ ๊ฒ ๋ง์์ ๋ค์ง ์๋ ์ด์ ๋ฅผ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ช ๊ฐ์ง ์ด์ ์ค ํ๋ :
2019 ๋ 5 ์ 28 ์ผ ํ์์ผ ์คํ 05:48:27 -0700 Alexander Regueiro๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํจ์์ ๋ชจ๋ ๋ฐํ ํํ์์ด ํจ์์ ๋ฐํ ์ ํ์ด์ด์ผํ๋ค๋ ๋งค์ฐ ํ๋ช ํ ์ง๊ด์ ๊นจ๋จ๋ฆฝ๋๋ค.
์ด๊ฒ์ ์ฌ๋๋ค์ด ์ ํ ์งํฅ ์ถ๋ก ์ ์ฌ์ฉํ๋ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ ๊นจ๋จ๋ฆฝ๋๋ค.
๊ธฐ๋ฅ ๋ฐ ์ฝ๋ ๊ตฌ์กฐ์ ๋ํด.
๋๋ ํ์คํ ์ฌ๊ธฐ์ ๋ด ์๊ฐ์ด ์์ง๋ง ์ง๊ธ ๋น์ฅ์ด ์ฃผ์ ๋ฅผ ๋ค์ ์ด์ง ์๊ฒ ์ต๋๊น? ๊ตฌ๋ฌธ์ ๋ํด 500 ๊ฐ ์ด์์ ๊ฒ์๋ฌผ์ ๋ํ ๋ ผ์์ด ์์๊ธฐ ๋๋ฌธ์ ์ ์ ๋์ ์ง๋ขฐ๋ฅผ ํผํ๊ณ ์ถ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ๋ ผ์ํ๋ lang ํ์์ ์ฐจ๋จ ๋ ๊ฒฝ์ฐ "catch ๋ธ๋ก์ด ๊ฒฐ๊ณผ ๊ฐ์"๋ํ "ํด์ผํ๋์ง ํ์ธ (# 41414)"ํ์ธ๋์ ๋ค์ ์ ํ ์ทจ์ํด์ผํฉ๋๋ค (์ธ์ด ํ์์ ์ฐจ๋จ๋์๋ค๋ ์ฃผ์๊ณผ ํจ๊ป). ์ด ์ถ์ ๋ฌธ์ ๊ฐ ์ํ๋ฅผ ์๊ณ ์์ต๋๊น?
์ฃ์กํฉ๋๋ค. ์ ๋ ์๋ฌด๊ฒ๋ ๋ค์ ์ด์ง ์์ต๋๋ค. ์ถ์ ๋ฌธ์ ์์ ๊ฒฐ์ ๋ ๊ฒ์ผ๋ก ํ์๋ ๋ด์ฉ๊ณผ ๊ทธ ๋ฐ์์๊ธฐ + ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง ๋ค์ ์ค๋ช ํฉ๋๋ค.
@rpjohnst ์ ๋ณด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@yodaldevoid Josh๋ ๋ด ์๊ฐ์ ๊ฑฐ์ ์์ฝํ์ต๋๋ค.
๋๋ ๋ธ๋ก์ ๊ตญํ๋ ok-wrapping (ํจ์ ์ ํ์ ์ํฅ์์ฃผ๋ ๊ฒ๊ณผ๋ ๋ฐ๋๋ก)์ ๋ํด ์ฝ๊ฐ ๋ ๋ฐ๋ํ์ง๋ง ์ฌ์ ํ ๋์ ์ ๋ก๋ฅผ ์ค์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. Josh๊ฐ ๋งํ ๊ฒ์ฒ๋ผ "์์ธ์ ์์ ๊ฐ ๋งค๋ ฅ์ ์ด๋ผ๊ณ โโ์๊ฐํ์ง ์์ต๋๋ค."
@joshtriplett ์ ๋ณธ์ง์ ์ผ๋ก ๋ด ๊ฒฌํด๋ ์์ฝํ์ต๋๋ค. ๋ฌธ์ ๋ "์์ธ"์์ (๋ถ๋ช
ํ ํจ๋ + catch_unwind
๊ฐ ํจ์ฌ ๋ ๋ถ์์ ์)์ ์ ํ ๊ธฐ๋ฐ ์ถ๋ก ์ ์ ํฉ์ฑ์
๋๋ค. ๋ฒ์ ์ง์ ๋ฐ ์ ์ด ํ๋ฆ ๋ฉ์ปค๋์ฆ์ผ๋ก try
๋ธ๋ก๋ ๊ด์ฐฎ์ง ๋ง ๋ ๊ธ์ง์ ์ธ ์์ ์ ์๋๋๋ค.
์ข์์, ์ถฉ๋ถํ ๊ณตํํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ์ฒด ํ ๋ก ์ํ์ง ์๊ฒ ์ต๋๋ค. ์ ์ ๋๋๋ก ์์๋ฅผ ์ ํ ์ทจ์ํ๊ณ ์ด ์ค๋ ๋์ ์ธ๊ธ ๋ ๋ช ๊ฐ์ง ๊ทผ๊ฑฐ๋ฅผ ์ฌ์ฉํ์ฌ lang-team ํ ๋ก ์ ๋ค์ ๋ฃ์ผ์๊ฒ ์ต๋๊น? ์์ ํ๊ฐ ์๋๋ฅด์ง ์๋ ํ ๊ทธ๊ฒ์ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ ํ ์ฃผ์์ ๋ํ ๊ตฌ๋ฌธ์ด ํฉ์ ๋์์ต๋๊น? ๋๋ try { foo()?; bar()?; }.with_context(|_| failure::err_msg("foon' n' barn'")?;
๊ธฐ๋ํ๊ณ ์์๋๋ฐ, ์ด๋ ์ปดํ์ผ์ ์๊ฒฉ์ผ๋ก ๊ด์ฌ์ด์๋ error[E0282]: type annotations needed
.
๋๋ ์กฐ๊ธ ์ ์ ์ฃผ์์ ์ฝ์์ง๋ง (๊ทธ๋ฆฌ๊ณ github์ 300 ๊ฐ์ ์ฃผ์์ ๋ค์๋ก๋ํ๋ ๊ฒ์ ๋๋ฌด ์ง๋ฃจํฉ๋๋ค), Try::Ok
๋ฉํ์ด Ok
์ฌ์ฉํ ๋
ผ์์ ๊ดํ ๋๋ถ๋ถ์ ์์ (๋ชจ๋๋ ์๋๋๋ผ๋)๋ฅผ ๊ธฐ์ตํฉ๋๋ค. ์์ ์์ Option
Try
๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๊ณ ๋ คํ ๋, ์ด๊ฒ์ด ํ ๋ก ์ ์ด๋ ์ชฝ์์ ํ์ ์
์ฅ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ์๊ณ ์ถ์ต๋๋ค.
Rust๋ฅผ ์ฌ์ฉํ ๋๋ง๋ค "man, ๋๋ ์ ๋ง๋ก ์ฌ๊ธฐ์ try ๋ธ๋ก์ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์ข๊ฒ ๋ค"๋ผ๊ณ ์๊ฐํ์ง๋ง, ๊ทธ ์๊ฐ์ ์ฝ 30 %๋ Option
s์ try๋ฅผ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ์ ๋ Scala์์ ์ฌ์ฉํ๋๋ฐ, ์ผ๋ฐ์ ์ผ๋ก for
๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋๋์ ์ ์ฉํ์ง๋ง ์ฌ๊ธฐ์๋ try
์ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
๋ฐ๋ก ์ค๋, ์ ๋ json
ํฌ๋ ์ดํธ๋ฅผ ์ฌ์ฉํ๊ณ ์์๊ณ ์ต์
์ ๋ฐํํ๋ as_*
๋ฉ์๋๋ฅผ ๋
ธ์ถํฉ๋๋ค.
๋ ๊ฐ์ง ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ๋ด ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋๋ค.
match s {
"^=" => |a, b| try { a.as_str()?.starts_with(b.as_str()?) }.unwrap_or(false),
"$=" => |a, b| try { Some(a.as_str()?.ends_with(b.as_str()?)) }.unwrap_or(false),
// original
"$=" => |a, b| {
a.as_str()
.and_then(|a| b.as_str().map(|b| (a, b)))
.map(|(a, b)| a.starts_with(b))
.unwrap_or(false)
},
}
๋ฌธ๋งฅ ์ ๋ฐํ ์ ํ์ด Option
์ธ์ง Result
์ธ์ง ์ฌ๋ถ๋ ๋งค์ฐ ๋ช
ํํ๊ณ ์ฝ๋ ์ดํด๋ ฅ์ด์๋ ํ ์ค์ ๋ก ์ค์ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํฌ๋ช
ํ๊ฒ ์๋ฏธ๋ ๋ถ๋ช
ํฉ๋๋ค. "์ด ๋ ๊ฐ์ง๊ฐ ์ ํจํ์ง ํ์ธํ๊ณ ์์
์ ์ํํด์ผํฉ๋๋ค." ์ด ํจ์ ์ค ํ๋๋ฅผ ์ ํํด์ผํ๋ค๋ฉด ์ฒซ ๋ฒ์งธ๋ฅผ ์ ํํ๊ฒ ์ต๋๋ค. try
์ฒ๋ผ์ด ํจ์๊ฐ ๋ ํฐ ์ปจํ
์คํธ์ ํฌํจ๋์ด ์๋ค๊ณ ์๊ฐํ ๋ ์ดํด์ ์์ค์ด ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋๋ค. ํญ์.
๋ด๊ฐ ์ฒ์์ด ๊ธ์๋ณด๊ธฐ ์์ํ์ ๋ ๋๋ ๋ช
์์ ์ธ ๊ฒ์ด ๋ ๋ซ๊ฒ ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ Ok
๋ํ์ ๋ฐ๋ํ์ง๋ง ๊ทธ ์ดํ๋ก "๋๋ ์ฌ๊ธฐ์์ try ๋ธ๋ก์ ์ฌ์ฉํ ์ ์์ต๋๋ค. "๋ผ๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. Ok
-wrapping์ด ์ข์ต๋๋ค.
๋๋ ์๋ ๋ง์ง๋ง ๋ฌธ์ฅ์ด Try
์ ๊ตฌํํ๋ ์ ํ์ ๋ฐํํ๋ ํจ์ ์ธ ๊ฒฝ์ฐ Ok
๋ํ์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํ์ง๋ง ๊ตฌ๋ฌธ์ ์ฐจ์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
try {
fallible_fn()
}
try {
fallible_fn()?
}
์ด ๊ฒฝ์ฐ ๋ค์ Ok
-wrapping์ด ๋ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค. fallible_fn
๊ฐ Try
๋ฐํ ํจ์๋ผ๋ ๊ฒ์ ๋ถ๋ช
ํํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก๋ ๋ ๋ช
์ ์ ์
๋๋ค.
๋๋ ์ผ๋น์ด ์ด๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ ๋์์ ๋ง์ ๋ค๋ฅธ ์ฌ๋๋ค์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ @joshtriplett.
ํธ์ง : ๋๋ ์ธ์ฒด ๊ณตํ / ๋ ํด ๊ด์ ์์๋ง ์ด๊ฒ์๋ณด๊ณ ์๋ค๊ณ ์ธ๊ธํด์ผํฉ๋๋ค. ๋ ์ฌ์ด ์ถ๋ก ๊ณผ ๊ฐ์ ๊ตฌํ ์ธก๋ฉด์์ ํ๋๊ฐ ๋ค๋ฅธ ๊ฒ๋ณด๋ค ๊ธฐ์ ์ ์ฅ์ ์ด ๋ ๋ง์์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ค์ฒฉ ๋ Option
๊ตฌ๋ฌธ ๋ถ์์๋ try
๊ธฐํ๋ฅผ์ฃผ๊ณ ์ถ์์ต๋๋ค.
#![feature(try_blocks)]
struct Config {
log: Option<LogConfig>,
}
struct LogConfig {
level: Option<String>,
}
fn example(config: &Config) {
let x: &str = try { config.log?.level? }.unwrap_or("foo");
}
์ด๊ฒ์ ์คํจํฉ๋๋ค
error[E0282]: type annotations needed
--> src/lib.rs:12:19
|
12 | let x: &str = try { config.log?.level? }.unwrap_or("foo");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type
|
= note: type must be known at this point
๋ด๊ฐ ์ป์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ์
fn example(config: &Config) {
let x: Option<&str> = try { &**config.log.as_ref()?.level.as_ref()? };
let x = x.unwrap_or("foo");
}
as_ref
์ ๋งค์ฐ ์ ๊ฐ์
๋๋ค. ๋๋ Option::deref
์ด ์ฌ๊ธฐ์ ๋์์ด ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ป๊ฒ ๋ ์ธ๊ฐ ๊ณตํ (๋๋ ๊ด๋ จ ์์ด๋์ด)๊ณผ ์ผ์น ํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค.
์ฌ๋ฌ ์ค๋ ์ํ๊น์ต๋๋ค.
try
Result
๋ ์ ์ ๋ฆฌํฐ๋ด์ฒ๋ผ @shepmaster ์ ์ฒซ ๋ฒ์งธ ์๋๊ฐ Result<&str, NoneError>
์ถ๋ก ํ๋๋ก ํ ๊น์ ? ?
s์ ๋ํด ๋ณํ ํ ๊ณตํต ์ค๋ฅ ์ ํ์ ์ฐพ์ ์์๋ ๋๋จธ์ง ๋ฌธ์ ๋ ๋ฌด์์
๋๊น? (์ด๋๊ฐ์ ๋ํ ๋
ผ์๋ฅผ ๋์น ์ ์ด ์์ต๋๊น?)
@shepmaster ์ ํ ์ถ๋ก ์ ๋์ํฉ๋๋ค. ์ถฉ๋ถํ ์ฌ๋ฏธ์๊ฒ, ๊ทธ๋ฌ๋, ๋๋ ๋ค์ ์์งํ์ผ๋ก ์ ํํ ์ฝ๋๋ฅผ ์๋ try_
๊ตฌํ๊ณผ ์ ์๋ : https://github.com/norcalli/koption_macros/blob/4362fba8fa9b6c62fdaef4df30060234381141e7/src/lib.rs#L23
let x = try_! { config.log?.level? }.unwrap_or("foo".to_owned());
assert_eq!(x, "debug");
์ ์๋ํฉ๋๋ค.
๋ค์ ์์งํ
try_
๊ตฌํ
๋ค,ํ์ง๋ง ๋งคํฌ๋ก ํธ์ถ์ ๋ฐํ String
๊ฐ ์๋๋ผ &str
, ํ์ ์์ ๊ถ์. ์ฃผ๋ณ ์ฝ๋๋ฅผ ํ์ํ์ง ์์ง๋ง Config
์์ ๊ถ์ด ์๊ธฐ ๋๋ฌธ์ ์คํจํฉ๋๋ค.
fn example(config: &Config) {
let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
}
error[E0507]: cannot move out of captured variable in an `Fn` closure
--> src/lib.rs:20:21
|
19 | fn example(config: &Config) {
| ------ captured outer variable
20 | let x = try_! { config.log?.level? }.unwrap_or_else(|| String::from("foo"));
| ^^^^^^^^^^ cannot move out of captured variable in an `Fn` closure
๋ํ ๋ฌด์กฐ๊ฑด String
ํ ๋นํฉ๋๋ค. ์ด ์์์๋ ๋น ํจ์จ์ฑ์ ํผํ๊ธฐ ์ํด unwrap_or_else
๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ด async/await
๋ธ๋ก ์ด์ ์ ์์ ํ๋์ง ์์ ๊ฒ์ ์ ๊ฐ์
๋๋ค. IMO๋ ๋ ์ผ๊ด๋์์ ๊ฒ์
๋๋ค.
let fut = async try {
fut1().await?;
fut2().await?;
Ok(())
};
try
์์ด ์๋ํ๋๋ก ํ์ฉํ๋ ๋์ . ๊ทธ๋ฌ๋ ๋๋ ๊ทธ ๋ฐฐ๊ฐ ํญํด ํ ์ง ์ค๋๋์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Re : ์๋ ๋ํ, ์ง๊ธ์ async
๋ธ๋ก๊ณผ ์ผ์นํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. async
๋ธ๋ก์ Future
๊ตฌํํ๋ ์ต๋ช
์ ํ์ผ๋ก ์ผ์ข
์ "์๋ ๋ํ"์ ์ํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ try
๋ธ๋ก์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ ์กฐ๊ธฐ ์์ต์์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
๊ฐ์์ async try
๋ธ๋ก์ด ์๋ค๋ฉด ๋ ๋ฐฐ๋ก ํผ๋์ค๋ฌ์ ์ง ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ ๋ฅผ ์๋ ๋ํํด์ผํฉ๋๊น?
๋๋ ์ฐ๋ฆฌ๊ฐ ์๋ ํฌ์ฅ ์๋ฏธ์์ ์ผ๊ด์ฑ์ ๋ํ ๊ธฐํ๋ฅผ ์์ง ์์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ชจ๋ async
๋ธ๋ก ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค ?
, ๋ชจ๋ ์์ ์ ์ค๋ช
์๋ฅผ ์ํํด์ผํฉ๋๋ค Ok
-wrapping, ๋ชจ๋ ์ด๊ธฐ ๋ฐ ์ต์ข
์์ต์.
๋ฐ๋ฉด์ try
๋ธ๋ก์ ์๋ Ok
๋ฉํ๊ณผ ํจ๊ป ?
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๋ฅผ ๋ค์ด ์กฐ๊ธฐ ๋ฐํ ๊ธฐ๋ฅ (์๋ง๋ ๋ ์ด๋ธ ์ค๋จ)์ ๊ฐ์ ํ๋ "์กฐ๊ธฐ ๋ฐํ"์ ํฌํจ ํฉ๋๋ค. value . ๊ฐ์์ try ํจ์ ๋ ์ด๊ธฐ ๋ฐ ์ต์ข
์์ต ๋ชจ๋์์ ์๋ Ok
๋ฉํ์ ์ฝ๊ฒ ์ํ ํ ์ ์์ต๋๋ค.
๊ฐ์์ async try
๋ธ๋ก์ ๋จ์ํ ๋ ๊ฐ์ auto- Ok
-wrap๊ณผ auto- Future
-wrap์ ๊ธฐ๋ฅ์ ๊ฒฐํฉ ํ ์ ์์ต๋๋ค. (๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ตฌํ์ด ๋ถ๊ฐ๋ฅํ๋ฉฐ ์ด์จ๋ try async
๋ก ์์ฑ๋ฉ๋๋ค.)
๋ด๊ฐ ๋ณด๋ ๋ถ์ผ์น๋ async
๋ธ๋ก์ ํจ์๋ก ๋ณํฉํ๋ค๋ ๊ฒ์
๋๋ค. (์ด๊ฒ์ ๋ ์ ์์ RFC์ ๋ง์ง๋ง ์๊ฐ ๋ฐ๋์์ ์ผ์ด๋์ง ์์๋ค.)์ด ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค ๋ฌด์ return
์์ async
๋ธ๋ก, ๋ธ๋ก์ ์ข
๋ฃํ๋ ๋์ return
์์ try
๋ธ๋ก์ ํฌํจ ํจ์๋ฅผ ์ข
๋ฃํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ๋ค์ ์ ์ด๋ ๋ถ๋ฆฌ ๋ ์ํ์์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ, ์กฐ๊ธฐ ๋ฐํ ๋๋ ๋ ์ด๋ธ ์ค๋จ ๊ฐ์ด์๋ async
๋ธ๋ก์ ์ฌ์ฉํ๊ธฐ ํจ์ฌ ๋ ์ด๋ ค์ธ ๊ฒ์
๋๋ค.
์ด๊ฒ์ ์์ ํ๋ฅผ ๋ฉ์ถ๋ ๊ฒ์ด ์์ต๋๊น? ์๋๋ฉด ์์ง ์๋ฌด๋ ์๊ฐ์ ํ ์ ํ์ง ์์์ต๋๊น? ๊ทธ๋ ์ง ์์ผ๋ฉด ํ์ํ PR์ ๋ง๋๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค ๐
2019 ๋ 11 ์ 18 ์ผ ์ค์ 2:03:36 PST์ Kampfkarren [email protected]์ด ์์ฑํ์ต๋๋ค.
์ด๊ฒ์ ์์ ํ๋ฅผ ๋ฉ์ถ๊ฑฐ๋ ์๋ฌด๋
์์ง ํ ์๊ฐ์ด์ผ? ํ์ํ PR์ ๋ง๋๋ ๋ฐ ๊ด์ฌ์ด ์์ต๋๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด ๐>
>
->
๋น์ ์ด ๋ฉ์ ๋์๊ธฐ ๋๋ฌธ์๋ฐ์ ๊ฒ์ ๋๋ค.>
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.>
https://github.com/rust-lang/rust/issues/31436#issuecomment -554944079
์, ์์ ํ ์ฐจ๋จ์ ๋ Ok-wrapping ๊ฒฐ์ ์ ํตํด ์๋ํฉ๋๋ค. ์ด๋ป๊ฒ ์๋ํด์ผํ๋์ง์ ๋ํ ํฉ์๊ฐ์์ ๋๊น์ง ์์ ํ๋์ด์๋ ์๋ฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก Ok-wrapping์ ๋ฐ๋ํ์ง๋ง ์ฌํ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ด๋ ค์ธ ์ง ๊ถ๊ธํฉ๋๋ค. no-ok-wrapping forward๋ ok-wrapping๊ณผ ํธํ๋ฉ๋๊น?
Result<Result<T,E>>
์ ๋ชจํธํจ๊ณผ ๊ฐ์ ๊น๋ค๋ก์ด ๊ฒฝ์ฐ๋ฅผ ์์ํ ์ ์์ง๋ง ์ด๋ฌํ ๋ชจํธํ ๊ฒฝ์ฐ์๋ ๋ฉํ ์์์ผ๋ก ๋์๊ฐ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ๋ช
ํํ๊ฒ ํ์ธํ๊ธฐ ์ํด ๋ช
์ ์ ์ผ๋ก Ok-wrap ํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒ ๋์์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฐ ์ข
๋ฅ์ ๋ชจํธํจ์ด ๋๋ฌด ์์ฃผ ๋ํ๋ ๊ฒ์ผ๋ก ์์ํ์ง ์๊ธฐ ๋๋ฌธ์
๋๋ค ...
Ok
๊ฐ์์ด ์๋๋ผ Ok
-wrapping์ด๊ธฐ ๋๋ฌธ์ ๋ชจํธํจ์ด ์ ํ ์์ด์ผํฉ๋๋ค. try { ...; x }
์ป์ ๊ฒ์ด๋ค Ok(x)
๋งํผ ๋ช
ํํ๊ฒ ๊ฐ์ Ok({ ...; x })
.
@joshtriplett ๋ฏธํด๊ฒฐ์
๋๊น? ์ถ์ ๋ฌธ์ ์๋ https://github.com/rust-lang/rust/issues/41414๋ฅผ ์ธ์ฉํ์ฌ resolve whether catch blocks should "wrap" result value
์ด ์ ํ๋์ด ์์ต๋๋ค.
@rpjohnst ์ฃ์กํฉ๋๋ค. ๋ ๋ช
ํํด์ผํ์ต๋๋ค. ๋ด ๋ง์ Ok-wrapping์์ด ์ง๊ธ try
์์ ํํ๋ค๋ฉด ๋์ค์ ์ญ ํธํ ์ ์ผ๋ก ์ถ๊ฐ ๋ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
์ฆ, ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ฐ๋ฆฌ๊ฐ try
๋ธ๋ก์ ๊ฐ์ ธ์ผํ๋ค๋ ๋ฐ ๋์ํ์ง๋ง ๋ชจ๋ ์ฌ๋์ด catch
๋๋ ok-wrapping์ ๋์ํ๋ ๊ฒ์ ์๋๋๋ค. ํ์ง๋ง ๋๋ ๊ทธ๋ฌํ ํ ๋ก ์ด try
๋ฅผ ์ฐจ๋จํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค ...
@Kampfkarren ๋ค. ์์ ๋ํ๋์ด ๋ฌธ์ ์ ์งํ ์ํฉ์ ์์ธํ ์ค๋ช ํฉ๋๋ค. ๋ชจ๋ ์ฌ๋์๊ฒ ์์ ํ์์ํ์ง ์๊ณ ์กฐ๊ธฐ์ ํ์ธ๋์์ต๋๋ค. ํนํ @joshtriplett ์ ๋ค๋ฅธ ์ฌ๋๋ค (๋ ์์ ์ ํฌํจ)์ด ๊ณต์ ํ ์ฐ๋ ค๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
@ mark-im ์์ผ๋ก Ok-wrapping์ด ์ถ๊ฐ๋๋ ๊ฒ์ ์ ํํ ์ด๋ป๊ฒ ๋ณด์ญ๋๊น? ๋๋ ๊ทธ๊ฒ์ด ์ด๋ป๊ฒ ๋ ์ ์๋์ง ์์ ๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ง๋ง ๊ทธ๊ฒ์ ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ์ข์ ์๊ฐ์ธ์ง ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค ๊ณ ๋งํ๋ฉด์ ์ด๊ฒ์ ์๋์ ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ok-wrapping์์ด try
๋ธ๋ก์ ์์ ํ์ํฌ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด :
let x: Result<usize, E> = try { 3 }; // Error: expected Result, found usize
let x: Result<usize, E> = try { Ok(3) }; // Ok (no pun intended)
๋์ค์ Ok-wrapping์ด ์์ด์ผํ๋ค๋ ํฉ์์ ๋๋ฌํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ด์ ์๋ ์๋ํ์ง ์์๋ ์ผ๋ถ ์ฌ๋ก๋ฅผ ํ์ฉ ํ ์ ์์ต๋๋ค.
let x: Result<usize, E> = try { 3 }; // Ok
let x: Result<usize, E> = try { Ok(3) }; // Also Ok for backwards compat
let x: Result<Result<usize, E1>, E2> = try { Ok(3) }; // Ok(Ok(3))
let x: Result<Result<usize, E1>, E2> = try { Ok(Ok(3)) }; // Ok(Ok(3))
๋ฌธ์ ๋ ์ด๊ฒ์ด ์ด์ ์ ์์๋ ๋ฌด์ธ๊ฐ๋ฅผ ๋ชจํธํ๊ฒ ๋ง๋ค ์ ์๋์ง ์ฌ๋ถ์ ๋๋ค. ์๋ฅผ ๋ค๋ฉด :
let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...
๊ทธ๋๋ Ok-wrapping์ด ์ด๋ฏธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ ๊น์?
์ด์จ๋ ๋ด ์ง๊ฐ์ ๊ทธ๋ฐ ์ด์ํ ์ฌ๊ฑด์ด ๊ทธ๋ ๊ฒ ์์ฃผ ๋์ค์ง ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ค์ง ์ค์ํ์ง ์์ ์๋ ์๋ค๋ ๊ฒ์ ๋๋ค.
๋ฐํ ๋ ์ ํ์ด Result
๋๋ Option
๊ฒฝ์ฐ๋ฅผ ์ ์ธํ๊ณ Ok-wrapping์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ํ์ฉํ์ง๋ง ํ์ํ ๊ฒฝ์ฐ ์ ํํ ๊ฐ์ ์ง์ ํ ์ ์์ต๋๋ค.
// Ok-wrapped
let v: Result<i32, _> = try { 1 };
// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Ok(1) };
// not Ok-wrapped since the returned type is Result
let v: Result<i32, _> = try { Err("error") };
// Ok-wrapped
let v: Option<i32> = try { 1 };
// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { Some(1) };
// not Ok-wrapped since the returned type is Option
let v: Option<i32> = try { None };
Ok
-coercion ๋๋ ์ด๋ค ์ข
๋ฅ์ ๊ตฌ๋ฌธ ์ข
์ Ok
-wrapping (์์ ํ๋ฅผ ์ง์ํ๊ณ ๋์ค์ ๋์
ํด์ผํ๋ ์์
)์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋
์ฑ์ ๋งค์ฐ ์ข์ง ์์ต๋๋ค. i.rl.o (์ผ๋ฐ์ ์ผ๋ก ๊ตฌํ ๋ ๊ฐ๋จํ Ok
-wrapping์ ์คํดํ๋ ์ฌ๋๋ค์ ์ํด)์ ๋ํด ์ฌ๋ฌ ๋ฒ ๋ฐ๋ํ๋ ์ฃผ์ฅ์ด ๊ด๋ฒ์ํ๊ฒ ์ ๊ธฐ๋์์ต๋๋ค.
๋๋ ๊ฐ์ธ์ ์ผ๋ก ๊ตฌํ ๋๋๋ก Ok
-wrapping์ ๊ฐ๋ ฅํ ์ ํธํ์ง๋ง, ๋ฉํ์ด ์ด๋ ค์ด ์ํฉ์ ์ดํดํ๊ฒ ๋ง๋๋ ์ด๋ค ํํ์ ๊ฐ์์ด๋ ๊ตฌ๋ฌธ ์์กด์ฑ์ ๋ฐ๋ ํ ๊ฒ์
๋๋ค. Ok(...)
์ (๋) ๊ฐ์์ ์ธ์ง ์๋์ง๋ฅผ ์์ ๋ด์ผํ๋ ๋ชจ๋ ๊ณณ์์ ๋ฐ์ํฉ๋๋ค.
let x = try { Err(3) }; // If x: Result<Result<T1, usize>, usize>, then it is not clear if user meant Ok(Err(3)) or Err(3)...
๊ทธ๋๋ Ok-wrapping์ด ์ด๋ฏธ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํ ๊น์?
์๋, ๊ทธ๊ฒ์ ๋ถ๋ช
Ok(Err(3))
, Ok
-wrapping์ ๊ตฌ๋ฌธ์ด๋ ์ ํ์ ๋
๋ฆฝ์ ์ด๋ฉฐ, ๋ธ๋ก์ ์ถ๋ ฅ์ด Try::Ok
๋ณํ์์๋ ๋ชจ๋ ๊ฒ์ ๋ํํฉ๋๋ค.
@ mark-im ์์ ํ ํ ํฉ๋ฆฌ์ ์ผ๋ก ์ด๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ด๊ฐ Ok-wrapping์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ๋ง ํผ ๋์์ง๋ง, ๋น์ ์ด ๊ทธ๊ฒ์ ์ํ๋์ง ์๋์ง ์ถ์ธกํ๋ ค๊ณ ์๋ํ๋ ์ผ๊ด์ฑ์๋ Ok-wrapping์ ๋ ๋์ ๊ฒ์ ๋๋ค.
๋ด ์ฝ๋๋ฒ ์ด์ค์์ ๋ง์ ์ ํ์ ๊ฐ์ ๋ค๋ฃจ๊ณ ์์ผ๋ฏ๋ก ์ค๋ ์ ์ ๋งคํฌ๋ก์ ๊ฐ์ ์์ฒด try ๋ธ๋ก์ ๋์ ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฐ ์๊ฐ ํ ๋ Ok-wrapping์ด ์๊ฑฐ๋์๋ ๋ค์ํ ๋ณํ์ด ์์๋๋ฐ Ok-wrapping ๋ฒ์ ์ ํจ์ฌ ๋ ์ธ์ฒด ๊ณตํ์ ์ธ ๊ฒ์ผ๋ก ํ๋ช ๋์ด ์ ๊ฐ ์ฌ์ฉํ๊ฒ ๋ ์ ์ผํ ๋งคํฌ๋ก์ ๋๋ค.
์์ ํด์ผ ํ ์ ํ์ ๊ฐ์ด ๋ง๊ณ ๋๋ถ๋ถ ์ซ์์ด๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ด ๋ง์ต๋๋ค.
let c = try { 2 * a? + b? };
Ok-wrapping์ด ์์ผ๋ฉด ์ค์ try ๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ด ์์ ์ ๋งคํฌ๋ก์ ๋จธ๋ฌด๋ฅผ ์์์ ์ ๋๋ก ์ธ์ฒด ๊ณตํ์ ์ด์ง ์์ต๋๋ค.
์ด ์ถ์ ๋ฌธ์ ์ ์ ์ ๊น์ ์ญ์ฌ, ?
์ฐ์ฐ์์์ ์๋์ ์ ๊ฐ์ค๋ฌ์ด ์ถฉ๋ ๋ฐ Ok
-wrapping ๋ฌธ์ ์ ๋ํ ์ฅ์ ๋ฌผ์ ๊ฐ์ํ ๋์ด ๋ฌธ์ ๋ฅผ ์์ ํ ์ข
๋ฃํ๊ณ try
๋ณด๋ด๋ ๊ฒ์ด ์ข์ต๋๋ค.
Ok-wrapping์ด ์์ผ๋ฉด ์ธ์ฒด ๊ณตํ์
๊ทธ๊ฒ์ด ๋์ ํ ์ ํํ ๋น์ธ๊ฐ ๊ณตํ์ ์์์ ๋ํด ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
Ok-wrapping์ด ์์ผ๋ฉด ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
let c = try { Ok(2 * a? + b?) };
์ ์๊ฐ์๋ ๊ฝค ์ข์ต๋๋ค.
๋ด ๋ง์, ์ด๋ฐ ์์ ์์ ๋ก๋ ๊ณผ์์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง, ๋ ๋ง์ ์ฝ๋๊ฐ try
๋ธ๋ก์ด ๋ ๋ฏธ์น๋ ์ํฅ์ด ํฌํจ Ok(...)
์์ธ ๋ํผ.
@CreepySkeleton ์ ์๊ฒฌ์ try
๋ธ๋ก์ด์ด๋ฅผ ์ํํ์ง ์๋ ๊ฒฝ์ฐ Ok
-wrapping์ ์๋ฎฌ๋ ์ดํธํ๋ ๋งคํฌ๋ก๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋งค์ฐ ์ฝ์ต๋๋ค (๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๋ ์ด ์์ ๋งคํฌ๋ก์ ํ์ค ์์), ๊ทธ ๋ฐ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
Try
ํน์ฑ์ด ๋ถ์์ ํ ๋์์๋ ํด๋น ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์? ์ด์จ๋ ๊ทธ๊ฒ์ด ์์ ๋๋ฉด (๊ฐ์ค ์ ์ผ๋ก ๋ฉ์ง ์์ ๋ฏธ๋์) ๋งค์ฐ ๊ฐ๋ฅํ ๊ฒ์ ๋๋ค.
@ Nemo157 try
๋ธ๋ก๋ ํ์ฌ ์ผ๊ฐ์๋ง ์์ผ๋ฉฐ, Try
์ ๊ฑฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ๋๋ฌธ ๊ฒฝ์ฐ์ ์์ ํ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ Try
์ ์ ์์ ํ๋์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์์์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ๋งคํฌ๋ก๊ฐ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๋งํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
@KrishnaSannasi ์ Try
์ด ์ฐข์ด ์ง ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค.
@ mark-im ๊ทธ๋ด ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋๋ ๋จ์ง Try
๊ฐ ๋ธ๋ก์ ์๋ํ๊ธฐ ์ํด ์ผ๊ฐ์ wrt์์๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ๋ ๊ฒ์ด ํ์ค์ ์ธ ๋ฌธ์ ๊ฐ ์๋ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ณ ์์ต๋๋ค. ์์ ์์ Try
๋ฅผ ๊ธฐ๋ํ๊ณ ์์ต๋๋ค.
?
๊ฐ ์ด๋ฏธ ์์ ํ๋์๊ณ try
๋ธ๋ก์ ?
์ ๊ฐ์ ๋ฐฉ์์ผ๋ก Result
๋ฐ Option
๋ฅผ ๋ชจ๋ ํฌํจํ๋ ๋ช
ํํ ๋์์ธ์ ๊ฐ์ง๊ณ ์์ต๋๋ค ?
์์ต๋๋ค, Try
์์ ํ์ ๋ํ ์์ ํ๋ฅผ ์ฐจ๋จํ ์ด์ ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ๋ฉด๋ฐํ ์ฃผ์ํ์ง๋ ์์์ง๋ง try
๋ธ๋ก๋ณด๋ค Try
์ ๋์์ธ์ ๋ํ ํฉ์๊ฐ ํจ์ฌ ์ ์ด try
๋ณผ ์์์์ต๋๋ค. Try
ํธ๋ ์ด ํธ ( ?
) ์ ์ ๋ช ๋
๋์ ์์ ํ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฝ์ฐ์๋ Try
๋๋ ์ฐจ๋จํด์ผ ํ ์ด์ ๋ณผ ํน์ฑ ํฌ๊ธฐ try
๋ธ๋ก์ ๋จ์ง ์์
์ผ๋ก ์์ ๋๊ณ Result
๋ฐ Option
์ ๊ฐ์ ?
๊ทธ๋ฌ๋ฉด
(_why_์ ๊ฒฝ์ฐ ์์ ํ ๋ try
๋ธ๋ก๊ณผ ๋ถ์์ ํ Try
ํน์ฑ์ด ์ฃผ์ด์ง๋ฉด ๋งคํฌ๋ก๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋งคํฌ๋ก๋ try { Try::from_ok($expr) }
ํ์ฅ๋ฉ๋๋ค. ์ ํ๋ณ ๋งคํฌ๋ก๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Result
๋ฐ Option
์ด์ง๋ง "[...] ์๋ฎฌ๋ ์ด์
ํ๊ธฐ ๋งค์ฐ ์ฌ์ด"์ ์ ์ถฉ์กฑํ์ง ๋ชปํ๋ IMO).
์ ๊ฐ์ํ ๋ ?
ํน์ ๋งก์๋ค ์์ ์๋ ์ด๋ฏธ Try
ํน์ฑ ์์ ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค, ๋ด๊ฐ ๋ณผ ์์๋ ์ด์ ๋ Try
๊ฒ์ ์๋ ๋ธ๋ก ์ธ ์ฐจ๋จํ ์ ๋ถ์์ ์๋ํ๋ฉด Try ํน์ฑ์ด ์ ๊ฑฐ ๋ ๊ฒฝ์ฐ์๋ ์ธ์ฒด ๊ณตํ์์ด ์์ ๋ ์ํ์์ ?
๋ฅผ ์ง์ํ๋ Option ๋ฐ Result๊ฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
try catch semantic์ ๋ํ ๋ค์ ๊ฐ๋ ์ ์ ์ํฉ๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
union SomeFunctionMultipleError {
err0: Error1,
err1: Error2,
}
struct SomeFunctionFnError {
index: u32,
errors: SomeFunctionMultipleError,
}
fn some_function() -> Result<i32, SomeFunctionFnError> {
if 0 == 0 {
Ok(2)
} else {
Err(SomeFunctionFnError{ index: 0, errors: SomeFunctionMultipleError {err1: Error2 {id0: 0, id1: 0, id3: 0}}})
}
}
union OtherFunctionMultipleError {
err0: Error1,
err1: Error2,
err2: Error3,
}
struct OtherFunctionFnError {
id: u32,
errors: OtherFunctionMultipleError,
}
fn other_function() -> Result<i32, OtherFunctionFnError> {
if 0 == 0 {
Ok(2)
} else {
Err(OtherFunctionFnError {id: 0, errors: OtherFunctionMultipleError {err0: Error1 {id0: 0, id1: 0}}})
}
}
์ด๊ฒ์ Rust์ Zero-Overhead ์์ธ์ ์ํด ์์ฑ ๋ ์์๋ ์ฝ๋์ ๋๋ค.
fn some_function() -> i32 throws Error1, Error2 {
if 0 == 0 {
2
} else {
Error2 {id0: 0, id1: 0, id3: 0}.throw
}
}
fn other_function() -> i32 throws Error1, Error2, Error3 {
if 0 == 0 {
2
} else {
Error1{id0: 0, id1: 0}.throw
}
}
๋๋ ์ด๋ฌํ ์ค๋ฅ์กฐ์ฐจ๋ ์ปดํ์ผ๋ฌ์ ์ํด ์์ ์ ์ผ๋ก ์ถ๋ก ๋ ์ ์์ต๋๋ค.
fn some_function(i: i32) -> i32 throws { // Implicitly throws Error1, Error2
if i == 0 {
2
} else if i == 1 {
Error1 {id0: 0, id1: 0, id3: 0}.throw
} else {
Error2 {id0: 0, id1: 0, id3: 0}.throw
}
}
fn other_function(i: i32) -> i32 throws { // Implicitly throws Error1
if i == 0 {
2
} else {
Error1{id0: 0, id1: 0}.throw
}
}
์ด๊ฒ์ ๋ค๋ฅธ ๊ตฌ๋ฌธ ์คํ! ํ๋์ ๊ฐ์ต๋๋ค !!
์๋ ํ์ธ์,
์์์๋ ์ ๋ก ์ค๋ฒ ํค๋ ์์ธ์ ๋ํ ์ ์ ์์ ๋ณด๋ ์ฌ๋์ด ์์ต๋๊น?
@redradist try
๋ธ๋ก์ ์ฃผ์ ํฌ์ธํธ ์ค ํ๋๋ ๋ชจ๋ ๋ธ๋ก์ ๋ํด ํจ์๋ฅผ ๋ง๋ค ํ์์์ด ํจ์ ๋ด๋ถ์์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๋น์ ์ ์ ์์ ๋ด๊ฐ ๋ณด๋ ํ ์ฌ๊ธฐ์์ ์์ ํ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ฐ๋ก ์ค๋ ์ ๋ try
๋ธ๋ก์ด ํ์ํ๋ค๊ณ ๋๊ผ์ต๋๋ค. ?
์์
์ด ๋ง์ ํฐ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์ค๋ฅ์ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ง๋ง ?
๋ง๋ค ๊ทธ๋ ๊ฒํ๋ ค๋ฉด ์์ฒญ๋ ์์ ์์ฉ๊ตฌ๊ฐ ํ์ํ์ต๋๋ค. try
์ค๋ฅ๋ฅผ ํฌ์ฐฉํ๊ณ ์ปจํ
์คํธ๋ฅผ ํ๊ณณ์ ์ถ๊ฐํ๋ฉด์ด๋ฅผ ๋ฐฉ์ง ํ ์ ์์ต๋๋ค.
Btw. ์ด ๊ฒฝ์ฐ ๋ด๋ถ ํจ์๋ก ์์ ์ ๋ํํ๋ ๊ฒ์ ์ด๋ ค์ ์ ๊ฒ์ ๋๋ค. ์ปจํ ์คํธ์๋ ๋ช ํํ ์๋ช ์ด ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ํจ์๋ก ๋๋๋ฉด NLL์ด ๊นจ์ง๋๋ค.
ํ์ฌ ๊ตฌํ์์ try
๋ธ๋ก์ ํํ์์ด ์๋๋ผ๋ ์ ์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ๋
์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค.
ํ์ฌ ๊ตฌํ์์ try ๋ธ๋ก์ ํํ์์ด ์๋๋ผ๋ ์ ์ ์ธ๊ธํ๊ณ ์ถ์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ์ญ์์ค.
์๋ํ์ง ์๋ ์ฝ๋๋ฅผ ๊ฒ์ ํ ์ ์์ต๋๊น? ์ฌ๊ธฐ ํํ์ ์ปจํ ์คํธ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ( Rust Playground )
#![feature(try_blocks)]
fn main() {
let s: Result<(), ()> = try { () };
}
๋ฌผ๋ก ์ ๋๋ค .
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ try ๋ธ๋ก์ ๋ํ ์ ํ ์ถ๋ก ์ด ์์ง ์๋ฃ๋์ง ์์ ์์ ๋ณด์ฌ์ฃผ๋ ๋ ๋ค๋ฅธ ๊ฒ ์
๋๋ค. if let
๋ธ๋ก์์๋ ์ ํ ์ง์ ์ด ์ง์๋์ง ์๊ธฐ ๋๋ฌธ์ ํนํ ์ง์ฆ์ด๋ฉ๋๋ค.
@ Nokel81 ์ด์ ์์ ์ ๋ฌธ์ ๋ if let $pat = $expr
ํํ์์ด ์ ๊ท ํํ์ ์ปจํ
์คํธ๊ฐ ์๋๋ผ ํน์ํ "๋๊ดํธ ํํ์ ์์"์ปจํ
์คํธ๋ผ๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด struct ํํ์๊ณผ ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํ ์๋ struct ํํ์ ์ด ์๋ค๋ ๊ฒ์ด ๊ตฌ๋ฌธ ์ ์ผ๋ก ๋ช
ํํ ์ด ์์ ์ ๊ทธ๋ ์ง ์์ try
๊ฐ ํํ์์ด ์๋๋ผ๋ ๊ฒ์ด ์๋๋ผ ์ค๋ฅ๊ฐ ์๋ชป๋์์ต๋๋ค. " try
ํํ์์ ์ฌ๊ธฐ์์ ํ์ฉ๋์ง ์์ต๋๋ค. ๊ดํธ๋ก ๋ฌถ์ด๋ณด์ญ์์ค"(๊ทธ๋ฆฌ๊ณ ๋ถํ์ํ ๊ดํธ์ ๋ํ ์๋ชป๋ ๊ฒฝ๊ณ ๊ฐ ํ์๋์ง ์์).
ํ์์ ์๋ ์ค์ ๋ก ์ ํ ์ถ๋ก ์ ๋ํด ๋ชจํธํฉ๋๋ค. ์ด ๊ฒฝ์ฐ e
์ ์ ํ์ _: From<usize>
์ด๋ฉฐ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ์ ๊ณตํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์๋๋๋ค. ์ ํ ์ถ๋ก ์ด ์ฑ๊ณตํ ์ ์๋๋ก ๊ตฌ์ฒด์ ์ธ ์ ํ ์ try
์๋ง ํด๋น๋๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ์ด๊ฒ์ด Rust์์ ํ์
์ถ๋ก ์ด ์๋ํ๋ ๋ฐฉ์์
๋๋ค.
์ด์ ์ฆ์ Ok
๋ก ์ผ์น์ํค๊ณ Err
case๋ฅผ ์ญ์ ํ๋ ค๊ณ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ค์ ์์ต๋๋ค .
์ ๊น์ด ์ค๋ช
ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ ๋์ค์ ์ ํ ์ถ๋ก ์ด ๋ชจํธํ ์ง ํผ๋ ์ค๋ฝ์ต๋๋ค. ์์ ์ ํ์ด Result<isize, usize>
์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
?
์ฐ์ฐ์๋ From
ํธ๋ ์ด ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ๋ค๋ฅธ ์ค๋ฅ ์ ํ๊ฐ์ ์ ํ ๋ณํ์ ์ํ ํ ์ ์์ต๋๋ค. ๋๋ต ๋ค์๊ณผ ๊ฐ์ rust ์ฝ๋๋ก ํ์ฅ๋ฉ๋๋ค ( Try
ํธ๋ ์ด ํธ ๋ฌด์) :
match expr {
Ok(v) => v,
Err(e) => return From::from(e),
}
From
ํธ์ถ์ ์ต์ข
๋ฐํ ๋ ์์ ์ ํ์ ์ฌ์ฉํ์ฌ ์ํ ํ ์ค๋ฅ ์ ํ ๋ณํ์ ๊ฒฐ์ ํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ฌ ๋ ๊ฐ์ ์ ํ์ผ๋ก ์๋ ์ค์ ๋์ง ์์ต๋๋ค.
์ด ๋ฌธ์ ๊ฐ ์ด๋ฏธ ํด๊ฒฐ ๋ ๊ฒฝ์ฐ ์ฌ๊ณผํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด ์ด์ํ๊ฒ ๋ณด์ ๋๋ค.
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let result = try { // no type annotation
Err(())?;
};
result.map_err(|err| err)
}
๋ค์์ผ๋ก ์ปดํ์ผํ์ง ๋ชปํ์ต๋๋ค.
error[E0282]: type annotations needed
๊ทธ๋ฌ๋:
#![feature(try_blocks)]
fn main() -> Result<(), ()> {
let result : Result<_, _> = try { // partial type annotation
Err(())?;
};
result.map_err(|err| err)
}
๊ด์ฐฎ๋ค.
Result
์ ํ์
์ธ์๋ฅผ ์ถ๋ก ํ ์ ์์ด์ ๋ฌธ์ ๊ฐ๋๋ค๋ฉด ์ดํดํ ์ ์๊ฒ ์ง๋ง, ์์ ๊ฐ์ด ๊ทธ ๊ฒฐ๊ณผ๋ ์๋๊ณ rustc๋ ์ถ๋ก ์ ํ ์ ์์ต๋๋ค. try
ํํ์์ ์ผ์ข
์ Result
์ด๋ฉฐ, core::ops::Try::into_result
์์ ์ถ๋ก ํ ์ ์์ด์ผํฉ๋๋ค.
์๊ฐ?
@nwsharp ๋ try
/ ?
์ด Try
์ ํ๋ณด๋ค ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. impl Try<Ok=_, Error=()>
์ธ ๋ค๋ฅธ ์ ํ์ด์๋ ๊ฒฝ์ฐ try ๋ธ๋ก์ Result
๋ฟ๋ง ์๋๋ผ ํด๋น ์ ํ์ผ๋ก ํ๊ฐ ๋ ์ ์์ต๋๋ค. Desugared, ๊ทํ์ ์๋ ๋๋ต
#![feature(try_trait, label_break_value)]
use std::ops::Try;
fn main() -> Result<(), ()> {
let result /*: Result<_, _>*/ = 'block: {
match Try::into_result(Err(())) {
Ok(ok) => Try::from_ok(ok),
Err(err) => {
break 'block Try::from_error(From::from(err));
}
}
};
result.map_err(|err| err)
}
@ CAD97 ์ค๋ช ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ฆ, try
๊ฐ ๋ค๋ฅธ Try
impls๊ฐ์ ์ผ์ข
์ ๋ณํ์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฐํ ์์์ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ๋ชปํ์ต๋๋ค.
into_result
, from_ok
๋ฐ from_error
๋ํด ๋์ผํ Try
impl์ด ์ ํ๋ ๊ฒฝ์ฐ ํ ์์ ์ ๊ธฐ๋ ํฉ๋๋ค.
์ ์๊ฐ์๋ ์ ํ ์ถ๋ก ์ ์ํ ํ ์์๋ ์ธ์ฒด ๊ณตํ์ ์์ค (ํนํ ๋์ฒด impl Try
๋ ์กด์ฌํ์ง ์๋๋ค๋ ์ ์ ๊ณ ๋ ค)์ด์ด ๋ณํ์ ํ์ฉํ๋ ์ด์ ๋ณด๋ค ํฌ์ง ์์ต๋๋ค.
๋ชจํธํจ์ ์ ๊ฑฐํ์ฌ ์ถ๋ก ์ ํ์ฉ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ ํตํด ์ ํ์ ๋ํ ์ตํธ ์ธ ๊ธฐ๋ฅ์ ์ ์งํ ์ ์์ต๋๋ค.
try { ... }.into()
ํด๋นํ๋ ๋ด์ impl :
impl<T: Try, E: Into<T::Err>> From<Result<T::Ok, E>> for T {
fn from(result: Result<T::Ok, E>) -> Self {
match result {
Ok(ok) => T::from_ok(ok),
Err(err) => T::from_err(err.into()),
}
}
}
(์์งํ ๋ด๊ฐ ์ฌ๊ธฐ์ ์ค๋ฅ ์ ํ์ ์๋ ๋ณํ์ ์์ฌ ๊ฐ์ธ์ ์์ต๋๋คํ์ง๋ง ์ฐจ์ข
์ ๊ด๊ณ์์ด ๊ฐ์ง ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํ๋ค.์ด ์ํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์ํด์ผ .map_err()
์จ Result
.)
์ผ๋ฐ์ ์ผ๋ก์ด ํ๋น์ "๋๋ฌด ์๋ฆฌํ๋ค"๊ณ ์๊ฐํฉ๋๋ค. ๋๋ฌด ๋ง์ด ์จ๊ธฐ๊ณ ํ์ฌ์ ์๋ฏธ๋ ์ฌ๋๋ค์ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์์ต๋๋ค. (ํนํ ํ์ฌ ๊ตฌํ์์ ์ง์ ์ง์ํ์ง ์๋ ์ ํ ์ฃผ์์ ์์ฒญํ๋ค๋ ์ ์ ๊ณ ๋ คํ์ธ์!)
๋๋ ๋ด์ impl๋ก ๋ ๋์๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
impl <T: Try, U: Try> From<U> for T
where U::Ok : Into<T::Ok>, U::Err : Into<T::Err>
{
fn from(other: U) -> Self {
match other.into_result() {
Ok(ok) => Self::from_ok(ok.into()),
Err(err) => Self::from_err(err.into()),
}
}
}
๋๋ ๋ฌด์์ด๋ ...
์ฆ, try๊ฐ ๋ค๋ฅธ
Try
impls๊ฐ์ ์ผ์ข ์ ๋ณํ์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฐํ ์์์ ๊ฒ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ๋ชปํ์ต๋๋ค.
into_result
,from_ok
๋ฐfrom_error
๋ํด ๋์ผํTry
impl์ด ์ ํ๋ ๊ฒฝ์ฐ ํ ์์ ์ ๊ธฐ๋ํฉ๋๋ค.์ ์๊ฐ์๋ ์ ํ ์ถ๋ก ์ ์ํ ํ ์์๋ ์ธ์ฒด ๊ณตํ์ ์์ค (ํนํ ๋์ฒด
impl Try
๋ ์กด์ฌํ์ง ์๋๋ค๋ ์ ์ ๊ณ ๋ ค)์ด์ด ๋ณํ์ ํ์ฉํ๋ ์ด์ ๋ณด๋ค ํฌ์ง ์์ต๋๋ค.
Option<T>
, Result<T, E>
, Poll<Result<T, E>>
๋ฐ Poll<Option<Result<T, E>>
๋ค ๊ฐ์ง ์์ ์ ์ธ Try
์ ํ์ด ์์ต๋๋ค.
NoneError
์ (๋) ๋ถ์์ ํ๋ฏ๋ก Option<T>
์ (๋) Option<T>
๋ฉ์ถฐ ์์ง๋ง NoneError
๋ ๋ถ์์ ํฉ๋๋ค. (๋ฌธ์๋ ๋ช
์ ์ ์ผ๋ก From<NoneError>
๋ฅผ "์ค๋ฅ ์ ํ์ ๋ํด option?
ํ์ฑํ"๋ก ๋ช
์ํฉ๋๋ค.)
๊ทธ๋ฌ๋ Poll
impls๋ ์ค๋ฅ ์ ํ์ E
ํฉ๋๋ค. ์ด ๋๋ฌธ์,์ "๋ชจํ ์
๋ ฅ" Try
์์ , ๋น์ ์ด ํ ์ ์๊ธฐ ๋๋ฌธ์ ?
Poll<Result<T, E>>
A์ -> Result<_, E>
์ป์ ์์๋ Poll<T>
๋ฐ E
์ผ์ด์ค๋ฅผ ์กฐ๊ธฐ์ ๋ฐํํฉ๋๋ค.
์ฌ์ค, ์ด๊ฒ์ "๊ท์ฌ์ด"์์ ๋์ฐ๋ฏธ ์๊ฒ ํ์์ค๋๋ค.
fn lift_err<T, E>(x: Poll<Result<T, E>>) -> Result<Poll<T>, E> { Ok(x?) }
@ CAD97 ์ ๋จธ๋ฌ์ค ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ์ ์ด๋ณด์์๊ฒ ๊ฐ๋ฅด์น๊ธฐ ๊น๋ค๋ก์ด ์ผ์ด๋ฉฐ ์ค๋ฅ ๋ฉ์์ง ์ธก๋ฉด์์ ์๋นํ ์ฌ๋์ด ํ์ํฉ๋๋ค.
์ฌ๊ธฐ์ ์ํ๋ impl Try
์ ์ฌ์์ด ์ง๊ด์ ์ด์ง ์์ ๋์์ ๋ณด์ฅ ํ ์ ์๋ค๊ณ ์๊ฐ ํ์ต๋๊น?
์๋ฅผ ๋ค์ด, try<T> { ... }
์ฝ๊ฐ์ ์์ ๊ฑฐ ํ๋ฆผ. ์๋๋ฉด ๊ทธ์ ํจ๊ป ํ ์ผ์ด ๋ ์์ต๋๊น?
์ฌ๊ธฐ์ ์ฝ๊ฐ ๋ ๋ง์ ์์์ ์ถ๊ฐํ๋ ค๋ฉด Result
๋ฌถ์์ try { }
๊ฐ "๋จ์ง" Result
์์ฑํ์ง ์๋๋ค๋ ์ฌ์ค์ ์์์น ๋ชปํ ์ผ ์ด๋ฉฐ ๋๋ฅผ ์ฌํ๊ฒํฉ๋๋ค. . ์ด์ ๋ ์ดํดํ์ง๋ง ๋ง์์ ๋ค์ง ์์ต๋๋ค.
์, "์ผ๋ฐํ ๋ ์ ํ ์ง์ "(๊ฒ์ ํ ์ฉ์ด๊ฐ ์์) ๋ฐ try
์ ์กฐํฉ์ ๋ํ ๋
ผ์๊ฐ์์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ๋ค์์ ๋ try: Result<_, _> { .. }
๋ ๊ฒฐ๊ตญ ์๋ ํ ๊ณํ์ด์์ต๋๋ค.
ํ์ง๋ง ๋์ํฉ๋๋ค : try
๋ธ๋ก์ ์ถ๋ ฅ ์ ํ์ด ์ง์ ๋์๋์ง ํ์ธํ๊ธฐ์ํ ๋ช ๊ฐ์ง ๋์ ์ง๋จ์๋ฐ์ ์๊ฒฉ์ด ์์ต๋๋ค.
Ok
-wrapping ๋ฌธ์ ์ ๋ํ ์ธ์ด ํ์ ํฉ์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํน์ ์ข์ ์ง๋ฌธ์ ๋ํด์๋ ์ด ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
๋๊ธ์ ๋ฌ๊ธฐ ์ ์ ํด๋น ์ค๋ ๋์ ์์ ๋๊ธ์ ์ฝ์ด ์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ํนํ ์ค๋ ๋๋ ํด๋น ์ง๋ฌธ์ ๋ํ ๊ฒ์ด๋ฉฐ try
๋๋ ?
๋๋ Try
์ ๊ด๋ จ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
try
๋ธ๋ก์ด ํ์ํ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด ๊ตฌ๋ฌธ
fn main() -> Result<(), ()> {
try {
if foo() {
Err(())?
}
()
}
}
๋ค์์ผ๋ก ๋์ฒด ํ ์ ์์ต๋๋ค.
fn main() -> Result<(), ()> {
Ok({
if foo() {
Err(())?
}
()
})
}
๋ ๋ค ๋์ผํ ์์ ๋ฌธ์๋ฅผ ์ฌ์ฉํ์ง๋ง ๋ ๋ฒ์งธ ๋ฌธ์๋ ์ด๋ฏธ ์์ ์ ์ ๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋น ํ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ธฐ ์ํด ๋์ฐ๋ฏธ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํจ์ ๋ํ๋ผ ์ ์์ต๋๋ค. ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ ๋์ ํด๋ก์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@dylni try
๋ธ๋ก์ ํจ์์ ์ ์ฒด ๋ณธ๋ฌธ์ ํฌํจํ์ง ์์ ๋ ํนํ ์ ์ฉํฉ๋๋ค. ์ค๋ฅ์ ?
์ฐ์ฐ์๋ ํจ์์์ ๋ฐํํ์ง ์๊ณ ํ๋ฆ ์ ์ด๋ฅผ ๊ฐ์ฅ ์์ชฝ์ try
๋ธ๋ก ๋์ผ๋ก ์ด๋ํฉ๋๋ค.
```๋
น
fn main () / * ์ฌ๊ธฐ์ ๊ฒฐ๊ณผ ์์ * / {
let result = try {
foo () ?. bar () ?. baz ()?
};
๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ {
//โฆ
}
}
@SimonSapin ๊ทธ๋ ๊ฒ ์์ฃผ
fn main() /* no result here */ {
let result = foo()
.and_then(|x| x.bar())
.and_then(|x| x.baz());
match result {
// โฆ
}
}
๋ ์ฅํฉํ์ง๋ง ๋ ๊ฐ๋จํ ์๋ฃจ์ ์ ๋ฉ์๋ ํด๋ก์ ๊ตฌ๋ฌธ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
fn main() /* no result here */ {
let result = foo()
.and_then(::bar)
.and_then(::baz);
match result {
// โฆ
}
}
์ ํ์ try
๋ํ ์ ํ ์ฃผ์์ด ํ์ํ and_then
์ฌ๋ฐ๋ฅด๊ฒ ์ถ๋ก ๋ฉ๋๋ค. ๋๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ด ๊ฐ๋
์ฑ์ ํด๋ฅผ ๋ผ์น ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ง ์์ ์ ๋๋ก ๋๋ฌผ๊ฒ ๋ฐ์ํ์ต๋๋ค.
ํ์ฉ ๋ RFC์๋ ๋ช ๊ฐ์ง ์ถ๋ก ์ด ์์ต๋๋ค. https://rust-lang.github.io/rfcs/0243-trait-based-exception-handling.html
์ด์จ๋ and_then
์ ๊ฐ์ ์ฐ๊ฒฐ ๋ฉ์๋๋ณด๋ค ?
(๋ฐ .await
) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ํ๋ฆ์ ๋ํ ์ธ์ด ๊ตฌ์กฐ๋ฅผ ์ ํธํ๋ ์ธ์๋ ์ด๋ฏธ ๊ด๋ฒ์ํ๊ฒ ๋
ผ์๋์์ต๋๋ค.
์ด์จ๋
and_then
์ ๊ฐ์ ์ฐ๊ฒฐ ๋ฉ์๋๋ณด๋ค?
(๋ฐ.await
) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ์ ์ด ํ๋ฆ์ ๋ํ ์ธ์ด ๊ตฌ์กฐ๋ฅผ ์ ํธํ๋ ์ธ์๋ ์ด๋ฏธ ๊ด๋ฒ์ํ๊ฒ ๋ ผ์๋์์ต๋๋ค.
@SimonSapin ๊ฐ์ฌํฉ๋๋ค. ์ด๊ฒ๊ณผ RFC๋ฅผ ๋ค์ ์ฝ์์ผ๋ก์จ ์ด๊ฒ์ด ์ ์ฉ ํ ์ ์๋ค๊ณ ํ์ ํ์ต๋๋ค.
์ค๋ฅ์ ์ปจํ ์คํธ๋ฅผ ์ฝ๊ฒ ์ถ๊ฐํ๊ธฐ ์ํด try ๋ธ๋ก์ ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ง๊ธ๊น์ง๋ ์ด์ด ์์์ต๋๋ค.
์ ์๋ํ๋ ์์ ํจ์๋ฅผ ์์ฑํ์ต๋๋ค. File::open()?
๋ std::io::Error
์คํจํ๊ณ ๋ค์ ์ค์ anyhow::Error
์คํจํฉ๋๋ค. ์ ํ์ด ๋ค๋ฅด์ง๋ง ์ปดํ์ผ๋ฌ๋ ๋ ๋ค Result<_, anyhow::Error>
๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ์ ์์๋
๋๋ค.
fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> Result<(usize, usize), anyhow::Error> {
let path = path.as_ref();
let mut file = BufReader::new(File::open(path)?);
Ok(config.root_store.add_pem_file(&mut file)
.map_err(|_| anyhow!("Bad PEM file"))?)
}
์ค๋ฅ ์ปจํ
์คํธ๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์์ผ๋ฏ๋ก try-block์ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ์ง๋ง with_context()
:
fn tls_add_cert(config: &ClientConfig, path: impl AsRef<Path>) -> anyhow::Result<(usize, usize)> {
let path = path.as_ref();
try {
let mut file = BufReader::new(File::open(path)?);
Ok(config.root_store.add_pem_file(&mut file)
.map_err(|_| anyhow!("Bad PEM file"))?)
}
.with_context(|| format!("Error adding certificate {}", path.display()))
}
๊ทธ๋ฌ๋ ์ด์ ์ ํ ์ถ๋ก ์ด ์คํจํฉ๋๋ค.
error[E0282]: type annotations needed
--> src/net.rs:29:5
|
29 | / try {
30 | | let mut file = BufReader::new(File::open(path)?);
31 | | Ok(config.root_store.add_pem_file(&mut file)
32 | | .map_err(|_| anyhow!("Bad PEM file"))?)
33 | | }
| |_____^ cannot infer type
|
= note: type must be known at this point
```
I don't understand why a type annotation is needed here but not in the first case. Nor do I see any easy way to add one, as opposed to using an [IIFE](https://en.wikipedia.org/wiki/Immediately_invoked_function_expression) which does let me add an annotation:
```rust
(|| -> Result<_, anyhow::Error> {
let domain = DNSNameRef::try_from_ascii_str(host)?;
let tcp = TcpStream::connect(&(host, port)).await?;
Ok(tls.connect(domain, tcp).await?)
})()
.with_context(|| format!("Error connecting to {}:{}", host, port))
๋ฟก ๋นต๋จ
๋ค์,
์ด๋
try
/?
์ดTry
์ ํ๋ณด๋ค ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. [impl Try<Ok=_, Error=anyhow::Error>
] ์ธ ๋ค๋ฅธ ์ ํ์ด์๋ ๊ฒฝ์ฐ try ๋ธ๋ก์Result
๋ฟ๋ง ์๋๋ผ ํด๋น ์ ํ์ผ๋ก ํ๊ฐ ๋ ์ ์์ต๋๋ค.
(๋ํ try
๋ธ๋ก (# 70941)์์ ํํ ํํ์์ Ok
ํ ํ์๊ฐ ์์ต๋๋ค.)
์ด๊ฒ์ด ๊ณ์ํด์ ๋ํ๋๋ค๋ ๊ฒ์
try
๋ ์ ํ ์ง์ ( try: Result<_,_> {
๋๋ ๊ธฐํ)์ ์ง์ํ๊ฑฐ๋์ด ๋ฌธ์ ๋ฅผ ์ํํด์ผํฉ๋๋ค.try
๋ธ๋ก์ ์ ํ ์ถ๋ก ์ด ์คํจ ํ ๋๋ฅผ์ํ ํ์ ์ง๋จ์ด ํ์คํ ํ์ํฉ๋๋ค.try
์ ํ์ Result<_,_>
๋์ฒดํ๋ ๊ฒ์ ๊ฐ๋ ฅํ๊ฒ ๊ณ ๋ คํด์ผํฉ๋๋ค. ์, ์ด๋ ต๊ณ ์ง์ ๋์ง ์์์ผ๋ฉฐ ์ ์ฌ์ ์ผ๋ก ๋ฌธ์ ๊ฐ์์ ์ ์์ง๋ง $12: Try<Ok=$5, Error=$8>
๊ฐ ์ถฉ๋ถํ ๊ตฌ์ฒด์ ์ด์ง ์๊ธฐ ๋๋ฌธ์ ์ ํ ์ฃผ์์ด ํ์ํ try
๋ธ๋ก์ 80 % ๊ฒฝ์ฐ๋ฅผ _ ํด๊ฒฐํฉ๋๋ค.๋ํ, # 70941์ด "์, ์ฐ๋ฆฌ๋ (์ผ๋ถ ํํ์) ' Try::from_ok
๋ํ'์ ์ํฉ๋๋ค" "๋ก ํด๊ฒฐํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฉฐ, try
์ ๊ผฌ๋ฆฌ ํํ์ด์์ ๋ _also_ ํ์ ์ง๋จ์ ์ํ ๊ฒ์
๋๋ค x
๊ฐ ์๋ ํ ๋ Ok(x)
๋ฐํํฉ๋๋ค.
์๋์ ๋ํ ์ฌ๋ฐ๋ฅธ ํ๋์
try: Result<_, _> { .. }
, try as Result<>
๋ฑ๊ณผ ๊ฐ์ ์๋ ์ง์ ์ ํ์ฉํ๋๋ก ๊ตฌ๋ฌธ์ ํ์ฅํฉ๋๋ค ( try: Result
๊ฐ ์๋ง๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๊น? ์ ํธํ๋ ๊ตฌ๋ฌธ ์ธ ๊ฒ ๊ฐ์ต๋๋ค)try
์ ๊ฒฐ๊ณผ ์ ํ์ผ๋ก ์ ํธํ์ญ์์ค.Result<_, _>
. ์ด๊ฒ์ i32
์ ๊ฐ์ ์ ํ ์ถ๋ก ํด ๋ฐฑ์ด ์๋๋ฉฐ ๋ ์ผ์ฐ ๋ฐ์ํ์ง๋ง try { }.with_context(...)
์ปดํ์ผ๊ณผ ๊ฐ์ ์์
์ ์๋ฏธํฉ๋๋ค.๊ทธ๋ฌ๋ ์ ์ด๋ ์ค๋ฅ ์ ํ์ด ์ง์ ๋์ง ์์ ํ ?
๋ฐ into
๊ฐ์ ๋ณํ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ด ์ฐ๋ ค๋ฉ๋๋ค. ํนํ try
๋ธ๋ก์ ๊ฒฐ๊ณผ๋ฅผ ?
์์น์ ์์ฑํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
#![feature(try_blocks)]
use std::error::Error;
fn foo() -> Result<(), Box<dyn Error>> {
let x: Result<_, _> = try {
std::fs::File::open("foo")?;
};
x?;
Ok(())
}
fn main() {
}
"into"๊ฐ์ ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์ด์ผํ๋ ?
๋ํด ๋ช
ํํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ค๋ฅ ( playground )๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ์์ ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์๋ง๋ ์ ๋ฅผ ๊ธด์ฅํ๊ฒ ๋ง๋ค ์ ํ ์ถ๋ก ํด ๋ฐฑ๊ณผ ๊ด๋ จ์ด์์ ๊ฒ์ ๋๋ค.
๋๋ฅผ ๊ธด์ฅํ๊ฒ ๋ง๋๋ ์ ํ ์ถ๋ก ํด ๋ฐฑ์ด ํฌํจ๋์ด์์ ๊ฒ์ ๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ : ์ฃผ์ด์ง Try
๋ธ๋ก์์ ?
์ ๋ชจ๋ ์ฌ์ฉ์ ๋์ผํ Try::Error
์ ํ์ด ํฌํจ ๋ ๊ฒฝ์ฐ ํฌํจํ๋ try
๋ธ๋ก์ ํด๋น ์ค๋ฅ ์ ํ์ ์ฌ์ฉํฉ๋๋ค ( ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ด๋).
"(๋ฌ๋ฆฌ ๋ฌถ์ด์ง ์๋ ํ)"๋ ๋ฌผ๋ก ๋ฏธ๋ฌํ ๋ฌด์์ด ๋ถ๋ถ์ ๋๋ค.
์ด ๊ฒ์๋ฌผ์ ๋๋ฌด ๋น ๊ตฌ์กฐ์ ์ด์ง ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๊ทธ๋ฌ๋ @nikomatsakis ์์ ๋ฅผ ?
๊ฐ ๊ฐ์ ๋ณํ์ ์ํํ์ง ์๊ณ try
๋ธ๋ก ๊ฒฐ๊ณผ์ ์๋ ๋ํ์ด์๋ ๋ณ๋ ฌ ์ธ๊ณ์ ์์ ์ ๋์กฐํ๊ณ ์ถ์์ต๋๋ค.
use std::error::Error; fn foo() -> Result<(), Box<dyn Error>> { let x = try { std::fs::File::open("foo").err_convert()?; Ok(()) }; x?; Ok(()) }
์ด ์ธ์์์:
try
๋ฒ์์ fn
์์ฒด๊ฐ ๊ฐ์์ด ์ฑ๊ณตํ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. Result
๋ฅผ ์์ฑํ๋ ค๊ณ ์๋ํ์ง ์๊ณ ๋ ์ฝ๊ฒ ๋ณผ ์ ์์ต๋๋ค.x?
์์ผ๋ก ์ด๋ํ์ฌ try
๋ฒ์๋ฅผ std::fs::File
์์
์ ๋ง๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.๋๋ ๊ทธ ํํ ์ฐ์ฃผ์์ ๋งค์ฐ ํ๋ณต ํ ๊ฒ์ ๋๋ค.
๋๋ ๋น์ ์ด ๊ทธ ์๊ฒฌ์ ์ด์ฃผ์ ๊ธธ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ, ๋ ๋๋ ค์ @phaylon ์คํ๋ ค unconstructive์
๋๋ค. ์ค๋ฅ ๋ณํ์ ?
์ผ๋ถ์ด๋ฉฐ ๋ณ๊ฒฝ๋์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฐ ์ ์์ ok-wrapping์ ๊ธฐ๋ณธ์ ์ผ๋ก์ด ํ ๋ก ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ์ง๊ตํฉ๋๋ค.
try
ํจ์ (return ๋ฐ throw ์ ํ ํฌํจ)๋ฅผ ๊ณ ๋ คํ ๊ฒฝ์ฐ try ๋ธ๋ก์ ์ ์ฌํ ๊ฒ์ผ๋ก ์ง์ ํ๋ ๊ตฌ๋ฌธ๋ ๊ณ ๋ คํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์
try fn foo() -> u32 throw String {
let result = try: u32 throw String {
123
};
result?
}
์ด๊ฒ์ด ๋ ผ์ ๋์๋ค๋ฉด ์ฃ์กํ์ง๋ง ์ฌ์ฉ์ ์ฅ์ ์ ๋ฌด์์ ๋๊น
try fn foo() -> u32 throw String { ... }
๋๋ ์ด์ ๋ฐ๋๋ก
fn foo() -> Result<u32, String> { ... }
?
์ค๋ณต ๊ตฌ๋ฌธ์ฒ๋ผ ๋ณด์
๋๋ค.
@gorilskij ๋ด๊ฐ ์ดํดํ๋ฏ์ด ์ฃผ๋ ์ด์ ์ Ok
-wrapping ์ ์ป๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ผํฉ๋๋ค.
fn foo() -> Result<u32, String> {
try {
// function body
}
}
์ด๋ค ์ฌ๋๋ค์ ์์ธ ์ฉ์ด๊ฐ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ throws
์ ์ ํธํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์์ธ์ ์ถํ์์ ์ต๋ํ ๋ฉ๋ฆฌ ๋จธ๋ฌผ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ try fn
๋ฅผ ๋
ผ์ ํ ์ค๋ ๋๊ฐ ์๋๋ฏ๋ก์ด ํ์ ํธ๋ฅผ ๋ ์ด์ ๋ค๋ฃจ์ง ๋ง์ญ์์ค. ์ด ์ค๋ ๋๋ try
๋ธ๋ก์ ํ์ฉ ๋ ๊ธฐ๋ฅ์์ํ ๊ฒ์ด๋ฉฐ, ์ ์ฌ์ (๊ทธ๋ฆฌ๊ณ ์์ง RFCd๊ฐ ์๋) ๊ธฐ๋ฅ try fn
์๋๋๋ค.
๋ฐฉ๊ธ ?
๋ํ ์๋ RFC๊ฐ Into
๊ฐ ์๋ From
Into
์ฌ์ฉํ์ฌ ์ ์๋์์์ ํ์ธํ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํฉ๋๋ค.
ํ์ฌ RFC๋์ด ๋ชฉ์ ์ ์ํด
std::convert::Into
ํน์ฑ์ ์ฌ์ฉํฉ๋๋ค (From
์์ ํฌ์๋ฉํ๋ ํฌ๊ด์ ์ธ impl์ด ์์).
์ ํํ upcasting ๋ฐฉ๋ฒ์ ํด๊ฒฐ๋์ง ์์ ์ง๋ฌธ ์ผ๋ก ๋จ๊ฒจ ๋ก๋๋ค. Into
๋ From
์ ์ง์นจ์ ๋ฐ๋ผ (์๋ง๋) ์ ํธ๋์์ต๋๋ค.
์ ๋ค๋ฆญ ํจ์์ ํน์ฑ ๊ฒฝ๊ณ๋ฅผ ์ง์ ํ ๋
From
์ฌ์ฉ๋ณด๋คInto
์ฌ์ฉ์ ์ ํธํฉ๋๋ค. ์ด๋ ๊ฒํ๋ฉดInto
๋ฅผ ์ง์ ๊ตฌํํ๋ ์ ํ๋ ์ธ์๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ Try
ํธ๋ ์ด ํธ RFC ์์ Into
๋ ๋ ์ด์ ์ธ๊ธ๋์ง ์์ผ๋ฉฐ ๋์ From
๋ฅผ ์ฌ์ฉํ์ฌ ๋ณํ์ด ์ํ๋ฉ๋๋ค. ์ด๊ฒ์ ?
์์๋ ์ฝ๋๊ฐ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
https://github.com/rust-lang/rust/blob/b613c989594f1cbf0d4af1a7a153786cca7792c8/src/librustc_ast_lowering/expr.rs#L1232
Into
์์ From
๊ฐ๋ ํฌ๊ด์ ์ธ ๊ตฌํ์ด ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ถํํ ๊ฒ ๊ฐ์ต๋๋ค. ์ฆ, Into
( From
๊ณผ๋ ๋ฐ๋๋ก)๋ฅผ ๊ตฌํํ๋ ์ค๋ฅ๋ ๋ ๊ฑฐ์ ์ด์ ๋ก ์ค๋ฅ๊ฐ ์๊ฑฐ๋ ๋ค๋ฅธ ํ์๋ก ์ธํด ?
(๋๋ Try
). ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ถ์ฅ ์ฌํญ์ ๋ฐ๋ฅด๋ ๋ชจ๋ ๊ตฌํ์์ Into
in bounds๋ฅผ ์ฌ์ฉํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ?
. ์๋ฅผ ๋ค์ด ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋๋ก ๊ถ์ฅํฉ๋๋ค.
fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where E: Into<MyError>
ํ์ง๋ง ๊ทธ๋ ๊ฒํ๋ฉด ํจ์ ๋ณธ๋ฌธ์ ?
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ฒํ๋ ค๋ฉด ๊ธ์ ์จ์ผํฉ๋๋ค
fn with_user_err<E>(op: impl Fn() -> Result<(), E>) -> Result<(), MyError>
where MyError: From<E>
ํ์ง๋ง ๊ทธ๋ ๊ฒํ๋ฉด From
๋์ Into
๋ฅผ ๊ตฌํํ๋ ์ค๋ฅ ์ ํ์ ๊ฐ์ง ์ฌ์ฉ์๋์ด ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ญ ์ธํด์ ๋ด์ IMPL์, ์ฌ์ค์ด ์๋๋ค๋ ๊ฒ์ ์ฃผ Into
์ ๋ฐ๋ผ From
.
์ง๊ธ ?
๋ฅผ ๊ณ ์น๊ธฐ์๋ (?) ๋๋ฌด ๋ฆ์์ ๊ฒ์
๋๋ค (์๋ง๋ _ ๋งค์ฐ _ ์ํ๊น๊ฒ๋ โ ์๋ง๋ ๋ค์ ๋ฒ์ ์์?).ํ์ง๋ง ์ ์ด๋ Try
์์ ๊ทธ ๊ฒฝ๋ก๋ฅผ ๋ ๊น์ด ํํค ์น์ง ์๋๋กํด์ผํฉ๋๋ค.
๋ฐ desugaring ๋ฐ๊พธ๋ ค๊ณ @cuviper @jonhoo From
์ Into
์ # 60796์ # 38751์ ํ์ธ ์ ํํ ์ธํด์ ์ถ๋ก ํ์ ๋ค๋ ์ด๋ํ๋ From
-> Into
๋ด์ impl๋ก ์ธํด rustc๊ฐ ์ผ๋ฐ์ ์ธ ์ ์ ๋ณํ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ก์ต๋๋ค. ์ถ๋ก ๋น์ฉ์ ๊น์๋งํ ๊ฐ์น๊ฐ ์๋ค๊ณ ๊ฒฐ์ ๋์์ต๋๋ค.
@jonhoo ๋น์ ์ ๋ํ niko์ ์ ์ตํ ์ฝ๋ฉํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค :
ํน์ฑ ์์คํ ์๋ ํ๋ ์ฝ๋ฉ ๋ ์ ํ๋ ์์ต๋๋ค.
?X: Into<ReturnType>
์ ๊ฐ์ ๋ชฉํ๋ฅผ ํด๊ฒฐํด์ผํ๋ ๊ฒฝ์ฐ์๋ ํด๊ฒฐํ์ง ๋ชปํ์ง๋งReturnType: From<?X>
์ ๊ฐ์ ๋ชฉํ๋ฅผ ํด๊ฒฐํด์ผํ๋ ๊ฒฝ์ฐ ์ ์ฌ์ ์ผ๋ก ์ฑ๊ณตํ๊ณ?X
์ ๊ฐ์ ์ถ๋ก ํฉ๋๋ค.ํธ์ง : ์ฌ๊ธฐ์
?X
๋ ์๋ ค์ง์ง ์์ ์ถ๋ก ๋ณ์๋ฅผ ๋ํ๋ ๋๋ค. ์ค๋๋ ์ ํธ๋ ์ด ํธ ์์คํ ์์ ํ๋ ์ฝ๋ฉ ๋ ํ๊ณ๋Self
์ ํ์ด ์ฐ๋ฆฌ๊ฐ ํด๋น ์ต์ ์ ํ์ํ๊ธฐ ์ํด ์ ์ด๋ ๋ถ๋ถ์ ์ผ๋ก ์ ์ถ๋์ด์ผํ๋ค๋ ๊ฒ์ ๋๋ค.
TL; DR์ Into
๋ก ์ถ๋ก ํ๋ ๊ฒ์ด ๋ ์ด๋ ต๊ณ ํน์ฑ ์๋ฒ๊ฐ ์๋ํ๋ ๋ฐฉ์์ ๋ด์ฌ์ ์ธ ๋ฐฉ์์ผ๋ก ์ ์ฉ๋๋ค๋ ๊ฒ์
๋๋ค.
@KrishnaSannasi @ CAD97 ๊ฐ์ฌํฉ๋๋ค, ๋์์ด๋์์ต๋๋ค! Into
์ ๊ตฌํ์๋ฅผ ์๊ตฌ์ ์ผ๋ก ๋จ๊ฒจ๋๊ธฐ ๋๋ฌธ์ From
๊ธฐ๋ฐ์ผ๋กํ๋ ๋๋ฌด ๋ง์ ์์ ํ์ ๋ํด ์ฌ์ ํ ๊ฑฑ์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ถ๋ก ์ด ๊ฒฐ๊ตญ ๋ ๋์์ง ๊ฒ์ด๋ผ๋ ๊ธฐ๋๊ฐ ์์ต๋๊น? Into
์ธ๋ฐ์ด๋๋ฅผ ์ ํธํ๋ ์ง์นจ์ ๋ณ๊ฒฝํด์ผํฉ๋๊น? 1.41์ ์๋ก์ด ํน์ฑ ์ผ๊ด์ฑ ๊ท์น (๋ด ์๊ฐ ์)์ด ๋ ์ด์ Into
๋ง ๊ตฌํํ ์ด์ ๊ฐ ์์ผ๋ฉฐ ๋ชจ๋ impls ๋ฒ๊ทธ๋ฅผ ๊ณ ๋ คํ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ณ ์์ต๋๊น?
์ถ๋ก ์ด ์ถฉ๋ถํ๋ค๋ฉด ๋์ค์ Into
๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋ฐฉํฅ ํธํ์ด ๊ฐ๋ฅํด์ผํฉ๋๋ค. From
Into
์๋ฏธํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ฐ๋ฆฌ๊ฐ ๊นจ๋จ๋ฆด ์์๋ ์ต์
์ ์ํฉ์ ์ถ๋ก ์
๋๋ค.
์ด ( Try
ํธ๋ ์ด ํธ) ?
ํธ๋ ์ด ํธ์ Into
/ From
ํธ๋ ์ด ํธ๋ฅผ Try
๋ฅผ ๊ตฌํํ๋ ์ ํ์ ๋ํ ์ผ๋ฐ ๊ฒฝ๊ณ์ ํจ๊ป ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํฉ๋๊น? Result
์์ฒด)?
์ฆ, ?
ํ์ ๋๋ ํจ์์์๋ ๋ฐํ ์๋ฅผ ๋ค์ด impl Into<Result>
(์ ๋ ์ ํด๋ณด๋ฉด ์๋๋ ๊ฒ ๊ฐ๋์?)
๋๋ ์ด๊ฒ์ด ์์ ํ๋๋ ๊ฒ์๋ณด๊ณ ์ถ๋ค. ์ด ์ค๋ ๋์ # 70941์ ์ฝ์ ํ ์์ฝ์ด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฐ์ดํธ๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฉ "๊ฒฐ๊ณผ ๊ฐ"์ผ๋ก ์ณค๋คํด์ผํ๋ค "catch ๋ธ๋ก์ํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์๋" "์๋ก ํด๊ฒฐ"
์ด๋ฌํ ์ถ๋ก ๋ฌธ์ ์ ๋ํ ์๋ก์ด ์ฐ๋ ค๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์๋ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ISTM์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก์ด ๋ง์ง๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
try
๋ง์ถคํ ์ ํ ์ํธํ ๊ตฌ๋ฌธ์ ์ถ๊ฐํฉ๋๋ค.Result
์ ์ถ๊ฐ)try
๊ทธ๋๋ก ์์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ ํฅํ ๊ฐ์ ์์ํ ๊ตฌ๋ฌธ / ์๋ฏธ ์ ๊ณต๊ฐ์ ๋จ๊ฒจ ๋ก๋๋ค.(์ด๋ฌํ ์ต์ ์ค ์ผ๋ถ๋ ์ํธ ๋ฐฐํ์ ์ด์ง ์์ต๋๋ค.)
๊ด์ฌ์ ๊ฐ์ ธ ์ฃผ์ ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ์ด ๋ฉ์์ง๊ฐ ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
Type ascription์๋ ๋ง์ ๋ฌธ์ (๊ตฌ๋ฌธ ๋ฐ ๊ธฐํ)๊ฐ ์์ผ๋ฉฐ ์์ ํ๋ ๋งํ ๊ฒ๋์๊ณ ๊ณง ๊ตฌํ ๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ์ ํ ์ง์ ๊ตฌ๋ฌธ์์ try
๋ธ๋ก์ ์ฐจ๋จํ๋ ๊ฒ์ ์ ์ ํ์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
Result
๋ก์ ํด๋ฐฑ์ ๋์์ด ๋ ์ ์์ง๋ง ์ค๋ฅ ์ ํ์ ์ ํ ์ ์ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. try { expr? }?
(๋๋ ์ค์ ๋ก ๋ ๋ณต์กํ ๋ฑ๊ฐ๋ฌผ)์๋ .into()
๋ ๋ฒ์ ํธ์ถ์ด ์์ต๋๋ค. , ์ปดํ์ผ๋ฌ๊ฐ ์ค๊ฐ ์ ํ์ ๋๋ฌด ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
@ijackson ์ ์ฃผ๋๊ถ์ ๊ฐ์ง๊ณ ํ์ฌ ์ํ๋ฅผ ์์ฝ
๊ทธ๋ฌ๋ ์ ํ ์ง์ ๊ณผ ๊ด๋ จํ์ฌ ๊ตฌํ ๋ฌธ์ ๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฝ๊ฐ์ ๊ด์ฌ์ ๊ธฐ์ธ์ด๊ณ ๊ฒฐ์น์ ๊น์ง ๋ฐ์ด ๋ถ์ด๋ ์ข์ ํ๋ณด๊ฐ ๋ ์ ์์ต๋๋ค. ๊ตฌ๋ฌธ์ด๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋ํด ๋ง์ ๋ ผ๋์ด ์์๋์ง ๊ธฐ์ต์ด ๋์ง ์์ต๋๋ค.
2020 ๋ 8 ์ 5 ์ผ ์์์ผ 02:29:06 PM -0700์ Niko Matsakis๋ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ ํ ์ง์ ๊ณผ ๊ด๋ จํ์ฌ ๊ตฌํ ๋ฌธ์ ๊ฐ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ์ ์ฝ๊ฐ์ ๊ด์ฌ์ ๊ธฐ์ธ์ด๊ณ ๊ฒฐ์น์ ๊น์ง ๋ฐ์ด ๋ถ์ด๋ ์ข์ ํ๋ณด๊ฐ ๋ ์ ์์ต๋๋ค. ๊ตฌ๋ฌธ์ด๋ ์ด์ ์ ์ฌํ ๊ฒ์ ๋ํด ๋ง์ ๋ ผ๋์ด ์์๋์ง ๊ธฐ์ต์ด ๋์ง ์์ต๋๋ค.
์ ๊ฐ ํ์ํ๋ฏ์ด ์ฃผ๋ ๊ด์ฌ์ฌ๋ ์ ํ ์ง์ ์ ํ์ฉํ๋ ๊ฒ์ด ์์ต๋๋ค.
๋ชจ๋ ๊ณณ์์ ์๋นํ ๋ฌธ๋ฒ ๋ณํ๊ฐ ๋ฐ์ํ๊ณ ์ ์ฌ์ ์ผ๋ก
ํ๋๋ฅผ ์ ํํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๊ธฐ์ต ๋์ง ์์ต๋๋ค.
๋์ธ.
๊ฐ์ธ์ ์ผ๋ก ์ ๋ ์ธ์ฒด ๊ณตํ์ ๋ฌธ์ ๊ฐ ๊ทธ๋ ๊ฒ ๋์์ง ์์์ ์ง๊ธ์ด ๊ธฐ๋ฅ์ ์์ ํ ํ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํํ์ ์ ํ ๋น๋ฌธ์ด ์๋๋ผ๋ let ๋ฐ์ธ๋ฉ์ ๋์ ํ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ์ถํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๋๋๋ค.
๋ํ try
๋ธ๋ก์ ๋งคํฌ๋ก์์ ์ ์ฉ ํ ์ ์์ต๋๋ค. ํนํ @withoutboats ์ฐ์ํ fehler ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ try
์ procs ๋ณธ๋ฌธ์ ๋ํ ํ ์ ์๋ค๋ฉด ๋งคํฌ๋ก ์์คํ
์ ๊ฒฐํจ์ผ๋ก ์ธํ ๋ฌธ์ ๊ฐ ๋ ์ ์ ์ง ๊ถ๊ธํฉ๋๋ค.
try ๋ธ๋ก์ ๋ง์ด ์ฌ์ฉํ๊ณ ์ถ์ ๊ณณ์ด ์์ต๋๋ค. ์ ์ ๋์ผ๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋๋ ๋ผ์ธ์ ํตํด try ๋ธ๋ก์ ์ป๋ ๊ฒ์ด ํ์ํ๋ค๋ฉด ์ ๋์ ์ผ๋ก 100 % ํฌ์ ์ ํ์ ํฌ์ ํ ๊ฒ์ ๋๋ค. ๋๋ ์์ง "์ฌ๊ธฐ์ ํ์ ์ด ์คํฌ๋ฆฝ ์ ์ด ์์ผ๋ฉด ์ข๊ฒ ๋ค"๊ณ ๋งํ ์ํฉ์ ์ฒํด ์์ง๋ ์์ง๋ง ๊ฒฐ๊ตญ ์๋ ๋ธ๋ก์ ๋ง์ด ์๋ฎฌ๋ ์ด์ ํ๊ธฐ ์ํด IIFE๋ฅผ ์ํํ๊ฒ๋ฉ๋๋ค. ๋ค๋ฅธ ์ฅ๊ธฐ์ ์ด๊ณ ๋ถ์์ ํ ๊ธฐ๋ฅ๊ณผ ์ถฉ๋ํ๊ธฐ ๋๋ฌธ์ ์ฅ๊ธฐ์ ์ด๊ณ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋ถ์์ ํ๊ฒ ๋๋ ๊ฒ์ ์ ๋ง ๋ถํํ ์ํฉ์ ๋๋ค.
์ข ๋ ๊ตฌ์ฒด์ ์ผ๋ก ๋งํ๋ฉด Result๋ฅผ ๋ฐํํ๋ ํจ์ ๋ด๋ถ์์์ ๋์ด ์์ ์ ์ํํ์ง๋ง Option์ ๋ฐํํ๋ ์์ ์ ๋ํด ์ผ์ข ์ ์ฒ๋ฆฌ๋ฅผํ๊ณ ์ถ์ต๋๋ค. ์ฆ, ์ผ๋ฐ์ ์ผ๋ก Try๊ฐ ์์ ์ ์ด๋ผ๋ฉด try ๋ธ๋ก์ ์ ํธ ํ ๊ฒ์ ๋๋ค. ์ค์ ๋ก ๊ทธ๋ ๊ฒํ๊ธฐ ์ํด ์ฃผ ํจ์์์ ๋ฐํํ๊ณ ์ถ์ง๋ ์์ง๋ง ๋์ ์ฒด์ธ์์๋ ๊ฒ์ด ์์ผ๋ฉด ์ผ์ข ์ ๊ธฐ๋ณธ๊ฐ์ ์ ๊ณตํฉ๋๋ค. ์์. ์ด๊ฒ์ ์ง๋ ฌํ ์คํ์ผ ์ฝ๋์์ ๋์๊ฒ ๋ฐ์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ try ๋ธ๋ก๋ณด๋ค ํจ์ฌ ๋ ์์ฃผ ํ์ ์ด ์คํฌ๋ฆฝ ์ ์ ์ํ์ต๋๋ค (๋๋ก๋ ๋ ๋ค ์ํ์ง๋ง). ํนํ, ๋๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ด๊ฐ ์์ํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์ ํ์ ์ถ๋ก ํ๋ "์ ํ ๋๋ฒ๊น "์ผ๋ก ์ข ์ข ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋๊ฐ์ ์๋ก์ด let ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํด์ผํฉ๋๋ค. ์ด๋ ์ ๋ง๋ก ๋ฐฉํด๊ฐ๋๋ฉฐ rustfmt๊ฐ ์คํ ์ทจ์ ๊ธฐ๋ก์ ๊นจ๋จ๋ฆฌ๋ ์์ธ์ด๋ฉ๋๋ค. ๋์ฑ์ด, ํ์ ์ด ์คํฌ๋ฆฝ ์ ์ด ์ฌ๋ถ์ ํฐ๋ณด ํผ์ฌ๋ฅผ ํผํ ์์๋ ๊ณณ์ด ๋ง์ด ์์ต๋๋ค.
constrast์์๋ and_then ๋๋ ๋ค๋ฅธ ๊ฒฐํฉ์๋ฅผ ์ฌ์ฉํ์ฌ ์ข ๋ฃํ์ง ์๊ณ ์กฐ๊ธฐ์ ์ข ๋ฃ ํ ์ ์์ต๋๋ค. ์๋ง๋ ๊นจ๋ํ aa try ๋ธ๋ก์ ์๋์ง๋ง ๊ทธ๋ ๊ฒ ๋์์ง๋ ์์ต๋๋ค.
@steveklabnik @ mark-im Try ๋ธ๋ก๊ณผ ์ ํ ์ง์ ์ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ์ถฉ๋ํ์ง ์์ผ๋ฉฐ ํ ๊ธฐ๋ฅ ๋๋ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๋จ์ง try
๋ธ๋ก์ ๋น์ธ๊ฐ์ ์ธ ์ ํ ์ถ๋ก ์ค๋ฅ๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐํ ๋ ์ ํ ์ง์ ์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ง๋ง ์ผ๋ฐํ ๋ ์ ํ ์ง์ ์ ๋จ๊ธฐ์ ๊ธฐ๋ฅ์ด๋ ํ์คํ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐํ ๋ ์ ํ ์ง์ ์ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ง๋ค์ง ์์ ๊ฒ์์ ์๋ฏธํ์ง๋ ์์ต๋๋ค. ์กฐ์ฌ ํ ๊ฐ์น๊ฐ์๋ ํ ๊ฐ์ง ์ต์ ์ "์ธ์ ๊ฐ ์ผ๋ฐํ ๋ ์ ํ ์ง์ ์ด ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ผ๋ก ์์ํ๋ ๊ทธ๋๋ก ์๋๋ฅผ ์์ ํ"ํ๋ ๊ฒ์ ๋๋ค. ์ธ๊ธ ๋ ๋ชจ๋ ๊ฒ์ ์ ํ ์ง์ ์ ๋ํ ์์ ํ๋ฅผ ์ฐจ๋จํ์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค.
@ rust-lang / lang GitHub ๋ฐ ์ฌ๊ธฐ์์ ๋ ผ์๋๋ ๋ง์ ๋ค๋ฅธ ์ฃผ์ ์ ํ๊ณ๋ก ์ธํด์ด ์ค๋ ๋์์ ์ ํ ์ถ๋ก ์คํจ์ ๋์์ค๋ฅผ ์ดํดํ๊ธฐ๊ฐ ์กฐ๊ธ ์ด๋ ต๋ค๋ ๊ฒ์ ์ธ์ ํด์ผํฉ๋๋ค. ์ถ๋ก ์คํจ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฒฐ์ ์ ๋๋ฌํ๋ ๊ฒ์ด try ๋ธ๋ก์ด ์์ ํ๋๋ ๊ฒ์ ๋ง๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์์ด๋ฅผ ๋ ผ์ํ๊ธฐ ์ํด ํ์๋ฅผ ๊ฐ๊ณ ๋๊ตฐ๊ฐ ์ถ๋ก ๋ฌธ์ ์ ๋ํด ๊น์ด ์ดํดํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. .
์ ์๊ฒ ํ ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด,์ด ์ถ๋ก ๋ฌธ์ ๋ ํนํ Try
์์ ํ์ฉ ํ ๋ณํ ์ ์ฐ์ฑ ๋๋ฌธ์ ๋ฐ์ํฉ๋๊น? ๋๋ ๊ฒฐ์ ์ด ์ฃฝ์ ๋๊น์ง ๋
ผ์๋์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง, ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ Try
ํน์ฑ์ ์ ์๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์ ๋นํ ํ ์์๋ ์ ์ ํ ์๋ก์ด ์ ๋ณด์ฒ๋ผ ๋ณด์
๋๋ค.
@withoutboats ๋๋ Try
๋ณ๊ฒฝ ์ฌํญ์ด ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ๋๋ฌธ์ ์ด๋ ค์ธ ์ ์์์ด ๋ถ๋ช
ํด ์ก๋ค๊ณ ์๊ฐํฉ๋๋ค. @cramertj ๋ ํน์ Pin
impls, IIRC๋ฅผ ์ธ๊ธํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@ mark-im ์์ ํ ํ ํฉ๋ฆฌ์ ์ผ๋ก ์ด๋ํ ์ ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๋ด๊ฐ Ok-wrapping์ด๋ผ๊ณ ์๊ฐํ๋ ๊ฒ๋ง ํผ ๋์์ง๋ง, ๋น์ ์ด ๊ทธ๊ฒ์ ์ํ๋์ง ์๋์ง ์ถ์ธกํ๋ ค๊ณ ์๋ํ๋ ์ผ๊ด์ฑ์๋ Ok-wrapping์ ๋ ๋์ ๊ฒ์ ๋๋ค.