Rust: `ops::Try`에 대한 추적 묞제(`try_trait` Ʞ능)

에 만든 2017년 05월 31음  Â·  99윔멘튞  Â·  출처: rust-lang/rust

https://github.com/rust-lang/rfcs/pull/1859 의 Try 특성 ; PR https://github.com/rust-lang/rust/pull/42275 에서 구현되었습니닀

명확성을 위핎 https://github.com/rust-lang/rust/issues/31436 에서 분늬합니닀(https://github.com/rust-lang/rust/pull/42275#discussion_r119167966에 따띌).

  • [ ] 읎것을 안정화하멎 사람듀읎 Iterator::try_fold 륌 구현할 수 있습니닀.

    • [ ] 안정화의 음환윌로 PR #62606을 닀시 ì—Žì–Ž 반복자륌 위한 try_fold 구현을 묞서화합니닀.

    • [ ] 나쀑에 변겜하는 것읎 볞질적윌로 불가능하므로 닀륞 것듀의 Ʞ볞 구현에 원하는 장Ʞ DAG가 있는지 확읞하십시였. (구첎적윌로는 fold 가 try_fold ꎀ점에서 구현되얎 둘 ë‹€ 재정의할 필요가 없도록 하는 것읎 좋을 것입니닀.)

A-error-handling B-RFC-implemented B-unstable C-tracking-issue Libs-Tracked T-lang T-libs

가장 유용한 댓Ꞁ

읎 Ʞ능의 현재 상태는 묎엇입니까?

몚든 99 댓Ꞁ

몇 가지 자전거 볎ꎀ소:

  • 우늬는 ꎀ렚 형에게 전화륌 특정 의욕을 가지고 있습니까 Error 대신 Err ? Err 띌고 하멎 Result 와 정렬됩니닀. 닀륞 하나는 읎믞 Ok 입니닀.

  • 우늬가 별도의 필요에 대한 특정 의욕읎 있습니까 from_error 및 from_ok 대신에 닚음의, 방법을 from_result 더 대칭 될 것읎띌고 into_result 하는 것은 닀륞 것입니닀 특성의 절반?

( RFC 의 플레읎귞띌욎드 링크 업데읎튞 버전 )

@glaebhoerl

  • Error 대 Err 는 https://github.com/rust-lang/rust/issues/33417#issuecomment -269108968 및 https:// 에서 TryFrom 와 ꎀ렚하여 녌의되었습니닀 . github.com/rust-lang/rust/pull/40281; 비슷한 읎유로 여Ʞ에서 읎늄읎 선택되었닀고 가정합니닀.
  • 나는 귞것듀읎 서로 닀륞 용도륌 가지고 있Ʞ 때묞에 분늬되얎 있닀고 믿고, 누군가가 싀제로 Result 륌 가지고 있고 T:Try 로 바꟞렀고 하는 겜우는 드묌 것윌로 예상합니닀. 나는 항상 Try::from_result(Ok( 와 Try::from_result(Err( 혞출하는 것볎닀 Try::from_ok 와 Try::from_error 륌 선혞하며, 맀치륌 작성하는 것볎닀 두 가지 방법을 간닚하게 구현하게 되얎 Ʞ쁩니닀. 아마도 into_result 륌 Into<Result> 가 아니띌 "통곌했습니까? 싀팚했습니까?"띌고 생각하Ʞ 때묞음 것입니닀. 특정 유형은 쀑요하지 않은 구현 섞부 사항윌로 Result 입니닀. (저는 "생산 가치 대 ì¡°êž° 반환에 대한 새로욎 유형읎 있얎알 합니닀.) 제안하거나 재개하고 싶지 않습니닀. 귞늬고 묞서화의 겜우 from_error 가 ? 대핮 말하는 것을 좋아합니닀 throw )읞 반멎 from_ok 둘 ë‹€ 동음한 방법윌로 사용하는 대신 성공 랩핑(#41414)에 대핮 읎알Ʞ합니닀.

읎것읎 읎 댓Ꞁ에 대한 올바륞 포럌읞지 확싀하지 않습니닀. 귞렇지 않은 겜우 늬디렉션핎 죌섞요. 슀마음늬:. 아마도 읎것은 https://github.com/rust-lang/rfcs/pull/1859 에 있얎알 했고 댓Ꞁ Ʞ간을 놓쳀습니닀. 앗!


Try 튞레잇을 분할하거나 into_result 메소드륌 제거하는 겜우가 있는지 궁ꞈ합니닀. 나에게 현재 Try 는 FromResult ( from_error 및 from_ok ) 및 IntoResult ( into_result 포핚)의 합곌 닀소 비슷합니닀 from_error into_result ).

FromResult 는 ? 연산자로 맀우 읞첎공학적읞 ì¡°êž° 종료륌 가능하게 하며, 읎것읎 읎 Ʞ능의 킬러 사용 사례띌고 생각합니닀. IntoResult 는 읎믞 사용 사례별 메서드나 Into<Result> 로 깔끔하게 구현할 수 있닀고 생각합니닀. 몇 가지 유용한 예가 누띜 되었습니까?

Try 특성 RFC 에 따띌 expr? 는 닀음곌 같읎 섀탕을 제거할 수 있습니닀.

match expr { // Removed `Try::into_result()` here.
    Ok(v) => v,
    Err(e) => return Try::from_error(From::from(e)),
}

ë‚Žê°€ 고렀한 동Ʞ 부여 예는 Future 및 Option 입니닀.

믞래

닀음곌 같읎 struct FutureResult: Future 대핮 FromResult 자연슀럜게 구현할 수 있습니닀.

impl<T, E> FromResult for FutureResult {
    type Ok = T;
    type Error = E;
    fn from_error(v: Self::Error) -> Self {
        future::err(v)
    }
    fn from_ok(v: Self::Ok) -> Self {
        future::ok(v)
    }
}

Result::Err 적용될 때 impl Future 값 핚수에서 반환되는 ? 대한 합늬적읞 구현을 가정하멎 닀음곌 같읎 작성할 수 있습니닀.

fn async_stuff() -> impl Future<V, E> {
    let t = fetch_t();
    t.and_then(|t_val| {
        let u: Result<U, E> = calc(t_val);
        async_2(u?)
    })
}
fn fetch_t() -> impl Future<T, E> {}
fn calc(t: T) -> Result<U,E> {}

귞것읎 바로 ë‚Žê°€ 였늘 음찍 구현하렀고 했던 것읎고 Try 귞것을 못박았습니닀! 귞러나 우늬가 구현하렀고하는 겜우 현재 Try 에 대핮 Future 아마도 ì–Žë–€ 표쀀 선택읎 into_result ; 팹닉, ì°šë‹š 또는 폎링을 한 번 하는 것읎 유용할 수 있지만 읎 쀑 얎느 것도 볎펞적윌로 유용한 것 같지 않습니닀. into_result 에 Try 없윌멎 위와 같읎 ì¡°êž° 종료륌 구현할 수 있윌며 Future 륌 Result 로 변환핎알 하는 겜우 몚든 Try ) 적절한 방법윌로 변환할 수 있습니닀(ì°šë‹ší•  wait 메서드 혞출, poll_once() -> Result<T,E> 혞출 등).

옵션

Option 도 비슷한 겜우입니닀. 우늬는 구현 from_ok , from_err 자연슀럜게 같읎 Try 특성 RFC 및 변환 할 수 Option<T> 에 Result<T, Missing> 닚지와 o.ok_or(Missing) 또는 펞늬한 방법 ok_or_missing .


도움읎 되Ʞ륌 바랍니닀!

나는 읎 몚든 음에 맀우 늊었을 수도 있지만 읎번 죌말에 ? 에 _success_ 륌 닚띜시킀렀는 겜우에 대비핎 닀소 자연슀러욎 의믞가 있닀는 생각읎 듀었습니닀.

fn fun() -> SearchResult<Socks> {
    search_drawer()?;
    search_wardrobe()
}

귞러나 읎 겜우 Try 특성 메서드의 읎늄읎 맞지 않습니닀.

귞러나 ? 연산자의 의믞륌 확장합니닀.

try_fold for rayon 을 프로토타읎핑할 때 Consumer::full() 메서드에 대핮 Try::is_error(&self) 같은 것을 원했습니닀. (Rayon은 소비자가 Ʞ볞적윌로 í‘žì‹œ 슀타음 반복자읎Ʞ 때묞에 읎것을 가지고 있지만 우늬는 여전히 였류륌 닚띜시킀고 싶습니닀.) 대신 Result::is_err() 혞출할 수 있도록 쀑간 값을 Result<T::Ok, T::Err> 로 저장핎알 했습니닀.

거Ʞ에서 Try::from_result 가 ê²°êµ­ T 로 돌아가Ʞ륌 원했지만 match 는 T::from_ok 및 T::from_error 맀핑되었습니닀. 나쁘지 _않습니닀.

Try 특성은 from_ok 및 from_error 가 필요한 겜우 읞첎 공학을 위한 from_result 방법을 제공할 수 있습니닀. 혹은 ê·ž 반대로도. 죌얎진 예에서 나는 두 가지륌 몚두 제공하는 겜우륌 뎅니닀.

PR #42275가 병합되었윌므로 읎 묞제가 핎결되었습니까?

@skade 유형은 LoopState 가 음부 Iterator 낎부에 대핮 수행하는 것곌 같읎 닚띜 회로륌 정의할 수 있습니닀. 아마도 Try 가 성공읎나 싀팚 대신 "계속 또는 쀑닚"에 대핮 읎알Ʞ했닀멎 더 자연슀러욞 것입니닀.

@cuviper ê²°êµ­ 필요한 버전 은 Ok 유형 또는 Error -in-original 유형읎었습니닀. 나는 destructure-and-rebuild가 충분히 음반적읎고 최적화가 잘되고 특성에 대한 많은 특별한 방법읎 필요하지 않Ʞ륌 바랍니닀.

@ErichDonGubler 읎것은 추적 묞제읎므로 핎당 윔드가 안정될 때까지 핎결되지 않습니닀.

겜험 볎고서:

나는 읎 특성을 싀행에 옮Ʞ렀고 하는 것에 앜간 좌절했닀. 지ꞈ 여러 번 ì–Žë–€ 읎유로든 Result 대한 고유한 변형을 정의하고 싶지만 ê²°êµ­ Result 륌 사용하게 될 때마닀 대부분 Try 구현하Ʞ 때묞에 음읞지 아닌지 나는

예시:

Chalk VM용 새 솔버에서 "가닥"을 풀 때의 결곌륌 나타낮는 엎거형을 갖고 싶었습니닀. 여Ʞ에는 ë„€ 가지 가능성읎 있습니닀.

enum StrandFail<T> {
    Success(T),
    NoSolution,
    QuantumExceeded,
    Cycle(Strand, Minimums),
}

나는 ? 읎 엎거형에 적용될 때 "성공"을 풀Ʞ륌 원했지만 닀륞 몚든 싀팚는 위쪜윌로 전파했습니닀. 귞러나 Try 특성을 구현하렀멎 였류 사례만 캡슐화하는 음종의 "잔여" 유형을 정의핎알 했습니닀.

enum StrandFail {
    NoSolution,
    QuantumExceeded,
    Cycle(Strand, Minimums),
}

하지만 음닚 읎 유형읎 있윌멎 StrandResult<T> 별칭을 만듀 수도 있습니닀.

type StrandResult<T> = Result<T, StrandFail>;

귞늬고 읎것읎 ë‚Žê°€ 한 음입니닀.

읎제 읎것읎 닚음 엎거형을 갖는 것볎닀 반드시 나빠 볎읎지는 않지만 앜간 읎상하게 느껎집니닀. 음반적윌로 예륌 듀얎 핚수에 대한 묞서륌 작성할 때 결곌륌 "ok" 및 "error"로 "귞룹화"하지 않고 "같음"윌로 닀양한 가능성에 대핮 읎알Ʞ합니닀. 예륌 듀얎:

    /// Invoked when a strand represents an **answer**. This means
    /// that the strand has no subgoals left. There are two possibilities:
    ///
    /// - the strand may represent an answer we have already found; in
    ///   that case, we can return `StrandFail::NoSolution`, as this
    ///   strand led nowhere of interest.
    /// - the strand may represent a new answer, in which case it is
    ///   added to the table and `Ok` is returned.

ë‚Žê°€ " Err(StrandFail::NoSolution) 반환합니닀. 읎것은 Err ë‚Žê°€ 추가핎알 하는 읎 성가신 아티팩튞처럌 느껎지Ʞ 때묞입니닀.

(반멎에 현재 정의는 독자가 Try impl을 찞조하지 않고 ? 의 동작읎 묎엇읞지 알 수 있도록 도와쀍니닀.)

읎 결곌가 귞늬 놀띌욎 것은 아니띌고 생각합니닀. 현재 Try impl 은 Result 와 동형읞 항목에 ? 륌 사용하도록 강제합니닀. 읎 균음성은 우연읎 아니지만 결곌적윌로 Ʞ볞적윌로 "닚지 Result "가 아닌 것듀곌 핚께 ? 륌 사용하는 것을 성가시게 만듭니닀. (ê·ž 묞제는 Ʞ볞적윌로 NoneError 발생하는 것곌 동음한 묞제입니닀 -- Option 의 "싀팚"륌 나타낎Ʞ 위핎 유형을 읞위적윌로 정의핎알 할 필요가 있습니닀.)

나는 또한 StrandFail 겜우 볎통의 결곌가 얻는 From::from 변환을 원하지 않습니닀.

연결된 Try::Error 유형읎 사용자에게 직접 녞출/사용된 적읎 있습니까? 아니멎 ? 디슈가링의 음부로 필요합니까? 후자의 겜우, 귞냥 "구조적"을 정의하는 싀제 묞제가 표시되지 않습니닀 - type Error = Option<Option<(Strand, Minimums)>> 읎든 뭐든. ( enum 정의의 "싀팚 절반"에 핎당하는 구조륌 파악핎알 하는 것은 좋지 않지만 전첎 공개 API륌 재지거핎알 하는 것볎닀 덜 성가신 것 같습니닀.)

저도 따띌하지 않습니닀. 낎부 였류 표현읎 있는 유형에 대핮 Try륌 성공적윌로 구현했윌며 Ok 및 Error 가 동음한 유형읞 것읎 자연슀럜습니닀. 여Ʞ에서 구현을 볌 수 있습니닀: https://github.com/kevincox/ecl/blob/8ca7ad2bc4775c5cfc8eb9f4309b2666e5163e02/src/lib.rs#L298 -L308

싀제로 읎 작업을 수행하Ʞ 위한 상당히 ê°„ë‹ší•œ 팚턎읎 있는 것 같습니닀.

impl std::ops::Try for Value {
    type Ok = Self;
    type Error = Self;

    fn from_ok(v: Self::Ok) -> Self { v }
    fn from_error(v: Self::Error) -> Self { v }
    fn into_result(self) -> Result<Self::Ok, Self::Error> {
        if self.is_ok() { Ok(val) } else { Err(val) }
    }
}

성공을 풀고 싶닀멎 닀음곌 같읎 작동핎알 합니닀.

impl std::ops::Try for StrandFail<T> {
    type Ok = T;
    type Error = Self;

    fn from_ok(v: Self::Ok) -> Self { StrandFail::Success(v) }
    fn from_error(v: Self::Error) -> Self { v }
    fn into_result(self) -> Result<Self::Ok, Self::Error> {
        match self {
            StrandFail::Success(v) => Ok(v),
            other => Err(other),
        }
    }
}

구조적 유형을 정의하는 것은 가능하지만 ꜀ 성가신 느낌읎 듭니닀. Self 사용할 수 있닀는 데 동의합니닀. 귞런 닀음 StrandResult 에서 Result<_, StrandResult> 등윌로 변환하Ʞ 위핎 ? 륌 사용할 수 있닀는 것은 나에게 앜간 읎상하게 느껎집니닀.

훌륭한 겜험 볎고서, @nikomatsakis! 나는 또한 Try (닀륞 방향에서) 불만족했습니닀.

TL/DR : FoldWhile 읎 말읎 맞닀고 생각합니닀. Break -vs- Continue ? 핎석에 대핮 읎알Ʞ하는 대신 귞것은 였류 잡멎에서.

더 Ꞟ게:

나는 ? 가 너묎 펞늬하Ʞ 때묞에 "였류"볎닀 "성공"에 더 가까욎 것에 Err 륌 계속 사용합니닀.

  • try_fold 륌 사용하여 position (및 Ʞ타 여러 반복자 메서드) Result (낮 두뇌는 find Err 것을 찟는 것 ) 대신 Break 및 Continue 변형 윌로 나만의

  • itertools 에서 tree_fold1 륌 작성할 때 낎부 핚수가 항상 Err 반환 하는 읎상한 None 가 Iterator::next() 의 "였류" 띌는 읎상한 연결 끊김읎 있지만 동시에 끝까지 도달핎알 하Ʞ 때묞에 fold 의 "성공"입니닀. 수행 할. 귞늬고 ? (Rust 1.12에서 컎파음핎알 하므로 핎당 윔드에서 try! ) 륌 사용하여 종료 조걎을 전파하는 것읎 맀우 펞늬합니닀.

따띌서 닀륞 것읎 아니띌멎 Try 대핮 작성한 섀명 읎 잘못되었닀고 생각하고 "성공/싀팚 읎분법"에 대핮 읎알Ʞ핎서는 안되며 "였류"에서 추상화핎알 합니닀.

ë‚Žê°€ 생각한 또 닀륞 것은 Try 대핮 앜간 믞친 impls륌 고렀핎알 한닀는 것입니닀. 예륌 듀얎, Ordering: Try<Ok = (), Error = GreaterOrLess> 는 "핚수 시도"와 결합되얎 struct Foo<T, U> { a: T, b: U } 에 대한 cmp 륌 허용할 수 있습니닀.

fn cmp(&self, other: &self) -> Ordering try {
    self.a.cmp(&other.a)?;
    self.b.cmp(&other.b)?;
}

나는 귞것읎 좋은 종류의 믞친 것읞지 나쁜 종류읞지 아직 몚늅니닀.웃음: 하지만 음닚 묌걎읎 닀륎멎 귞것듀읎 닀륎닀는 것을 알 수 있Ʞ 때묞에 확싀히 우아핚읎 있습니닀. 귞늬고 ê·ž 양쪜에 "성공"읎나 "였류"륌 할당하렀는 시도는 잘 맞지 않는 것 같습니닀.

또한 "였류 변환"읎 도움읎 되지 않는 또 닀륞 겜우입니닀. 나는 또한 위의 "I want ? but it's not error" 예제에서 사용한 적읎 없습니닀. 귞늬고 귞것은 확싀히 추론의 슬픔을 유발하는 것윌로 알렀젞 있윌므로 결곌로만 제한되얎알 하는 것(또는 잠재적윌로 제거되얎 .map_err(Into::into) 읎지만 싀행 불가능할 수 있음)읞지 궁ꞈ합니닀.

펞집: 아, 귞늬고 "낮 였류 유형에 대핮 Try 륌 구현하는 대신 였류에 대핮 계속 결곌륌 사용합니닀"에 대한 대답읎 "좋습니닀. 예상한 것입니닀"읞지 궁ꞈ합니닀.

펞집 2: 읎것은 위의 https://github.com/rust-lang/rust/issues/42327#issuecomment -318923393곌 닀늅니닀.

펞집 3: Continue 변형읎 https://github.com/rust-lang/rfcs/pull/1859#issuecomment -273985250에서도 제안된 것 같습니닀.

낮 2섌튞:

나는 @fluffysquirrels 의 특성을 두 특성윌로 분할하는 제안을 좋아합니닀. 하나는 결곌로 변환하Ʞ 위한 것읎고 닀륞 하나는 결곌에서 변환하Ʞ 위한 것입니닀. 귞러나 나는 우늬가 디슈가링의 음부로 into_result 또는 읎에 상응하는 것을 유지핎알 한닀고 생각합니닀. 귞늬고 읎 시점에서 Option 륌 Try 읎후 안정화되얎알 한닀고 생각합니닀.

나는 또한 @scottmcm 의 였류/확읞읎 아닌 쀑닚/계속을 제안하는 읎늄을 사용하는 아읎디얎륌 좋아합니닀.

여Ʞ에 특정 윔드륌 넣윌렀멎 닀음곌 같읎 읜는 것읎 좋습니닀.

https://github.com/rust-lang/rust/blob/ab8b961677ac5c74762dcea955aa0ff4d7fe4915/src/libcore/iter/iterator.rs#L1738 -L1746

묌론 직선 룚프만큌 좋지는 않지만 "방법 시도"륌 사용하멎 가깝습니닀.

self.try_for_each(move |x| try { 
    if predicate(&x) { return LoopState::Break(x) } 
}).break_value() 

비교륌 위핎 "였류 얎휘" 버전읎 정말 였핎의 소지가 있음을 발견했습니닀.

self.try_for_each(move |x| { 
    if predicate(&x) { Err(x) } 
    else { Ok(()) } 
}).err() 

NoneError에 대한 디슀플레읎륌 구현할 수 있습니까? 싀팚 상자가 자동윌로 From<NoneError> for failure::Error 파생하도록 허용합니닀. https://github.com/rust-lang-nursery/failure/issues/61 ì°žì¡°
3쀄 변겜읎 되얎알 하는데 RFC 등의 곌정을 잘 몚륎겠습니닀.

@cowang4 지ꞈ은 결곌와 옵션을 더 읎상 혌합하지 않윌렀고 합니닀. 유형읎 불안정하여 옵션을 계속 ì—Žì–Ž 두는 것읎 대부분읎Ʞ 때묞입니닀. Try 의 디자읞곌 디슈가륌 NoneError 가 필요하지 않은 디자읞윌로 바Ꟍ닀고 핮도 나는 놀띌지 않을 것입니닀 ...

@scottmcm 알겠습니닀. 너의 의도륌 알 ê² ì–Ž. 나는 ê²°êµ­ 띌읎람러늬 핚수가 None을 반환할 때 Err을 반환하는 팚턎을 깔끔하게 만드는 방법을 원합니닀. Try 읎왞의 닀륞 것을 알고 있습니까? 예시:

fn work_with_optional_types(pb: &PathBuf) -> Result<MyStruct, Error> {
    if let Some(filestem) = pb.file_stem() {
        if let Some(filestr) = filestem.to_str() {
            return Ok(MyStruct {
                filename: filestr.to_string()
            });
        }
     }
    Err(_)
}

읎 싀험적읞 Ʞ능곌 failure 상자륌 찟은 후 자연슀럜게 닀음 사항에 끌렞습니닀.

use failure::Error;
fn work_with_optional_types(pb: &PathBuf) -> Result<MyStruct, Error> {
    Ok({
        title: pb.file_stem?.to_str()?.to_string()
    })
}

읎전에 얞꞉한 것처럌 impl Display for NoneError 가 없닀는 점을 제왞하고는 _거의_ 작동합니닀.
귞러나 읎것읎 우늬가 원하는 구묞읎 아닌 겜우 팚턎을 닚순화하는 닀륞 핚수/맀크로가 있을 수 있습니닀.

if option.is_none() {
    return Err(_);
}

@cowang4 Display 륌 구현한 고유한 유형을 사용하는 failure::Error 대핮 From<NoneError> 륌 구현했닀멎 작동할 것읎띌고 생각합니닀.

귞러나 opt.ok_or(_)? 륌 사용하는 것읎 더 나은 방법음 수 있윌므로 Option읎 None읞 겜우 였류가 묎엇읞지 명시적윌로 말할 수 있습니닀. 예륌 듀얎, to_str() 가 None을 반환하는 겜우와 pb.file_stem 가 None읞 겜우 닀륞 였류가 필요할 수 있습니닀.

@tmccombs 낮 자신의 였류 유형을 만듀렀고 시도했지만 잘못했을 것입니닀. 닀음곌 같았습니닀.

#[macro_use] extern crate failure_derive;

#[derive(Fail, Debug)]
#[fail(display = "An error occurred.")]
struct SiteError;

impl From<std::option::NoneError> for SiteError {
    fn from(_err: std::option::NoneError) -> Self {
        SiteError
    }
}

fn build_piece(cur_dir: &PathBuf, piece: &PathBuf) -> Result<Piece, SiteError> {
    let title: String = piece
        .file_stem()?
        .to_str()?
        .to_string();
    Ok(Piece {
        title: title,
        url: piece
            .strip_prefix(cur_dir)?
            .to_str()
            .ok_or(err_msg("tostr"))?
            .to_string(),
    })
}

귞런 닀음 낮 였류 유형을 사용핎 볎았습니닀 ...

error[E0277]: the trait bound `SiteError: std::convert::From<std::path::StripPrefixError>` is not satisfied
   --> src/main.rs:195:14
    |
195 |           url: piece
    |  ______________^
196 | |             .strip_prefix(cur_dir)?
    | |___________________________________^ the trait `std::convert::From<std::path::StripPrefixError>` is not implemented for `SiteError`
    |
    = help: the following implementations were found:
              <SiteError as std::convert::From<std::option::NoneError>>
    = note: required by `std::convert::From::from`

error[E0277]: the trait bound `SiteError: std::convert::From<failure::Error>` is not satisfied
   --> src/main.rs:195:14
    |
195 |           url: piece
    |  ______________^
196 | |             .strip_prefix(cur_dir)?
197 | |             .to_str()
198 | |             .ok_or(err_msg("tostr"))?
    | |_____________________________________^ the trait `std::convert::From<failure::Error>` is not implemented for `SiteError`
    |
    = help: the following implementations were found:
              <SiteError as std::convert::From<std::option::NoneError>>
    = note: required by `std::convert::From::from`

좋아, 방ꞈ 닀륞 였류 유형에서 낮 였류로 변환하는 방법을 알고 싶얎한닀는 것을 깚달았습니닀. 읎 였류는 음반적윌로 작성할 수 있습니닀.

impl<E: failure::Fail> From<E> for SiteError {
    fn from(_err: E) -> Self {
        SiteError
    }
}

아니요...

error[E0119]: conflicting implementations of trait `std::convert::From<SiteError>` for type `SiteError`:
   --> src/main.rs:183:1
    |
183 | impl<E: failure::Fail> From<E> for SiteError {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: conflicting implementation in crate `core`:
            - impl<T> std::convert::From<T> for T;

알겠습니닀. std::error::Error 얎떻습니까?

impl<E: std::error::Error> From<E> for SiteError {
    fn from(_err: E) -> Self {
        SiteError
    }
}

귞것도 작동하지 않습니닀. 부분적윌로는 낮 From<NoneError> 와 충돌하Ʞ 때묞입니닀.

error[E0119]: conflicting implementations of trait `std::convert::From<std::option::NoneError>` for type `SiteError`:
   --> src/main.rs:181:1
    |
175 | impl From<std::option::NoneError> for SiteError {
    | ----------------------------------------------- first implementation here
...
181 | impl<E: std::error::Error> From<E> for SiteError {
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `SiteError`
    |
    = note: upstream crates may add new impl of trait `std::error::Error` for type `std::option::NoneError` in future versions

NoneError 읎 std::error::Error 구현하지 않았닀고 생각했Ʞ 때묞에 읎상합니닀. 낮 비 음반 impl From<NoneError> 죌석 처늬하멎 닀음을 얻습니닀.

error[E0277]: the trait bound `std::option::NoneError: std::error::Error` is not satisfied
   --> src/main.rs:189:25
    |
189 |       let title: String = piece
    |  _________________________^
190 | |         .file_stem()?
    | |_____________________^ the trait `std::error::Error` is not implemented for `std::option::NoneError`
    |
    = note: required because of the requirements on the impl of `std::convert::From<std::option::NoneError>` for `SiteError`
    = note: required by `std::convert::From::from`

몚든 From 수동윌로 작성핎알 합니까? 나는 싀팚 상자가 귞것듀을 읎끌얎 낎알한닀고 생각 했습니까?

아마도 option.ok_or() 고수핎알 할 것입니닀.

몚든 From을 수동윌로 작성핎알 합니까? 나는 싀팚 상자가 귞것듀을 읎끌얎 낎알한닀고 생각 했습니까?

저는 싀팚 상자가 귞렇게 하지 않는닀고 생각합니닀. 하지만 ë‚Žê°€ 틀멮 수 있습니닀.

좋아, 귞래서 나는 싀팚 상자륌 닀시 조사했고 묞서와 닀륞 버전을 올바륎게 읜고 있닀멎 Result 의 였류 유형윌로 항상 failure::Error 륌 사용하도록 섀계되었습니닀. 여Ʞ륌 찞조하십시였 . 귞늬고 대부분의 였류 유형에 대핮 포ꎄ적읞 impl Fail 특성을 구현합니닀.

impl<E: StdError + Send + Sync + 'static> Fail for E {}

https://github.com/rust-lang-nursery/failure/blob/master/failure-1.X/src/lib.rs#L218

귞늬고 impl From 하여 Try / ? 닀륞 였류(std의 였류와 같은)륌 가장 쀑요한 failure::Error 유형윌로 만듀 수 있습니닀.
rust impl<F: Fail> From<F> for ErrorImpl
https://github.com/rust-lang-nursery/failure/blob/d60e750fa0165e9c5779454f47a6ce5b3aa426a3/failure-1.X/src/error/error_impl.rs#L16

닀만, 읎 녹 묞제와 ꎀ렚된 였류 NoneError 는 싀험적읎므로 Display 특성을 구현하지 ì•Šêž° 때묞에 아직 자동윌로 변환할 수 없습니닀. 귞늬고 Option 와 Result 사읎의 겜계가 흐렀지Ʞ 때묞에 원하지 않습니닀. 결국에는 몚두 재작업되고 정늬될 것읎지만 지ꞈ은 ë‚Žê°€ 배욎 섀탕 제거 Ʞ술을 고수할 것입니닀.

도와죌신 몚든 분듀께 감사드늜니닀. 천천히 Rust륌 배우고 있습니닀! :웃닀:

나는 ë‚Žê°€ 배욎 묎섀탕 Ʞ술을 고수할 것입니닀.

:+1: 솔직히 말핎서 .ok_or(...)? 는 계속 갈 Ꞟ읎띌고 생각합니닀(또는 .ok_or_else(|| ...)? , 묌론). NoneError _had_ Display impl 겜우에도 뭐띌고 할까요? "뭔가 없었얎"? 큰 였류는 아니지만...

구첎적읞 제안에 한걞음 더 닀가가렀 하닀니...

TrySuccess 대안읎 마음에 듀Ʞ 시작했습니닀. 흥믞롭게도 저륌 포핚한 _아묎도_는 원래 귞것을 좋아했닀고 생각합니닀. RFC의 최종 버전에도 없습니닀. 귞러나 닀행히도 귞것은 역사에서 ì‚Žì•„ : https://github.com/rust-lang/rfcs/blob/f89568b1fe5db4d01c4668e0d334d4a5abb023d8/text/0000-try-trait.md#using -an ꎀ렚-유형에 대한 - 더 - 성공 -값

가장 큰 반대는 연ꎀ된 유형( trait TrySuccess { type Success; } )에 대한 전첎 핵심 특성읎 곌도하닀는 합늬적읞 불만읎었습니닀. 귞러나 catch try (https://github.com/rust-lang/rust/issues/41414#issuecomment-373985777) ok-wrapping(RFC에서와 같읎)을 수행할 수 있습니닀. , 갑자Ʞ 직접적읎고 쀑요한 용도가 있습니닀. 읎것읎 바로 래핑을 제얎하는 ​​특성입니닀. " ? 는 항상 동음한 유형을 생성핎알 핹"읎띌는 목표와 핚께 음반적윌로 원한닀고 생각하는 목표와 핚께 특성읎 묎게륌 더 잘 유지하는 것 같습니닀. 슀튞로맚:

trait TryContinue {
    type Continue;
    fn from_continue(_: Self::Continue) -> Self;
}

? 연산자에서 반환되는 ꎀ렚 유형도 분명히 졎재핎알 하는 유형입니닀. 읎는 Niko가 분명히 말한 "음종의 '잔여' 유형을 정의핎알 하는" 성가심을 치지 않는닀는 것을 의믞합니닀. 귞늬고 () 것은 합늬적읎고 음반적읎Ʞ 때묞에 NoneError 와 같은 비틀늌을 플합니닀.

펞집: 자전거 볎ꎀ소의 겜우 "반환"읎 좋은 닚얎음 수 있습니닀. try 메서드(음명 ok-wrapping)에서 return 가 발생하Ʞ 때묞입니닀. return 는 읎것에 대한 몚나드 연산자 읎늄 읎Ʞ도 합니닀. iiuc...

펞집 2: 닀륞 특성/방법에 대한 낮 생각은 아직 안정화되지 않았습니닀. @tmccombs.

@scottmcm 귞냥 명확하게, 아니멎 닀음 두 가지 특성을 제안합니까?

trait TryContinue {
  type Continue;
  fn from_continue(_: Self::Continue) -> Self;
}

trait Try<E>: TryContinue {
  fn try(self) -> Result<Self::Continue, E>
}

귞늬고 x? desuguring은 닀음곌 같습니닀.

x.try() match {
    Ok(c) => c,
   Err(e) => throw e // throw here is just a placeholder for either returning or breaking out of a try block
}

try { ...; expr} 는 닀음곌 같읎 섀탕을 제거합니닀.

{ 
    ...
    TryContinue::from_continue(expr);
}

@scottmcm 저도 ok-wrapping을 고렀할 때 ê·ž 변형읎 훚씬 더 맀력적읎띌는 것을 알았습니닀 =)

닀음 특성윌로 계속 진행하멎 ? 대한 특성은 닀음곌 같습니닀(몚듈로 대규몚 자전거 읎동).

trait Try<Other: TryContinue = Self>: TryContinue + Sized {
    fn check(x: Other) -> ControlFlow<Other::Continue, Self>;
}

enum ControlFlow<C, B> {
    Continue(C),
    Break(B),
}

닀양한 귌거:

  • 읎 필요 TryContinue 의 유형 읞수 유형에 대한 있도록 x? 표현읎 항상 동음
  • 동음한 유형을 검사하고 반환하는 try_fold 와 같은 ê°„ë‹ší•œ 겜우에 type 맀개변수의 Ʞ볞값읎 Self 읎므로 T: Try 됩니닀.
  • 읎 특성은 TryContinue 확장합니닀. 늬턎 유형윌로 사용된 유형읎 볞묞에 ? 륌 허용하멎 ok-wrapping도 지원핎알 하Ʞ 때묞입니닀.
  • 새로욎 엎거형은 결곌와 동형읎지만 위에서 녌의한 바와 같읎 "였류"의 ꎀ점에서 말하는 것을 플하고 결곌적윌로 각 변형에 대핮 맀우 명확한 의믞륌 제공한닀고 생각합니닀.
  • ? 대한 읞수는 음반 유형읎므로 TryContinue 와 같읎 "ì–Žë–€ 것에서 Self 륌 생성"합니닀.

try{} / ? 대한 맀크로 및 Option , Result 및 Ordering 대한 impls륌 포핚한 전첎 개념 슝명 데몚: https ://play.rust-lang.org/?gist=18663b73b6f35870d20fd172643a4f96&version=stable ( 1 년 전에 쀀 @nikomatsakis 에게 감사드늜니닀 🙂)

닚점:

  • ë‚Žê°€ 정말 좋아하지 않는 Result impl에 여전히 팬텀 유형 맀개변수가 있습니닀.

    • 귞러나 Ordering impl에 추가 LessOrGreater 유형읎 필요하지 않은 것에 대한 좋은 절충안음 수 있습니닀.

    • 귞늬고 impls의 팬텀 유형 맀개변수는 얎욌든 유형볎닀 덜 까닀롭습니닀.

  • 음ꎀ된 From 변환을 제공하지 않음

    • 귞러나 StrandResult 는 얎욌든 상ꎀ하지 ì•Šêž° 때묞에 좋을 수 있습니닀 SearchResult 와 같은 항목의 겜우 쀑닚 겜로가 성공 겜로읎Ʞ 때묞에 읎상할 수 있윌며 ê²°êµ­ 추론에 도움읎 될 수 있습니닀. 얎욌든 쀑첩된 ? 쌀읎슀.

  • throw 구묞읎 묎엇읞지 명확하지 않습니닀.

    • ë‚Žê°€ 정말 좋아하는 Ok(x) => x, Err(r) => throw e.into() 로 ? 대한 섀명을 잃습니닀.

    • 귞러나 throw; 가 None ( impl<T> Throw<()> for Option<T> 와 같은 것을 통핎)을 생성하는 방법읎 될 수도 있습니닀. 읎는 throw NoneError; 볎닀 훚씬 낫습니닀.

    • 귞늬고 throw LessOrGreater::Less 는 _정말_ 얎늬석었을 것읎Ʞ 때묞에 귞것을 분늬하는 것은 얎욌든 좋을 수 있습니닀.

펞집: Ping @glaebhoerl , RFC 1859의 큰 찞가자로서 읎에 대한 의견을

펞집 2: https://github.com/rust-lang/rfcs/pull/1859#issuecomment -287402652의 읎 진술에 대핮 @colin-kiegel도

나는 볞질죌의적 접귌읎 위의 목표륌 희생하지 않윌멎서 환원죌의자듀의 우아핚을 음부 받아듀음 수 있는지 궁ꞈ합니닀.

나는 ê·ž 제안읎 정말 마음에 ë“ ë‹€.

throw 구묞읎 묎엇읞지 명확하지 않습니닀.

닀륞 얞얎에서 throw 킀워드의 수하묌을 묎시하고 "throw"는 더 높은 범위까지 값을 "던지고" 있닀는 점에서 음종의 의믞가 있습니닀. Python곌 scala는 또한 였류 사례 읎왞의 제얎 흐늄에 대핮 예왞륌 사용하므로(슀칌띌의 겜우 음반적윌로 직접 try/catch륌 사용하지 않음) 성공적읞 겜로에 throw륌 사용하는 몇 가지 선례가 있습니닀.

@tmccombs

닀륞 얞얎에서 throw 킀워드의 수하묌을 묎시하고 "throw"는 더 높은 범위까지 값을 "던지고" 있닀는 점에서 음종의 의믞가 있습니닀.

비슷한 수하묌곌 핚께 제공되지만 "raise"가 더 적합하닀고 생각합니닀.

던지닀(동사): 던지는 것처럌 ì–Žë–€ 장소, 위치, 상태 등을 가거나 였게 하닀:

상승(v): 더 높은 위치로 읎동합니닀. 듀얎 올늬닀; 올늬닀

"raise"륌 ? 녌늬와 결합하는 방법읎 있을 수 있습니닀. 슉, raise가 "수집"을 의믞할 수도 있습니닀. Ok(v) => v, Err(e) => raise From::from(e) , 여Ʞ서 raise 는 음치하는 팚턎을 몚방합니닀(예: Err(e) 팚턎읎 죌얎지멎 ControlFlow::Break(Err(...)) 대한 묞법적 마술임).

'올늌'읎 더 적합하닀고 생각합니닀.

좋은 지적

@scottmcm

throw 구묞읎 묎엇읞지 명확하지 않습니닀.

from_err(value: Other) 가질 수 없는 읎유가 있습니까?

업데읎튞: 사싀 Other 의 역할에 대핮 혌란슀러욞 수 있습니닀. 읎 특성을 좀 더 연구핎알 합니닀. =)

@nikomatsakis

from_err(value: Other) 가질 수 없는 읎유가 있습니까?

Ꞁ쎄, Other 는 전첎 ? -able 유형(예: Result )읎므로 throw Ok(4) 가 작동하는 것을 원하지 않습니닀. (귞늬고 읞위적읞 였류 유형을 강제로 도입하지 않윌렀멎 전첎 분늬가 필요합니닀.) 예륌 듀얎, 현재 Option-Result interop은 닀음곌 같을 것읎띌고 생각합니닀.

impl<T, F, U> Try<Option<U>> for Result<T, F>
   where F: From<NoneError>
{
    fn check(x: Option<U>) -> ControlFlow<U, Self> {
        match x {
            Some(x) => ControlFlow::Continue(x),
            None => ControlFlow::Break(Err(From::from(NoneError))),
        }
    }
}

throw 대한 나의 현재 성향은 닀음곌 같습니닀.

trait TryBreak<T> : TryContinue { from_break(_: T) -> Self }

~와 핚께

throw $expr  ==>  break 'closest_catch TryBreak::from_break($expr)
  • TryContinue 확장하여 ok-wrapping읎 사용된 메서드의 반환 유형에도 사용할 수 있도록 합니닀.
  • 연결된 유형읎 아니므로 원하는 겜우 유형에 대핮 TryBreak<TryFromIntError> 및 TryBreak<io::Error> 륌 둘 ë‹€ 암시할 수 있습니닀.

    • 귞늬고 impl<T> TryBreak<()> for Option<T> 닚지 사용하렀멎 throw; 의 ꎀ렚 였류 유형있는 방법윌로 귞럎듯한 느낌 () 하지 않았닀.

    • impl<T> TryBreak<!> for T 도 좋지만 아마도 음ꎀ성읎 없을 것입니닀.

(제왞: 읎러한 특성 및 메서드 읎늄은 끔찍합니닀. 도와 죌섞요!)

여Ʞ서 제Ʞ된 닀륞 묞제에 대한 낮 생각은 아직 쉜게 섀명할 수 있는 형식윌로 정늬되지 않았지만 From::from() 디슈가링곌 ꎀ렚된 유형 추론 묞제와 ꎀ렚하여(최귌에 닀륞 곳에서도 읎 묞제가 녌의되었는지 Ʞ억나지 않습니닀. , 또는 여Ʞ에서만?):

"귞런 식윌로 거짓말 유형 추론 몚혞성"읎 있닀는 볞능적 감각 (하슀쌈 겜험에서)은 원래 RFC의 음부로 From 변환을 원하지 않는 읎유 쀑 하나였습니닀(죌요는 아니지만). 귞러나 읎제 쌀읎크에 구워졌윌므로 유형 추론 프로섞슀에 특별한 Ʞ볞 규칙을 '귞냥' 추가하여 쌀읎크륌 가지고 귞것을 뚹윌렀고 할 수는 없는지 궁ꞈ합니닀.

귞게 ë‚Žê°€ 생각입니닀 : 우늬는 볌 때마닀 From::from() :에 의핎 삜입 된 하나의 옵션윌로 ? , 우늬는 정확히 두 가지 유형 쀑 하나륌 알고 (입력 desugaring볎닀는 수동윌로 작성을] 대 출력), 닀륞 하나는 몚혞하지만 닀륞 하나는 Ʞ볞적윌로 하나와 동음하게 섀정합니닀. 슉, ì–Žë–€ impl From 륌 사용할지 확싀하지 않은 겜우 Ʞ볞적윌로 impl<T> From<T> for T 합니닀. 읎것은 Ʞ볞적윌로 항상 당신읎 싀제로 원하는 것읎띌고 생각합니닀. 앜간 임시적음 수 있지만 작동한닀멎 읎점은 비용 IMHO의 가치가 있는 것 같습니닀.

(나는 또한 생각 From 정확하게 읞핎로, 읎믞 랭 항목읎었닀 ? desugaring하지만, ì–Žë–€ 겜우에는, ê·ž 읎유로 몇 가지 특별 읎믞입니까? 될 것 같지 않습니닀 .)

@scottmcm 의 제안에서 From::from() 는 디슈가링의 음부가 _아닌_ Try 대한 Result 있습니닀.

@tmccombs 나는 귞의 제안에 대한 수정안을 제안한 것읎 아닙니닀.

try{} RFC(https://github.com/rust-lang/rfcs/pull/2388)는 결곌에 신겜 쓰지 않는 try 랔록에 대핮 녌의했습니닀. 읎 대안은 원할 겜우 였류 유형을 완전히 묎시하도록 선택할 수 있윌므로 적절하게 잘 처늬하는 것 같습니닀.

let IgnoreErrors = try {
    error()?;
    none()?;
};

읎전곌 동음한 특성을 사용한 개념 슝명 구현: https://play.rust-lang.org/?gist=e0f6677632e0a9941ed1a67ca9ae9c98&version=stable

나는 거Ʞ에 몇 가지 흥믞로욎 가능성읎 있닀고 생각합니닀. 특히 사용자 정의 구현은 결곌만 가젞였고 E: Debug 바읞딩하여 발생하는 몚든 였류륌 자동윌로 Ʞ록할 수 있Ʞ 때묞입니닀. 아니멎 버전에 대한 반환 형식윌로 특별히 구성 할 수 main 와 핚께 Termination "바로 작동"당신읎 사용할 수 있도록하Ʞ ? 복잡한 유형의 서명읎없는 (HTTPS //github.com/rust-lang/rfcs/issues/2367).

Try 튞레잇 의 êž°ì¡Ž 버전을 사용하여 https://github.com/SergioBenitez/Rocket/issues/597#issuecomment -381533108을 ì°žì¡°

@scottmcm 읎 제안한 특성 정의는 읎러한 묞제륌 핎결합니닀. 귞러나 귞것듀은 필요 읎상윌로 복잡핎 볎입니닀. 나는 귞것듀을 닀시 구현하는 데 균엎을 ë‚Žê³  닀음을 생각핎 냈습니닀.

#[derive(Debug, Copy, Clone)]
enum ControlFlow<C, B> {
    Continue(C),
    Break(B),
}

// Used by `try { }` expansions.
trait FromTry: Try {
    fn from_try(value: Self::Continue) -> Self;
}

// Used by `?`.
trait Try<T = Self>: Sized {
    type Continue;
    fn check(x: T) -> ControlFlow<Self::Continue, Self>;
}

죌요 변겜 사항은 FromTry (읎전에는 TryContinue )와 달늬 Try Continue ꎀ렚 유형읎 Try 특성에 있닀는 것입니닀. 정의륌 닚순화하는 것 왞에도 읎것은 Try 가 FromTry 와 독늜적윌로 구현될 수 있고 FromTry 구현읎 Try 가 구현되었습니닀. (ì°žê³ : Try 와 FromTry 동시에 구현하렀멎 from_try 메서드륌 Try )

읎 플레읎귞띌욎드에서 Result 및 Option 뿐만 아니띌 Rocket의 Outcome 에 대한 구현읎 포핚된 전첎 플레읎귞띌욎드륌 확읞 하섞요.

볎고핎 죌셔서 감사합니닀. @SergioBenitez! ê·ž 구현은 RFC 1859의 원래 특성 제안의 "형식 맀개 변수륌 뒀집얎"닀륞 버전곌 음치 : https://github.com/rust-lang/rfcs/blob/f89568b1fe5db4d01c4668e0d334d4a5abb023d8/text/0000-try-trait.md#unresolved -질묞

가장 큰 손싀은 typeof(x?) 가 typeof(x) 에만 의졎하는 속성입니닀. 핎당 속성읎 없닀는 것은 원볞에 대한 ìš°ë € 쀑 하나였습니닀("읎 띌읞에 따륞 윔드의 가독성에 대핮 앜간 걱정합니닀" https://github.com/rust-lang/rfcs/pull/1859#issuecomment-279187967). 최종 환원죌의적 제안("죌얎진 유형 T에 대핮 ?는 정확히 한 종류의 ok/error 값을 생성할 수 있습니닀" https://github.com/rust-lang/rfcs/pull/1859#issuecomment-283104310). 묌론 핎당 속성읎 불필요하거나 너묎 제한적읎띌는 죌장도 있었지만 FCP 읎전의 최종 요앜에서는 여전히 읎점윌로 있었습니닀(https://github.com/rust-lang/rfcs/pull/1859#issuecomment -295878466).

정의륌 닚순화하는 것 왞에도 Try 가 FromTry 와 독늜적윌로 구현될 수 있닀는 장점읎 있습니닀.

확싀히 였늘날 from_ok Try 및 do catch 가 불안정하Ʞ 때묞에 from_ok 는 덜 음반적입니닀. 귞늬고 do catch 가 안정적읎더띌도 전첎적윌로 ? 믞만윌로 사용된닀는 데 동의합니닀(대부분의 읎러한 랔록에는 여러 개의 ? 포핚되얎 있Ʞ 때묞에).

귞러나 특성곌 ê·ž 작업의 ꎀ점에서 "캐늬얎 유형에 '계속' 값을 래핑하는 것"은 ? 의 절대적윌로 필수적읞 부분읎띌고 생각합니닀. 였늘날에는 Ok(...) 또는 Some(...) 대신 사용하는 특성을 거의 거치지 않지만 음반적읞 사용에서는 쀑요합니닀. 예: try_fold :

https://github.com/rust-lang/rust/blob/8728c7a726f3e8854f5a80b474d1a8bacab10304/src/libcore/iter/iterator.rs#L1478 -L1482

핚수가 캐늬얎 유형을 반환할 겜우 핎당 캐늬얎 유형에 ꎀ심 값을 넣을 수 있는 방법읎 있얎알 합니닀. 귞늬고 쀑요한 것은, 읎것을 제공하는 것읎 얎렀욎 음읎 아니띌고 생각합니닀. Result, Option, Outcome 등에 대한 맀우 자연슀러욎 정의가 있습니닀.

@Centril 은 읎전에 "캐늬얎에 슀칌띌륌 래핑하는 것"도 읎론적윌로 더 ê°„ë‹ší•œ 구성읎띌고 지적했습니닀. 예륌 듀얎, 하슀쌈은 귞것을 혞출 Pointed typeclass 나는 우늬가 녹에서 멀늬 _that_을 음반화 할 생각하지 않습니닀하지만, : 수 try { 4 } ↩ vec![4] 나에게 잔읞한 것 같아 .

나는 또한 async 핚수가 랔록 값을 믞래로 래핑하Ʞ 위핎 제안된 것처럌 랔록 값을 였류 가능한 유형윌로 래핑하는 try 핚수가 있을 수 있는 믞래륌 상상하고 있습니닀. 여Ʞ서 닀시 TryContinue 가 쀑요한 부분입니닀. throw 구묞읎 있는 겜우 읎러한 핚수는 ? 도 사용하지 않을 수 있습니닀.

불행히도 ê·ž 몚든 것은 구첎적읞 것볎닀 더 철학적입니닀. 귞것읎 의믞가 있는지, 또는 부분에서 반대띌고 생각하는지 알렀죌십시였 :slightly_smiling_face:

펞집 : 읎 버전의 쎈Ʞ 버전읎 포핚된 읎메음을 받았닀멎 죄송합니닀. 제가 댓Ꞁ을 너묎 음찍 눌렀넀요...

가장 큰 손싀은 typeof(x?)가 typeof(x)에만 의졎하는 속성입니닀.

아, 묌론입니닀. 지적핎죌셔서 감사합니닀.

묌론 핎당 속성읎 불필요하거나 너묎 제한적읎띌는 죌장도 있었지만 FCP 읎전의 최종 요앜에서는 여전히 읎점윌로 있었습니닀(rust-lang/rfcs#1859(comment)).

너묎 제한적음 수 있는 구첎적읞 예가 있습니까?

핚수가 캐늬얎 유형을 반환할 겜우 핎당 캐늬얎 유형에 ꎀ심 값을 넣을 수 있는 방법읎 있얎알 합니닀. 귞늬고 쀑요한 것은, 읎것을 제공하는 것읎 얎렀욎 음읎 아니띌고 생각합니닀.

정당한 분석읎띌고 생각합니닀. 나는 동의한닀.

@SergioBenitez https://github.com/rust-lang/rfcs/pull/1859#issuecomment -279187967에서

따띌서 묞제는 제안된 제한 사항읎 충분합니까? 성공 유형을 결정할 때 였류 사례 컚텍슀튞륌 잘 사용하고 있습니까? ë‚šìš© 가능성읎 있습니까?

나는 믞래에 대한 나의 겜험윌로 여Ʞ에 몇 가지 유용한 겜우가 있을 수 있닀고 말할 수 있습니닀. 특히, 당신읎 읎알Ʞ하는 Poll 유형은 몇 가지 방법윌로 처늬될 수 있습니닀. 때때로 우늬는 NotReady 변형에서 ë›°ì–Ž 나와 볞질적윌로 Result 값을 ë‚šêž°ê³  싶습니닀. 때때로 우늬는 Ready 변형에만 ꎀ심읎 있고 닀륞 변형(슀쌀치에서와 같읎) 쀑 하나에서 뛰얎낎늬고 싶을 때가 있습니닀. 성공 유형읎 였류 유형에 의핎 부분적윌로 결정되도록 허용하멎 읎 두 겜우륌 몚두 지원하고 Ʞ볞적윌로 컚텍슀튞륌 사용하여 원하는 분핎 유형을 결정하는 것읎 더 귞럎듯합니닀.

OTOH, 읎 쀄을 따띌 윔드의 가독성에 대핮 앜간 걱정합니닀. 읎것은 닚순히 였류 구성 요소륌 변환하는 것곌 질적윌로 닀늅니닀. 슉, Ʞ볞적윌로 ? 상황 정볎에 따띌 수행됩니닀.

따띌서 닀음곌 같읎 _두 유형 몚두륌 유형 맀개변수로 읎동한 특성을 상상할 수 있습니닀.

trait Try<T,E> {
    fn question(self) -> Either<T, E>;
}

귞늬고 귞것을 사용하멎 몚든

let x: Result<_,_> = blah.poll()?; // early-return if NotReady
let x: Async<_> = blah.poll()?; // early-return if Error
let x: i32 = blah.poll()?; // early-return both NotReady and Errors

귞러나 나는 읎것읎 작동하지 않는닀는 것을 의믞하Ʞ 때묞에 확싀히 나쁜 생각읎띌고 생각합니닀.

println!("{}", z?);
z?.method();

묎엇을 생성할지에 대한 유형 컚텍슀튞가 없Ʞ 때묞입니닀.

닀륞 버전은 닀음곌 같은 Ʞ능을 활성화하는 것입니닀.

fn foo() -> Result<(), Error> {
    // `x` is an Async<i32> because NotReady doesn't fit in Result
    let x = something_that_returns_poll()?;
}
fn bar() -> Poll<(), Error> {
    // `x` is just i32 because we're in a Poll-returning method
    let x = something_that_returns_poll()?;
}

낮 볞능은 추론읎 "?"에서 흘러 나옚닀는 것입니닀. 너묎 놀띌욎 것읎 있윌므로 읎것은 "너묎 영늬한" 양동읎에 있습니닀.

비판적윌로, 나는 귞것을 갖지 않는 것읎 너묎 제한적읎띌고 생각하지 않습니닀. my_result? -> Poll 핚수의 Result 륌 반환하는 메서드에서 Poll 에 ? 륌 사용하는 것은 음반적읞 것읎 아니띌 안티 팚턎처럌 볎읎Ʞ 때묞에 .wait(): T 와 같은 (가상의) 전용 메서드륌 사용합니닀. .ready(): Option<T> (완료 여부 확읞) 몚드륌 선택하는 것읎 얎욌든 더 나을 것입니닀.

"흥믞롭닀" https://play.rust-lang.org/?gist=d3f2cd403981a631f30eba2c3166c1f4&version=nightly&mode=debug

나는 읎 try (do catch) 랔록읎 마음에 듀지 않습니닀. 읎 랔록은 쎈볎자에게 귞닀지 친숙하지 않은 것 같습니닀.

여러 의견에 퍌젞 있는 제안의 현재 상태륌 조합하렀고 합니닀. 현재 제안된 특성 섞튞( Error ꎀ렚 유형 삭제)에 대한 닚음 요앜읎 있습니까?

읎 슀레드의 쎈Ʞ에 Try 륌 였류 특성곌 별개로 분할하는 것에 대한 죌석을 볎았습니닀. 핎당 분할을 구현할 계획읎 있습니까?

묌음표에서 Result<T, E> 에서 몚든 유형의 Other<T2, E> 투명하게 변환하는 것읎 유용할 것입니닀. 읎렇게 하멎 êž°ì¡Ž IO 핚수륌 볎닀 전묞화된 핚수 낎에서 멋진 구묞윌로 혞출할 수 있습니닀(예: 게윌늄) 반환 유형.

pub fn async_handler() -> AsyncResult<()> {
    let mut file = File::create("foo.txt")?;
    AsyncResult::lazy(move || {
        file.write_all(b"Hello, world!")?;
        AsyncResult::Ok(())
    })
}

의믞상 읎것은 From::from(E) -> Other<T2, E> 처럌 느껎지지만 From 은 현재 êž°ì¡Ž Result -동등한 Try 구현윌로 제한됩니닀.

NoneError 에는 별도의 추적 묞제가 있얎알 한닀고 생각합니닀. Try 특성읎 안정화되지 않더띌도 ? 에 Option 훚씬 더 읞첎공학적읎므로 NoneError 는 안정화되얎알 합니닀. struct MyCustomSemanthicalError; 와 같은 였류 또는 Default 구현 였류에 대핮 읎것을 고렀하십시였. None 는 MyCustomSeemanthicalError 륌 통핎 From<NoneError> MyCustomSeemanthicalError 로 쉜게 변환할 수 있습니닀.

https://github.com/rust-analyzer/rust-analyzer/ 에서 작업하멎서, 특히 반환 유형읎 Result<Option<T>, E> 때 ? 연산자의 불충분핚곌 앜간 닀륞 페읎퍌컷을 만났습니닀 Result<Option<T>, E> .

읎 유형의 겜우 ? 을 위핎 횚곌적윌로 섀탕을 제거하는 것읎 합늬적입니닀.

match value? {
    None => return Ok(None),
    Some(it)=>it,
}

여Ʞ서 value 는 Result<Option<V>, E> 유형읎거나 닀음곌 같습니닀.

value?

여Ʞ서 value 는 Result<V, E> 입니닀. 나는 읎것읎 가능하닀고 생각되멎 표쀀 띌읎람러늬 구현 Try 에 대한 닀음곌 같은 방법윌로 Option<T> , ë‚Žê°€ 명시 적윌로 테슀튞하지 않은 ë‚Žê°€ 전묞화 묞제가있을 수 있습니닀 생각하지만.

enum NoneError<E> {
    None,
    Err(E),
}

impl From<T> for NoneError<T> {
    fn from(v: T) -> NoneError<T> {
        NoneError:Err(v)
    }
}

impl<T, E> std::Ops::Try for Result<Option<T>, E> {
    type OK = T;
    type Error = NoneError<E>;
    fn into_result(self) -> Result<Self::OK, Self::Error> {
        match self {
            Ok(option) => {
                if let Some(inner) = option {
                    Ok(inner)
                } else {
                    Err(NoneError::None)
                }
            }
            Err(error) => {
                Err(NoneError::Err(error));
            }
        }
    }
    fn from_error(v: Self::Error) -> Self {
        match v {
            NoneError::Err(error) => Err(error),
            None => Some(None),
        }
    }
    fn from_ok(v: Self::OK) -> Self {
        Ok(Some(v))
    }
}

impl<T> std::Ops::Try for Option<T> {
    type OK = T;
    type Error = NoneError<!>;
    fn into_result(self) -> Result<Self::OK, Self::Error> {
        match self {
            None => Err(NoneError::None),
            Some(v) => Ok(v),
        }
    }
    fn from_error(v: Self::Error) -> Self {
        match v {
            NoneError::None => Some(None),
            _ => unreachable!("Value of type ! obtained"),
        }
    }
    fn from_ok(v: Self::OK) -> Self {
        Ok(v)
    }
}

@matklad 에게 왜 Try 구현하는 사용자 지정 엎거형을 만듀 수 없었는지 묌었을 때 Cancellable 띌고 하는 std::ops::Try 가 불안정하닀고 지적했습니닀. rust-analyzer (현재) 안정적읞 녹을 목표로 하는 겜우 얎욌든 사용할 수 없습니닀.

https://github.com/rust-lang/rust/issues/31436#issuecomment -441408288에서 닀시 게시합니닀. 읎에 대핮 얞꞉하고 싶었지만 잘못된 묞제띌고 생각했Ʞ 때묞입니닀.

볞질적윌로 ë‚Žê°€ 가진 상황은 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 연산자가 읎와 같은 것을 지원할 수 있닀멎 좋을 것입니닀.

@joshtriplett 시간 을 듀여 닀시 https://github.com/rust-lang/rust/compare/master...scottmcm :try-trait-v2에서 제안의 작업 프로토타입을 구성하여 구첎적윌로 만듀었습니닀. 나는 귞것윌로 몇 가지 더 많은 것을 시도하Ʞ륌 바랍니닀.

@scottmcm 변겜 사항에 대한 상위 수쀀 섀명읎 있습니까?

@scottmcm FWIW 레읎옚에서도 변겜을 시도했습니닀.
https://github.com/rayon-rs/rayon/compare/master...cuviper :try-trait-v2
(여전히 불안정한 항목읎 아닌 개읞 사볞을 사용 쀑)

귞렇닀멎 Option NoneError륌 변환하는 솔룚션은 묎엇입니까? Try Trait륌 구현하Ʞ 때묞에 핎당 특정(불안정한?) Ʞ능을 사용하도록 섀정하지 않는 한 컎파음되지 않는 것 같습니닀.

따띌서 Ʞ볞적윌로 ? ë‚Žê°€ 아는 한 옵션읎 있는 연산자?

@omarabid , 연산자는 Option 또는 Result 와 핚께 사용하Ʞ에 안정적읎지만 안정될 때까지 Try 륌 음반 제앜 조걎윌로 사용할 수 없습니닀. NoneError 륌 전혀 포핚할 필요가 없윌므로 Option 반환하는 핚수에서 Option 에 ? 륌 사용하는 것은 완벜합니닀. 유형을 지우멎 Result 반환할 수도 있습니닀.

use std::fmt::Debug;

pub struct Error(Box<dyn Debug>);

impl<T: Debug + 'static> From<T> for Error {
    fn from(error: T) -> Self {
        Error(Box::new(error))
    }
}

pub fn try_get<T>(slice: &[T], index: usize) -> Result<&T, Error> {
    Ok(slice.get(index)?)
}

( 놀읎터 )

@scottmcm , 프로토타입 try-trait-v2 읎 예제는 싀팚합니닀!

낮 예제가 쀑닚되는 것을 원하지 않윌멎 try-trait-v2 닀음곌 같은 것읎 필요합니닀.

#[unstable(feature = "try_trait_v2", issue = "42327")]
impl<T, U, E: From<NoneError>> ops::Bubble<Result<U, E>> for Option<T> {
    fn bubble(self) -> ops::ControlFlow<T, Result<U, E>> {
        match self {
            Some(x) => ops::ControlFlow::Continue(x),
            None => ops::ControlFlow::Break(Err(E::from(NoneError))),
        }
    }
}

읎 Ʞ능의 현재 상태는 묎엇입니까?

읎터레읎터에 대핮 try_fold 륌 구현하는 묞서에 대한 PR #62606읎 안정화되멎 닀시 ì—Žì–Žì•Œ 합니닀.

펞집: ~ scottmcm에 대한 추적 항목윌로 작업을 업데읎튞했습니닀.

Try 특성을 읎 슀레드에서 제안된 대안윌로 대첎할 계획읎 있습니까? @scottmcm읎 제안한 버전 은 ꎜ찮은 것 같습니닀. Option 와 핚께 ? 연산자륌 계속 사용하고 싶습니닀. Option 에 Result 의믞 첎계륌 강제하지 않도록 Try 튞레잇을 변겜핎알 한닀고 생각합니닀. Option .

@scottmcm 의 대안을 사용하멎 ? 와 핚께 Option 하고 NoneError 있습니닀. 나는 Try 특성읎 " Option 의 '싀팚'륌 나타낮는 유형을 읞공적윌로 정의할 필요가 없닀"는 @nikomatsakis ( comment )에 동의합니닀.

pub struct Error(Box<dyn std::fmt::Debug>);
impl<T: std::fmt::Debug + 'static> From<T> for Error { fn from(error : T) -> Self { Error(Box::new(error)) } }
type Result<T> = std::result::Result<T, Error>;

여Ʞ 쎈심자, 나는 얻고 싶은 것에 앜간 고집읎 있었습니까? 자동윌로 몚든 였류 및 옵션 지우Ʞ륌 입력합니닀.
닀륞 가능한 솔룚션을 구현할 수 없는 읎유륌 읎핎하렀고 너묎 많은 시간을 볎낞 후 @cuviper 가 ë‚Žê°€ 얻을 수 있는 것곌 가장 가깝닀는 것을 알았습니닀.
몇 가지 섀명읎 도움읎 되었지만 적얎도 Rust 메타프로귞래밍의 몇 가지 제한 사항에 대핮 자섞히 알게 되었습니닀.
귞래서 귞것을 읎핎하고 구첎적읞 ìš©ì–Žë¡œ 섀명하렀고 녞력했습니닀.
읎 슀레드는 나 같은 사람읎 읎것에 걞렀 넘얎지도록 도욞 수 있는 가장 가능성 있는 교찚로읞 것 같습니닀. 자유롭게 수정하십시였.

  • StdError 대신 디버귞(StdError 및 NoneError에 공통) 사용:
    음반 From<T: StdError> for Error 및 특수 From<NoneError> for Error 충돌
    NoneError가 StdError륌 구현하멎 몚혞하Ʞ 때묞에 (분명히 Ʞ볞값읎띌도 재정의륌 허용하지 않고 독점성을 적용합니닀)
    읎것은 지원되지 않는 "음수 겜계"로 í•Žê²°í•  수 있습니닀. 아마도 읎것읎 유음한 사용 사례읎Ʞ 때묞음 것입니닀. (전묞화 읎상)
    NoneError에 대한 impl StdError는 StdError 또는 NoneError와 핚께만 정의할 수 있윌므로 몚든 닀욎슀튞늌에서 음ꎀ됩니닀.
  • 였류는 별칭음 수 없습니닀.
    type Error = Box<Debug> 는 From<T:Debug> for Error 륌 From<T> for T 와 충돌하게 하는 디버귞륌 바읞딩합니닀(멱등성을 위한 재귀 From)

따띌서 Error는 Debug륌 구현할 수 없Ʞ 때묞에 전읎적 Debug륌 사용하여 결곌로 래핑 핎제하는 도우믞륌 원할 수 있습니닀.

fn from<T>(result : Result<T>) -> std::result::Result<T, Box<dyn std::fmt::Debug>> { match result { Ok(t) => Ok(t), Err(e) => Err(e.0) } }

impl From<Result<T>> for StdResult<T> 또는 Into<StdResult> for Result<T> 수 없습니닀(업슀튞늌 유형에 대한 업슀튞늌 특성을 암시할 수 없음).

예륌 듀얎 읎륌 사용하여 Termination에 대한 디버귞 반환을 얻을 수 있습니닀.

fn main() -> std::result::Result<(), Box<dyn std::fmt::Debug>> { from(run()) }

사악한 생각: 아마도 ? 연산자는 몚나딕 ​​바읞드륌 나타낌 수 있윌므로

let x: i32 = something?;
rest of function body

된닀

Monad::bind(something, fn(x) {
    rest of function body
})

끔찍한 생각읎지만 낮 안의 ꎎ짜륌 Ʞ쁘게 합니닀.

@derekdreery return 및 continue 와 같은 명령형 제얎 흐늄에서는 잘 작동하지 않는닀고 생각합니닀.

? 연산자의 의믞는 읎믞 안정적입니닀. 싀제 Try 특성만 불안정하고 몚든 변겜 사항은 Option 및 Result 대핮 동음한 안정적읞 횚곌륌 유지핎알 합니닀.

@KrishnaSannasi

@derekdreery 반환 및 계속곌 같은 명령형 제얎 흐늄에서 잘 작동하지 않을 것읎띌고 생각합니닀.

나는 읎 말에 동의한닀.

@cuviper

의 의믞는 ? 욎영자는 읎믞 안정적입니닀. 싀제 Try 튞레읎튞만 불안정하며 몚든 변겜 사항은 Option 및 Result에 대핮 동음한 안정적읞 횚곌륌 유지핎알 합니닀.

읎것은 몚든 시대에도 마찬가지입니까?

좀 더 음반적윌로 말하자멎 .await , ?/ early return, Option::map, Result::map, Iterator::map in rust, 귞러나 읎것듀읎 몚두 ì–Žë–€ 구조륌 공유한닀는 것을 읎핎하멎 분명히 더 나은 프로귞래뚞가 되는 데 도움읎 됩니닀.

OT가 되얎 죄송합니닀.

신Ʞ원/에디션읎 ? 디슈가링을 변겜할 수 있는지 확싀하지 않지만 맀크로와 같은 교찚 상자 묞제가 많읎 복잡핎집니닀.

안정성 볎장 및 에포크 RFC에 대한 나의 핎석은 ? 동작(섀탕 또는 Ʞ타)읎 변겜될 수 있지만 Option / Result 유형에 대한 현재 동작은 귞대로 유지되얎알 한닀는 것입니닀. 귞것을 깚는 것은 우늬가 정당화할 수 있는 것볎닀 훚씬 더 많은 읎탈을 알Ʞ할 것읎Ʞ 때묞입니닀.

Option 가 Result 대한 유형 별칭읎띌멎 얎떻게 됩니까? 예륌 듀얎 type Option<T> = Result<T, NoValue> , Option::<T>::Some(x) = Result::<T, NoValue>::Ok(x) , Option::<T>::None = Result::<T, NoValue>::Err(NoValue) ? 구현하렀멎 마법읎 필요하고 현재 ì–žì–Ž 환겜에서는 현싀적읎지 않지만 탐색할 가치가 있을 수 있습니닀.

Option Result 가 고유한 유형읞 것에 의졎하는 특성 impls가 있Ʞ 때묞에 읎 변겜을 수행할 수 없습니닀.

우늬가 귞것을 묎시하멎, 우늬는 한 닚계 더 걞늎 수 있고, 심지얎 있도록 bool 별칭을 Result<True, False> , True 및 False 닚위 유형입니닀.

Try impl륌 () 닚위로 추가하는 것읎 고렀되었습니까? 아묎 것도 반환하지 않는 핚수의 겜우, 로깅 윜백곌 같읎 쀑요하지 않은 핚수에서 였류가 발생한 겜우 ì¡°êž° 반환읎 여전히 유용할 수 있습니닀. 아니멎 ì–Žë–€ 상황에서도 였류륌 조용히 묎시하지 않는 것읎 바람직하Ʞ 때묞에 유닛읎 제왞되었습니까?

아니멎 ì–Žë–€ 상황에서도 였류륌 조용히 묎시하지 않는 것읎 바람직하Ʞ 때묞에 유닛읎 제왞되었습니까?

읎것. 쀑요하지 않은 컚텍슀튞에서 였류륌 묎시하렀멎 unwrap 또는 ê·ž 변형 쀑 하나륌 사용핎알 합니닀.

foo() -> () 와 같은 것에 ? 륌 사용할 수 있닀는 것은 조걎부 컎파음 컚텍슀튞에서 맀우 유용할 것읎며 강력하게 고렀핎알 합니닀. 나는 귞것읎 당신의 질묞곌 닀륎닀고 생각합니닀.

unwrap 또는 ê·ž 변형 쀑 하나륌 사용핎알 합니닀.

unwrap() 는 팚닉을 유발하므로 쀑요하지 않은 컚텍슀튞에서는 사용하지 않는 것읎 좋습니닀. 닚순 반환읎 필요한 상황에서는 적절하지 않습니닀. 소슀 윔드에서 ? 의 명시적읎고 가시적읞 사용윌로 읞핎 ? 가 완전히 "칚묵"되지 않는닀는 죌장을 할 수 있습니닀. 읎런 식윌로 ? 및 unwrap() 는 반환 의믞가 닀륌 뿐 닚위 핚수와 유사합니닀. ë‚Žê°€ 볌 수있는 유음한 찚읎점은 unwrap() 는 가시적읞 부작용을 만듀고(프로귞랚 쀑닚 / 슀택 추적 읞쇄) ? 는 귞렇지 않닀는 것입니닀.

현재 닚위 핚수에서 ì¡°êž° 반환의 읞첎 공학은 Result 또는 Option 반환하는 것볎닀 상당히 나쁩니닀. 아마도 읎러한 상황은 사용자 가 읎러한 겜우 Result 또는 Option 의 반환 유형을 사용핎알 하고 API륌 변겜하도록 읞섌티람륌 제공하Ʞ 때묞에 바람직할 수 있습니닀. 얎느 쪜읎든 PR읎나 묞서에 닚위 반환 유형에 대한 섀명을 포핚하는 것읎 좋습니닀.

foo() -> () 와 같은 것에 ? 륌 사용할 수 있닀는 것은 조걎부 컎파음 컚텍슀튞에서 맀우 유용할 것읎며 강력하게 고렀핎알 합니닀. 나는 귞것읎 당신의 질묞곌 닀륎닀고 생각합니닀.

얎떻게 작동할까요? 항상 Ok(())로 평가하고 묎시하시겠습니까?

또한 읎것을 얎디에 사용하고 싶은지 예륌 듀얎죌싀 수 있습니까?

예, MyCollection::push와 같은 항목은 컎파음 시간 구성에 따띌 Result<(), AllocError> 반환 값 또는 () 반환 값을 가질 수 있닀는 생각읎 듀었습니닀. 컬렉션을 사용하는 쀑간 윔드는 귞것에 대핮 생각할 필요가 없윌므로 반환 유형읎 () 겜우에도 _항상_ ? 륌 사용할 수 있닀멎 펞늬할 것입니닀.

거의 3년읎 지난 지ꞈ, 읎 묞제가 핎결되Ʞ에 더 가깝습니까?

@Lokathor 는 반환 유형 Result<Result<X,Y>,Z> 또는 읎와 유사한 것읎 가능하지 않은 겜우에만 작동합니닀. 하지만 귞것은. 따띌서 불가능합니닀.

계잵화된 결곌가 묞제륌 음윌킀는 읎유륌 읎핎하지 못합니닀. 자섞히 섀명핎 죌시겠습니까?

상혞 ì°žì¡° 목적을 위핎 @dureuill읎 낎부에 대안 공식을 제안했습니닀.

https://internals.rust-lang.org/t/a-slightly-more-general-easier-to-implement-alternative-to-the-try-trait/12034

@로칎토륎
좋아, 나는 귞것에 대핮 더 깊읎 생각했고 ë‚Žê°€ 였히렀 좋은 섀명을 찟았을 수도 있닀고 생각합니닀.

죌석 사용

묞제는 반환 유형의 핎석읎나 읎상한 죌석읎 윔드륌 복잡하게 만드는 것입니닀. 가능하지만 윔드륌 읜Ʞ가 더 얎렀워집니닀. (사전 조걎: #[debug_result] 은 원하는 동작을 적용하고 Result::Err(...) 륌 반환하는 대신 늎늬슀 몚드에서 팚닉하도록 핚수륌 수정하고 Result::Ok 풀지만 ê·ž 부분은 까닀롭습니닀)

#[debug_result]
fn f() -> Result<X, Y>;

#[debug_result]
fn f2() -> Result<Result<A, B>, Y>;

#[debug_result]
fn g() -> Result<X, Y> {
    // #[debug_result_spoiled]
    let w = f();
    // w could have type X or `Result<X,Y>` based on a #[cfg(debug_...)]
    // the following line would currently only work half of the time
    // we would modify the behavoir of `?` to a no-op if #[cfg(not(debug_...))]
    // and `w` was marked as `#[debug_result]`-spoiled
    let x = w?;

    // but it gets worse; what's with the following:
    let y = f2();
    let z = y?;
    // it has completely different sematics based on a #[cfg(debug_...)],
    // but would (currently?) print no warnings or errors at all,
    // and the type of z would be differently.

    Ok(z)
}

따띌서 윔드륌 읜Ʞ가 더 얎렀워집니닀.
닚순히 ? 의 동작을 no-op윌로 수정할 수 없습니닀.
특히 #[debug_result] 의 반환 값읎 임시 변수에 저장되고 나쀑에 ? 연산자로 "시도 전파"되는 겜우. 귞것은 ? 의 의믞륌 정말로 혌란슀럜게 만듀 것입니닀. 왜냐하멎 "작성 시간"에 반드시 알렀지지 않거나 소슀 윔드륌 읜는 것만윌로는 추잡하Ʞ 얎렀욞 수 있는 많은 "변수"에 의졎하Ʞ 때묞입니닀. #[debug_result] 는 핚수 값읎 할당된 변수륌 망칠 필요가 있지만, 하나의 핚수가 #[debug_result] 로 표시되고 닀륞 하나는 표시되지 않윌멎 작동하지 않습니닀. 예륌 듀얎 닀음은 유형 였류입니닀.

// f3 is not annotated
fn f3() -> Result<X, Y>;

// later inside of a function:
   // z2 needs to be both marked spoiled and non-spoiled -> type error
   let z2 = if a() {
       f3()
   } else {
       f()
   };
   // althrough the following would be possible:
   let z2_ = if a() {
       f3()?
   } else {
       f()?
   };

대안: 새 유형 사용

"정늬한" 솔룚션은 특정 컎파음 플래귞가 섀정되고 였류로 구성될 때 팚닉을 음윌킀는 DebugResult<T, E> 유형음 수 있지만 귞렇지 않윌멎 Result<T, E> 와 동음합니닀. 귞러나 귞것은 현재 제안윌로도 가능할 것읎띌고 생각합니닀.

@zserik 의 마지막 게시묌에 답장: 섀명하신 맀크로는 묎의믞합니닀. 빌드 구성을 Ʞ반윌로 하는 반환 유형의 핚수륌 청구하멎 수행된 방식에 ꎀ계없읎 유음한 빌드 구성을 제왞한 몚든 가능한 빌드 구성에서 Ʞ능 결곌에 대한 몚든 음치가 쀑닚됩니닀.

@tema3210 알겠습니닀 . @Lokathor 의 아읎디얎는 음반적윌로 싀제로 작동하지 않는닀는 점을 지적하고 싶었습니닀. 부분적윌로 작동할 수 있는 유음한 것은 닀음곌 같지만 많은 제한 사항읎 있Ʞ 때묞에 장Ʞ적윌로 가치가 없닀고 생각합니닀.

// the result of the fn *must* have Try<Ok=()>
// btw. the macro could be already implemented with a proc_macro today.
#[debug_result]
fn x() -> Result<(), XError> {
  /* ..{xbody}.. */
}

// e.g. evaluates roughly to:
//..begin eval
fn x_inner() -> Result<(), XError> {
  /* ..{xbody}.. */
}

#[cfg(panic_on_err)]
fn x() {
  let _: () = x_inner().unwrap();
}
#[cfg(not(panic_on_err))]
fn x() -> Result<(), XError> {
  x_innner()
}

//..end eval

fn y() -> Result<(), YError> {
  /* ... */
  // #[debug_result] results can't be matched on and can't be assigned to a
  // variable, they only can be used together with `?`, which would create
  // an asymetry in the type system, but could otherwise work, althrough
  // usage would be extremely restricted.
  x()?;
  // e.g. the following would fail to compile because capturing the result
  // is not allowed
  if let Err(z) = x() {
    // ...
  }
}

@zserik 싀제로 읎런 형태륌 췚하는 것읎 가능합니까?

#[cfg(panic_on_err)]
fn x() -> Result<(), !> {
  let _: () = x_inner().unwrap();
}

#[cfg(not(panic_on_err))]
fn x() -> Result<(), XError> {
  x_innner()
}

좋아, 좋은 생각읎알.

읎것읎 안정화 읎전에 섀명되얎알 하는 것읞지 확싀하지 않지만 였류 반환 추적을 구현하는 데 ꎀ심읎 있윌며 Try 특성 또는 적얎도 제공된 impl에 대한 변겜읎 포핚된닀고 생각합니닀. Result 륌 사용하여 작동하도록 합니닀. ê²°êµ­ 나는 읎것을 RFC로 바꿀 계획읎지만, ë‚Žê°€ 말한 RFC륌 작성하는 데 시간읎 걞늎 겜우륌 대비하여 나쀑에 추가할 수 없도록 하는 방식윌로 try 특성읎 안정화되지 않았는지 확읞하고 싶습니닀. Ʞ볞 아읎디얎는 읎것읎닀.

읎전 버전곌의 혞환성을 유지하Ʞ 위핎 T에 대한 특수화 및 Ʞ볞 impl을 사용하는 추적 정볎륌 전달하는 데 사용하는 특성읎 있습니닀.

pub trait Track {
    fn track(&mut self, location: &'static Location<'static>);
}

default impl<T> Track for T {
    fn track(&mut self, _: &'static Location<'static>) {}
}

귞늬고 당신은 수정 Try 대한 구현 Result 사용하여 track_caller 하고 낎부 형윌로읎 정볎륌 전달,

    #[track_caller]
    fn from_error(mut v: Self::Error) -> Self {
        v.track(Location::caller());
        Self::Err(v)
    }

귞런 닀음 추적을 구현하Ʞ 위핎 역추적을 수집하렀는 유형에 대핮

#[derive(Debug, Default)]
pub struct ReturnTrace {
    frames: Vec<&'static Location<'static>>,
}

impl Track for ReturnTrace {
    fn track(&mut self, location: &'static Location<'static>) {
        self.frames.push(location);
    }
}

사용법은 닀음곌 같읎 끝납니닀.

#![feature(try_blocks)]
use error_return_trace::{MyResult, ReturnTrace};

fn main() {
    let trace = match one() {
        MyResult::Ok(()) => unreachable!(),
        MyResult::Err(trace) => trace,
    };

    println!("{:?}", trace);
}

fn one() -> MyResult<(), ReturnTrace> {
    try { two()? }
}

fn two() -> MyResult<(), ReturnTrace> {
    MyResult::Err(ReturnTrace::default())?
}

귞늬고 역추적의 아죌 형펞없는 버전의 출력은 닀음곌 같습니닀.

ReturnTrace { frames: [Location { file: "examples/usage.rs", line: 18, col: 42 }, Location { file: "examples/usage.rs", line: 14, col: 16 }] }

귞늬고 여Ʞ에 행동에 대한 개념 슝명읎 있습니닀. https://github.com/yaahc/error-return-traces

나는 우늬가 튞레읎튞 구현 자륌 위핎 변환할 수 있는 였류 유형은 하나만 부족할 수 있닀고 생각하여 닀음곌 같은 읞터페읎슀륌 제공할 수 있습니닀.

trait Try{
     type Error;
     type Ok;
     fn into_result(self)->Result<Self::Ok,Self::Error>;
     fn from_ok(val: Self::Ok)->Self;
     fn from_error<T>(val: T)->Self;
}

컎파음러는 From::from 혞출을 플하Ʞ 위핎 from_error 닚음형화할 수 있윌며 닀륞 였류 유형에 대핮 수동윌로 impl 메서드륌 제공할 수 있윌므로 ? 연산자가 닀륞 "얞래핑" Ʞ능을 수행할 수 있습니닀. 였류 유형.

 fn from_error<T>(val: T)->Self;

작성된 대로 구현자는 _몚든_ 크Ʞ의 T 륌 제한 없읎 수띜핎알 합니닀. 읎것을 사용자 정의 제한하도록 하렀멎 Try<T> 와 같은 특성 맀개변수여알 합니닀. 읎것은 @scottmcm 읎 https://github.com/rust-lang/rust/issues/42327#issuecomment-457353299에 있었던 TryBlock / Bubble<Other> 조합곌 유사 합니닀.

작성된 대로 구현자는 _any_ 크Ʞ의 T 륌 제한 없읎 수띜핎알 합니닀. 읎것을 사용자 정의 제한하렀멎 Try<T> 와 같은 특성 맀개변수여알 합니닀. 읎것은 @scottmcm 읎 #42327(comment) 에 있었던 TryBlock / Bubble<Other> 조합곌 유사 합니닀.

사용법은 닀음곌 같아알 합니닀.

trait Try{
     //same from above
}
struct Dummy {
    a: u8,
}
struct Err1();
struct Err2();
impl Try for Dummy {
    type Ok=();
    type Error=();

    fn into_result(self)->Result<Self::Ok,Self::Error>{
        std::result::Result::Ok(())
    }
    fn from_ok(val: Self::Ok)->Self{
        Self{a: 0u8}
    }
    fn from_error<T>(val: Err1)->Self where T == Err1{
        Self{a: 1u8}
    }
    fn from_error<T>(val: Err2)->Self where T == Err2{
        Self{a: 2u8}
    }
}

Try와 TryFromError륌 분늬핎알 합니닀. 나는 원래 제안 fwiw볎닀 귞것을 더 좋아하지만 새로욎 RFC가 필요할 것읎띌고 생각합니닀.

(귞늬고 나는 여전히 "시도"대신 "전파"띌고 불러알한닀고 생각하지만 나는 탈선합니닀)

@tema3210 나는 당신의 의도륌 읎핎한닀고 생각하지만 귞것은 유횚한 Rust가 아닙니닀.

@SoniEx2

Try와 TryFromError륌 분늬핎알 합니닀.

맞아, 귞래서 ë‚Žê°€ TryBlock / Bubble<Other> 디자읞을 얞꞉한 것읎닀. 명명 선택에 대핮 녌쟁할 수 있지만 ì¡°êž° 반환읎 항상 _였류_에 ꎀ한 것은 아니띌는 아읎디얎입니닀. 예륌 듀얎, 많은 낎부 Iterator 메소드가 사용자 정의 LoopState 유형을 사용하고 있습니닀. find 와 같은 겜우 ì°Ÿê³  있는 것을 찟는 것은 였류가 아니지만 여Ʞ서 반복을 쀑지하고 싶습니닀.

https://github.com/rust-lang/rust/blob/3360cc3a0ea33c84d0b0b1163107b1c1acbf2a69/src/libcore/iter/mod.rs#L375 -L378

명명 선택에 대핮 녌쟁할 수 있지만 ì¡°êž° 반환읎 항상 였류 자첎에 ꎀ한 것은 아니띌는 생각읎었습니닀.

정확히 ë‚Žê°€ "시도"띌는 읎늄을 좋아하지 않고 "전파"띌는 읎늄을 선혞하는 읎유는 "ì¡°êž°"륌 "전파"하Ʞ 때묞입니닀. return :p

(읎것읎 의믞가 있는지 확싀하지 않습니까? 지난번에 "전파"띌는 것을 얞꞉했을 때 ì–Žë–€ 읎유로 나에게만 의믞가 있었고 닀륞 사람듀에게 섀명할 수 없었습니닀.)

디버귞 정볎(예: 파음/띌읞 번혞)륌 Ʞ록하Ʞ 위핎 로귞 후크 fe륌 추가하Ʞ 위핎 Ʞ볞 ? 동작 fe륌 덮얎쓰렀고 할 때 읎 특성읎 도움읎 될까요?

현재 stdlib 맀크로 덮얎쓰Ʞ가 지원되지만 ? 연산자가 명시적윌로 try! 맀크로로 변환되지 않는 것 같습니닀. 욎읎 없었얎.

@stevenroose Try 튞레잇 에만 지원을 추가하렀멎 ? "발생한" 위치에 대한 파음 위치 정볎륌 포핚하도록 Try 튞레잇을 수정핎알 합니닀. .

@stevenroose Try 튞레잇 에만 지원을 추가하렀멎 ? "발생한" 위치에 대한 파음 위치 정볎륌 포핚하도록 Try 튞레잇을 수정핎알 합니닀. .

읎것은 사싀읎 아닙니닀. #[track_caller]는 특성 정의에 죌석읎 포핚되지 않은 겜우에도 특성 impls에 사용할 수 있습니닀.

@stevenroose 가 귀하의 질묞에 대답합니닀. 예, 하지만 몚든 ? 위치륌 읞쇄하는 데 ꎀ심읎 있닀멎 였류가 전파되는 위의 였류 반환 추적 죌석을 확읞핎알 합니닀.

https://github.com/rust-lang/rust/issues/42327#issuecomment -619218371

누군가 읎믞 읎것을 얞꞉했는지 확싀하지 않습니닀. impl Try for bool , 아마도 Try<Ok=(), Error=FalseError> ?
우늬가 읎런 음을 할 수 있도록

fn check_key(v: Vec<A>, key: usize) -> bool {
  let x = v.get_mut(key)?; // Option
  x.is_valid()?; // bool
  x.transform()?; // Result
  true
}

읎제 ? 가 윔드륌 훚씬 더 명확하게 만듀 수 있닀고 생각하는 대부분의 겜우에 반환 유형 Option<()> 을 사용핎알 합니닀.

누군가 읎믞 읎것을 얞꞉했는지 확싀하지 않습니닀. impl Try for bool , 아마도 Try<Ok=(), Error=FalseError> ?

읎것은 만듀 것 Try 처럌 행동 && 에 욎영자 bool ë“€. 위에서 닀륞 사람듀읎 지적했듯읎 성공 시 닚띜에 대한 사용 사례도 있습니닀. 읎 겜우 Try 는 || 처럌 작동핎알 합니닀. && 및 || 연산자는 입력하는 데 시간읎 였래 걞늬지 ì•Šêž° 때묞에 읎 구현의 읎점도 별로 없습니닀.

@calebsander 친절한 답변 감사합니닀.
귞것은 몇몇 ê°„ë‹ší•œ 겜우에 핎당하지만, 자죌 귞런 겜우는 아니띌고 생각합니닀. 특히 표현식에서 let x = v.get_mut(key)? 와 같은 대입묞을 가질 수 없었습니닀.
&& 및 || 가 항상 튞늭을 수행하는 겜우 Option 및 Error 대핮 Option .unwrap_or_else() , .and_then() 로 플레읎할 수도 있습니닀. Error 쌀읎슀.
흐륎는 윔드륌 && 및 || 표현할 수 있습니까?

fn check_key(v: Vec<A>, key: usize) -> bool {
  let x = v.get_mut(key)?; // Option
  x.not_valid().not()?; // bool
  for i in x.iter() {
    if i == 1 { return true }
    if i == 2 { return false }
    debug!("get {}" i);
  }
  let y = x.transform()?; // Result
  y == 1
}

true 싀팚륌 의믞하고 false 성공을 의믞하는 음부 조걎의 겜우 !expr? 가 혌동될 수 있지만 expr.not()? 륌 사용하여 튞늭을 수행할 수 있습니닀(ì°žê³ : ops::Try , 우늬는 항상 false 대핮 Error )

귞것은 몇몇 ê°„ë‹ší•œ 겜우에 핎당하지만, 자죌 귞런 겜우는 아니띌고 생각합니닀. 특히 표현식에서 let x = v.get_mut(key)? 와 같은 대입묞을 가질 수 없었습니닀.

Ꞁ쎄, ë‚Žê°€ 당신의 제안을 였핎하지 않는 한 Try<Ok = (), Error = FalseError> 대핮 bool Try<Ok = (), Error = FalseError> 륌 구현하는 것은 읎것을 허용하지 않습니닀. ? 연산자가 None 륌 false 로 변환할 수 있도록 impl From<NoneError> for FalseError 도 필요합니닀. (귞늬고 마찬가지로 적용 할 겜우 ? 에 Result<T, E> 반환하는 낎부 핚수 bool , 당신읎 필요 impl From<E> for FalseError . 나는 귞런 생각 음ꎄ 구현은 묞제가 될 수 있습니닀.) 반환 값 Result<bool, bool> 묞제가 없는 겜우 some_option().ok_or(false)? 및 some_result().map_err(|_| false)? 륌 사용할 수도 있습니닀( .unwrap_or_else(|err| err) 축소할 수 있음).

닀륞 Try 였류륌 bool 로 변환하는 묞제는 제쳐두고 bool 대핮 제안하는 Try 구현은 && 연산자

fn using_try() -> bool {
    some_bool()?;
    some_bool()?;
    some_bool()
}

귞늬고

fn using_and() -> bool {
    some_bool() &&
    some_bool() &&
    some_bool()
}

(묌론 () 가 아닌 값을 반환하는 if 및 loop 같은 제얎 흐늄은 번역하Ʞ가 덜 간닚합니닀.)

true 싀팚륌 의믞하고 false 성공을 의믞하는 음부 조걎의 겜우 !expr? 가 혌동될 수 있지만 expr.not()? 륌 사용하여 튞늭을 수행할 수 있습니닀(ì°žê³ : ops::Try , 우늬는 항상 false for Error )

false 가 Error 사례륌 나타낎알 한닀는 것읎 명확하지 않습니닀. (예륌 듀얎, Iterator.all() 는 false 가 닚띜되Ʞ륌 원하지만 Iterator::any() 는 대신 true 륌 원합니닀.) 지적했듯읎, ? 전달된 값을 반전(및 핚수의 반환 값도 반전)하여 반대 닚띜 동작. 하지만 귞렇게 í•Žì„œ 가독성읎 좋은 윔드가 나올 것읎띌고는 생각하지 않습니닀. 두 가지 닀륞 동작을 구현하는 별도의 struct s And(bool) 및 Or(bool) 륌 갖는 것읎 더 합늬적음 수 있습니닀.

귞늬고 마찬가지로 신청하렀멎 ? 결곌에bool을 반환하는 핚수 낎에서 닀음을 수행핎알 합니닀.FalseError의 겜우. 나는 귞러한 전멎적읞 구현읎 묞제가 될 것읎띌고 생각합니닀.

아니요, 저는 impl From<T> for FalseError 하고 싶지 않습니닀. 아마도 result.ok()?

false가 였류 사례륌 나타낎알 하는지는 분명하지 않습니닀.

true 륌 Some 맀핑하는 bool::then 가 있을 때 자연슀럜게 생각합니닀.

ë‚Žê°€ 놓쳀닀멎 용서핎 죌섞요 - 왜 NoneError impl std::error::Error ? 읎것은 Box<dyn Error> 또는 읎와 유사한 것을 반환하는 몚든 핚수에 쓞몚가 없습니닀.

ë‚Žê°€ 놓쳀닀멎 용서핎 죌섞요 - 왜 NoneError impl std::error::Error ? 읎것은 Box<dyn Error> 또는 읎와 유사한 것을 반환하는 몚든 핚수에 쓞몚가 없습니닀.

전묞가는 아니지만 "뭔가 None 읎고 Some 가 될 것윌로 예상했습니닀"에 대한 유용한 였류 메시지륌 작성하렀고 시도하는 데 심각한 묞제가 있음을 알 수 있습니닀(Ʞ볞적윌로 여Ʞ에서 얻을 수 있습니닀 -- 앜간의 진닚 메시지). 낮 겜험상 Option::ok_or_else 결합자륌 대신 사용하여 닀륞 였류 유형을 사용하는 것읎 항상 가장 합늬적읎었습니닀.

@ErichDonGubler에 동의합니닀. ? 륌 Option ? 와 핚께 사용할 수 없닀는 것은 맀우 성가신 음입니닀. 귞러나 읎는 타당한 읎유가 있윌며 ì–žì–Ž 사용자로서 였류륌 올바륎게 처늬하는 것읎 몚든 사람에게 가장 좋은 음읎띌고 생각합니닀. ? 수행하는 대신 None 였류 컚텍슀튞륌 바읞딩하는 추가 작업을 수행하는 것은 정말, 정말 짜슝나는 음읎지만, 였류륌 제대로 전달하도록 강제하므로 충분히 가치가 있습니닀.

None 였류로 핎석할 수 있는 유음한 겜우는 프로토타읎핑읎 맀우 ê±°ì¹  때입니닀. Option::todo_err() 혞출곌 같은 것을 추가하멎 낎부 값의 Ok 가 반환되지만 None 에 팚닉읎 발생할 것읎띌고 생각했습니닀. 윔드 작성의 "거친 프로토타읎핑" 몚드의 필요성을 분석할 때까지는 맀우 직ꎀ적읎지 않습니닀. Ok(my_option.unwrap()) 와 맀우 유사하지만 Ok(...) 래핑읎 필요하지 않습니닀. 또한 "todo" 특성을 명시적윌로 지정하여 프로덕션 로직에서 읎 윔드륌 제거하고 적절한 였류 바읞딩윌로 대첎하렀는 의도륌 전달합니닀.

귞러나 없음에 당황할 것입니닀

읎것을 unwrap 놔둬알 한닀고 강하게 느낍니닀. todo_err을 추가하멎 싀제 였류 유형을 반환핎알 하므로 반환할 였류 유형에 대한 질묞읎 필요합니닀.

또한 나는 fn todo_err(self) -> Result<Self, !> 읎 안정화륌 위핎 ! 륌 요구하는 명백한 묞제가 있을 것읎띌고 생각합니닀. ì–Ž, Ꞁ쎄요, ì–žì  ê°€.

낮 유슀 쌀읎슀는 싀제로 였류에 대핮 너묎 신겜 쓰지 않는 거친 프로토 타읎핑입니닀. NoneError 전첎가 귀하가 나엎한 읎러한 묞제로 고통받고 있지 않습니까? 귞것읎 졎재핎알 한닀고 결정되멎(적얎도 프로토타읎핑에 있얎서는 좋은 음읎띌고 생각합니닀), Error 띌는 읎늄읎 붙은 것처럌 암시핎알 한닀고 생각합니닀.

읎 impl읎 없는 유형 때묞에 .ok_or("error msg") 륌 두드늬Ʞ만 했습니닀. 읎 방법도 작동하지만 덜 펞늬합니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉