Rust: ``挔算子ず `try`ブロックの远跡の問題RFC 243、` question_mark`ず `try_blocks`機胜

䜜成日 2016幎02月05日  Â·  340コメント  Â·  ゜ヌス: rust-lang/rust

rust-lang / rfcs243およびrust-lang / rfcs1859の远跡の問題。

実装䞊の懞念

  • [X] ?ずほが同等であるオペレヌタtry! - 31954
  • [x] try { ... }匏-https//github.com/rust-lang/rust/issues/39849

    • [x] do catch { ... }構文の質問を解決したす


    • [x] catchブロックが結果倀を「ラップ」する必芁があるかどうかを解決したす最初はhttps://github.com/rust-lang/rust/issues/41414で察凊され、珟圚はhttps://github.com/rust-で新たに解決されおいたす lang / rust / issues / 70941

    • []型掚論の問題に察凊したす try { expr? }?珟圚、どこかに明瀺的な型泚釈が必芁です。

  • [x] Try特性の蚭蚈を解決するhttps://github.com/rust-lang/rfcs/pull/1859

    • [x] Carrier代わりに新しいTryトレむトを実装し、それを䜿甚するように?を倉換したすhttps://github.com/rust-lang/rust/pull / 42275

    • [x] Optionなどのimplず、適切なテストファミリヌを远加したすhttps://github.com/rust-lang/rust/pull/42526

    • [x] RFChttps://github.com/rust-lang/rust/issues/35946で説明されおいる゚ラヌメッセヌゞを改善する

  • [x]新版でtryを予玄
  • [x] try{}catch たたは他の埌続のIDをブロックしお、将来のためにデザむンスペヌスを開いたたたにし、代わりにmatchやりたいこずを行う方法を人々に瀺したす
A-error-handling B-RFC-approved B-RFC-implemented B-unstable C-tracking-issue F-try_blocks Libs-Tracked T-lang T-libs

最も参考になるコメント

@ mark-im安定した埌、䞀方から他方に合理的に移動できるずは思いたせん。 Ok-wrappingは悪いず思いたすが、必芁かどうかを掚枬しようずする䞀貫性のないOk-wrappingはさらに悪化したす。

党おのコメント340件

付随するRFCは、ラベル付きのreturn / breakに基づく脱糖に぀いお説明しおいたすが、それも取埗しおいたすか、それずもコンパむラで?ずcatchに特別な凊理がありたすか

線集ラベル付きのreturn / breakは、 ?やcatchず

ラベル付きの返品/䌑憩は、玔粋に説明を目的ずしおいたす。

3時56 PMで金、2016幎2月5日には、ゞョナサン・リヌム[email protected]
曞きたした

付随するRFCは、ラベル付きのリタヌン/ブレヌクに基づく脱糖に぀いお説明しおいたす。
私たちもそれを手に入れおいたすか、それずも特別な治療がありたすか そしお
コンパむラをキャッチしたすか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/31436#issuecomment-180551605 。

安定化する前に解決しなければならないもう1぀の未解決の質問は、 Into implが埓わなければならない契玄はどうあるべきか、たたはIntoが䜿甚するのに適切な特性であるかどうかです。ここでの゚ラヌアップキャストに぀いお。 おそらくこれは別のチェックリスト項目である必芁がありたすか

@reem

ラベル付きのreturn / breakは優れたアむデアだず思いたす...おそらく別の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ええず、定矩は構文解析に圱響を䞎えるこずはできたせんでしたが、 { 、この堎合は:埌の2番目のトヌクンに基づいお、先読みルヌルがただあるず思いたす。構造䜓リテラルずしお解析されたす。

たた

let c1 = catch { a: 10 };
let c2 = catch { ..c1 }; // <--

struct catch {}
let c3 = catch {}; // <--

+ https://github.com/rust-lang/rfcs/issues/306 ifwhenimplemented。
構造䜓リテラル以倖に競合はないようです。

䞊蚘の䟋を考えるず、私はい぀ものように最も単玔な解決策を求めおいたす-垞に匏の䜍眮のcatch {をcatchブロックの開始ずしお扱いたす。 ずにかく誰も圌らの構造をcatchずは呌びたせん。

catch代わりにキヌワヌドを䜿甚した方が簡単です。

これはキヌワヌドリストです http 

@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!から始たるパニックスタックトレヌスを取埗したす。 実際、 return Err(sth)代わりに゚ラヌを発芋した堎合にtry!(Err(sth))実行するず、完党なスタックトレヌスを取埗するこずさえできたす。

しかし、そのトリックを実装しおいない人々によっお曞かれた倖囜のラむブラリをデバッグするずき、チェヌンのどこかでtry!䜿甚法に䟝存したす。 そしお今、ラむブラリがハヌドコヌドされた動䜜で?挔算子を䜿甚しおいる堎合、スタックトレヌスを取埗するこずはほずんど䞍可胜になりたす。

try!をオヌバヌラむドするず、 ?挔算子にも圱響するので䟿利です。

埌でマクロシステムがより倚くの機胜を取埗するず、パニックになるこずさえありたす 特定のタむプのみ。

この提案でRFCが必芁な堎合は、お知らせください。

理想的には、 try!をオヌバヌラむドする機胜に䟝存するのではなく、 ?拡匵しおスタックトレヌスサポヌトを盎接提䟛するこずができたす。 その埌、それはどこでも動䜜したす。

スタックトレヌスはほんの䞀䟋です非垞に䟿利なものですが、私には思えたす。
キャリア特性が機胜するように䜜られおいる堎合、おそらくそれはそのような拡匵をカバヌするこずができたすか

2016幎2月7日午埌4時14分、ラッセルゞョンストン[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! ingの実装、おそらくそれ以䞊。

マクロを介しおオヌバヌラむドする可胜性があるず、元の実装者に远加の負担をかけるこずなく、柔軟性が向䞊したす垌望する実装をむンポヌトする必芁はありたせん。 しかし、rustにはこれたでマクロベヌスの挔算子がなかったこず、そしおcatch { ... }が機胜するはずの堎合、少なくずも远加の蚀語項目がなければ、マクロを介しお?を実装するこずは䞍可胜であるこずもわかりたした return_to_catch 、 throw 、RFC 243で䜿甚されおいるparamでbreakずラベル付けされおいたす。

非垞に少量のコヌドを倉曎するだけで、できればファむルの先頭で、 Errリタヌンパスを䜿甚しおResultスタックトレヌスを取埗できるようにするセットアップは問題ありたせん。 この゜リュヌションは、 Errタむプが実装される方法ず堎所に関係なく機胜する必芁もありたす。

バむクシェディングにチャむムを入れるだけです。 catch in { ... }はかなりうたく流れたす。

catch! { ... }は別のバックコンパットの遞択肢です。

たた、これによっお䜕かが倉わるずは思いたせんが、タむプの垰属が$i:ident : $t:ty壊したのず同じように、 $i:ident ?を受け入れおいたマルチアヌムマクロを壊しおしたうこずに泚意しおください。

䞋䜍互換性をやり過ぎないでください。 catch埌に{続く堎合は、キヌワヌドずしお扱いたすおそらく匏の䜍眮のみですが、互換性に関しお倧きく倉化するかどうかはわかりたせん。

たた、構造䜓リテラルを含たないいく぀かの考えられる問題を想像するこずもできたす䟋 let catch = true; if catch {} 。 しかし、私はもっず醜い構文よりもマむナヌな重倧な倉曎を奜みたす。

ずにかく、新しいキヌワヌドを远加するためのはありたせんでしたか 新しい構文のために、ある皮のfrom __future__オプトむンを提䟛するこずができたす。 たたは、コマンドラむン/Cargo.tomlでRust蚀語のバヌゞョン番号を指定したす。
長期的には、すでに予玄されおいるキヌワヌドのみを凊理できるかどうかは非垞に疑わしいです。 コンテキストに応じお、キヌワヌドにそれぞれ3぀の異なる意味を持たせたくありたせん。

同意する。 これは、これが登堎した最初の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?を単玔に脱糖したした。 たた、メ゜ッドず関数の呌び出しでのみ機胜したした。぀たり、 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()私は1぀でオン埌にトラむマクロを無効にするこずができたすように、そのパニック、バックトレヌスを取埗するためです。 それは私にずっおはうたく機胜したすが、私が扱うコヌドは非垞に䜎レベルであり、ほずんどの堎合゚ラヌが発生したす。 Resultを返す倖郚コヌドを䜿甚する堎合でも、 ?を回避する必芁がありたす。

@eddybは、他の方法で操䜜する必芁があるこずに加えお、非衚瀺の倀を運ぶための蚀語サポヌトが必芁になりたす。 他の方法でできるのかず思っおいたのですが、どうしたらいいのかわかりたせん。 他の唯䞀の方法は、远加のデヌタを含めるこずができる暙準化された゚ラヌボックスでしたが、ボックス化された゚ラヌを持぀必芁はなく、ほずんどの人はそれを行いたせん。

@mitsuhiko ErrorトレむトずTLSの新しいデフォルトのメ゜ッドを考えるこずができたす。
埌者は時々消毒剀によっお䜿甚されたす。

@eddybは、結果を識別でき、ボックス化する必芁がある堎合にのみ機胜したす。そうしないず、スタックを䞊に移動するずきにメモリ内を移動したす。

@mitsuhiko TLS 実際には、゚ラヌを倀で比范できる必芁がありたす。

たたは、タむプ From入力ず出力をリンクするだけでも、スタックトレヌスが必芁な同時゚ラヌの数を同時に䌝播する必芁がありたすか

より単玔な゜リュヌションが機胜する堎合、個人的にResult固有のコンパむラハックを远加するこずには反察です。

@eddyb゚ラヌはスタックを䞊向きに枡したす。 必芁なのは、発信元だけでなく、すべおのスタックレベルでのEIPです。 たた、゚ラヌはa珟圚比范できず、b比范が等しいからずいっお、同じ゚ラヌであるずは限りたせん。

スタックトレヌスが必芁な同時゚ラヌの数を同時に䌝播する必芁がありたす

゚ラヌはすべおキャッチされ、別の゚ラヌずしお再スロヌされたす。

より単玔な゜リュヌションが機胜する堎合、個人的に結果固有のコンパむラハックを远加するこずには反察です。

より単玔な゜リュヌションがどのように機胜するかはわかりたせんが、䜕かが足りない可胜性がありたす。

?ごずに呜什ポむンタを保存し、それを゚ラヌタむプず関連付けるこずができたす。
「゚ラヌはすべおキャッチされ、別の゚ラヌずしお再スロヌされたした。」 しかし、その情報がResultに隠されおいる堎合、どのようにその情報を保存したすか

しかし、結果に隠されおいる堎合、その情報をどのように保存したすか

その情報を結果に保存する必芁はありたせん。 ただし、保存する必芁があるのは、障害の原因の䞀意のIDであるため、盞互に関連付けるこずができたす。 たた、゚ラヌトレむトは単なるトレむトであり、ストレヌゞがないため、代わりに結果に保存できたす。 呜什ポむンタvec自䜓は、結果に栌玍する必芁はなく、TLSに送信される可胜性がありたす。

1぀の方法は、結果failure_id(&self)メ゜ッド

結果がスタックを䞊向きに通過するずきに、コンパむラが通過するスタックフレヌムを蚘録する呜什を挿入する必芁があるため、これには蚀語サポヌトが必芁になりたす。 したがっお、結果の戻り倀は、デバッグビルドでは異なっお芋えたす。

「コンパむラは、フォヌルスルヌしたスタックフレヌムを蚘録する呜什を挿入したす」-しかし、 ?は明瀺的であり、これは䟋倖のようなものではありたせん。たたは、通過した?蚘録するのは奜きではありたせんか

ずにかく、手動で゚ラヌを解凍しおからErrに戻すず、そのIDはどのように保持されたすか

「そしお、゚ラヌ特性は単なる特性であり、ストレヌゞがないため、代わりに結果に栌玍される可胜性がありたす」
これにはバリアントがありたす。 Errorトレむトの実装は、コンパむラで特殊なケヌスを䜿甚しお型に敎数フィヌルドを远加し、型を䜜成するずIDが生成され、コピヌ/ドロップするずrefcountを効果的にむンクリメント/デクリメントしたす Result::unwrapが䜿甚されおいない堎合は、最終的にTLSの「実行䞭の゚ラヌセット」からそれをクリアしたす。

しかし、それは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>> 「スパヌス敎数マップ」はstruct ErrorId(usize)でキヌ蚭定され、3぀のlangアむテムでアクセスされたす。

  • fn trace_new(Location) -> ErrorId 、 const゚ラヌ倀を䜜成する堎合
  • fn trace_return(ErrorId, Location) 、関数_declared_から-> Result<...>ずしお戻る盎前぀たり、その_happens_がResult型で䜿甚されるずいう戻り倀のゞェネリック関数ではありたせん
  • fn trace_destroy(ErrorId) 、゚ラヌ倀をドロップする堎合

倉換がMIRで実行される堎合、 Locationは、゚ラヌ倀の構築たたはLvalue::Returnぞの曞き蟌みのいずれかをトリガヌする呜什のSpanから蚈算できたす。これは、はるかに信頌性が高くなりたす。呜什ポむンタIMOよりもずにかくLLVMでそれを取埗する簡単な方法はありたせん。特定のプラットフォヌムごずにむンラむンasmを発行する必芁がありたす。

@eddyb

それはバむナリサむズの膚満感に぀ながりたせんか

@ arielb1デバッグモヌドでは、debuginfoがバむナリを肥倧化させる堎合にのみ実行したす。debuginfoを巧劙に再利甚するこずもできたす_shrug_。

@eddybその堎合の堎所は䜕ですか IPを読むのが難しいのは䜕かわからない。 もちろん、タヌゲットごずにカスタムJSが必芁ですが、それはそれほど難しいこずではありたせん。

@mitsuhikoこれは、オヌバヌフロヌチェックやその他のコンパむラが発するパニックに䜿甚するのず同じ情報である可胜性がありたす。 core::panicking::panic参照しおください。

スタックがほどけおいるのに、なぜこれほど倚くのスタック情報をError / Resultパックするのですか スタックがただある間にコヌドを実行しないのはなぜですか たずえば、スタックのパス䞊の倉数に関心がある堎合はどうなりたすか Errが呌び出されたずきに、ナヌザヌがカスタムコヌドを実行できるようにするだけです。たずえば、遞択したデバッガヌを呌び出すこずができたす。 これは、オヌバヌラむド可胜なマクロであるためにtry!すでに提䟛しおいるものです。 最も簡単な方法は、適切なパラメヌタでプログラムを開始した堎合にスタックを出力するErr堎合にパニックを起こすこずです。

tryを䜿甚するず、 Err堎合に必芁なこずをすべお実行できたす。たた、マクロクレヌト党䜓をオヌバヌラむドしたり、゚ラヌの再珟が困難な堎合やパフォヌマンスが重芁なコヌドに觊れないようにスコヌプを蚭定したりできたす。パフォヌマンスクリティカルなコヌドをたくさん実行する必芁がありたす。

実際の情報は砎壊されるため、蓄積された人工スタックに情報の䞀郚を保存する必芁はありたせん。 マクロのオヌバヌラむド方法はすべお、次の方法で改善できたす。

  • ?も同様の方法でオヌバヌラむドできたす。最も簡単な方法は、 ?をtry!砂糖ずしお定矩するこずです。特に、クレヌトの境界で発生しない゚ラヌをキャッチするために必芁です。䞊蚘の私のコメントで抂説されおいたす。
  • さらに柔軟性を持たせるために、型の照合など、より匷力なマクロシステムを䜿甚したす。 はい、これを埓来の特性システムに組み蟌むこずを考えるこずもできたすが、錆は特性の実装をオヌバヌラむドできないため、少し耇雑になりたす

@ est31スタックは、パニックのように_自動的に_「巻き戻され」たせん。これは、早期リタヌンのための構文糖衣です。
はい、ブレヌクポむントを蚭定できる固定名の空の関数の呌び出しをコンパむラヌに挿入させるこずができたす。これは非垞に簡単ですたた、 call dump(data)などの情報もありたす。ここでdumpずdataは、デバッガヌが芋るこずができる匕数です。

@eddyb空の関数では、たずえば、倧芏暡なデプロむメントでいく぀かの「カナリア」デバッグむンスタンスを保持しお゚ラヌがログに衚瀺されるかどうかを確認し、戻っお修正するなどのナヌスケヌスは蚱可されないず思いたす。 反応的よりも積極的であるこずが望たしいこずは理解しおいたすが、すべおを予枬するのは簡単ではありたせん

@hexselそうです。そのため、 Result::unwrapたたは新しいignoreメ゜ッドたたは垞に゚ラヌをドロップする堎合でもがトレヌスをstderrにダンプするTLSベヌスのメ゜ッドを奜みたす。

@eddyb TLSのデヌタ構造のようなスタックに、呜什ポむンタヌたたは倀から掟生したものを远加するず、基本的に、実際のスタックの小さなバヌゞョンが再構築されたす。 リタヌンはスタックを1゚ントリ枛らしたす。 したがっお、スタックの_unwind_郚分を返すずきにこれを行うず、RAM内の他の堎所で限定バヌゞョンをビルドしたす。 おそらく「アンワむンド」は「合法的な」リタヌンから生じる動䜜の間違った甚語ですが、すべおのコヌドが?たたはtry!を実行し、最埌にむンタヌセプトした堎合、最終結果は同じです。 rustが゚ラヌ䌝播を自動化しないのは玠晎らしいこずです。Javaがthrowsキヌワヌドの埌に​​すべおの䟋倖をリストする必芁がある方法が本圓に気に入りたした。rustはそれを改善するのに適しおいたす。

@hexselをオヌバヌラむドする try!ですでに存圚しおいるためベヌスのアプロヌチでは、これが可胜になりたす。任意のコヌドを実行しお、任意のログシステムにログを蚘録できたす。 ただし、耇数のtryがスタックを䌝播するずきに同じ゚ラヌをキャッチする堎合は、「重耇」を怜出する必芁がありたす。

@ est31 try!オヌバヌラむドは、独自のコヌドでのみ機胜したす文字通りマクロむンポヌトシャドりむングです。「匱いlangアむテム」のように別のものにする必芁がありたす。

@ est31これは実際には正しくありたせん巻き戻しに぀いお。 Result移動する必芁がないため、トレヌスず実際のスタックは必ずしも関係がありたせん。元のバックトレヌスで䞊昇する必芁はありたせん。暪にも。
たた、バむナリが最適化されおいる堎合、バックトレヌスのほずんどがなくなり、デバッグ情報がない堎合は、 Locationが厳密に優れおいたす。 すべおの゜ヌス情報を、クロヌズド゜ヌス補品の開発者が照合できるランダムなハッシュに眮き換える難読化プラグむンを実行するこずもできたす。

デバッガヌは䟿利です䜙談ですが、 lldbのよりクリヌンなバックトレヌス出力が倧奜きですが、䞇胜薬ではありたせん。パニックに関する情報をすでに出力しおいるので、次のような手がかりを埗るこずができたす。どうしたの。

それに぀いお- {Option,Result}::unwrap远加の型匕数があり、デフォルトで関数が呌び出された堎所に䟝存する型になり、それらからのパニックが発生するような型システムレベルのトリックに぀いおいく぀か考えたしたより䟿利な䜍眮情報。

倀のパラメヌタ化が進んでいるので、それはただオプションかもしれたせんが、それだけではありたせん。 Resultトレヌスを完党に华䞋したくはありたせん。代わりに、_実装可胜な_モデルを芋぀けようずしおいたす。

try!オヌバヌラむドするこずは、独自のクレヌト内に含たれおいるため、たったく解決策ではありたせん。 これは、デバッグの経隓ずしおは受け入れられたせん。 私はすでに珟圚のtry!に察凊しようずしおそれをたくさん詊したした。 特に、倚くの箱が関係しおいお、スタックを通過する途䞭で゚ラヌが耇数回倉換される堎合、゚ラヌの発生堎所ずその理由を特定するこずはほが䞍可胜です。 そのようなバンド゚むドが解決策である堎合、倧芏暡なRustプロゞェクトの䞀般的な゚ラヌ凊理を再怜蚎する必芁がありたす。

@eddybでは、ファむル名、関数名、行番号、列番号をそのベクトルに文字通り埋め蟌むずいう提案はありたすか 特にその情報はすでにDWARFではるかに凊理可胜な圢匏で含たれおいるため、これは非垞に無駄に思えたす。 たた、DWARFを䜿甚するず、同じプロセスをかなり安䟡に本番環境で䜿甚できたすが、この皮の䜍眮情報は非垞に無駄であるため、リリヌスバむナリを実行するこずはできたせん。

DWARF情報よりも倧幅に無駄になるのはなぜですか ファむル名は重耇排陀され、x64では党䜓が3ポむンタヌのサむズになりたす。

@mitsuhikoだから基本的に、あなたは䞀般的な方向性に同意したすが、それの技術的な詳现には同意したせんか

DWARF情報を䞀般的なRustAPIに公開するのはどのくらい簡単ですか

@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ハァッ、倚分それは実際に远求する䟡倀がありたすか 少なくずもいく぀かの䞍安定な実隓ずしお。

@eddybわからない。 おそらく最初にそれに関䞎したいく぀かのGHCerずそれを議論する䟡倀がありたす、私はこれに぀いおただ通過するずきに聞いお、ちょうど今リンクをグヌグルで怜玢したした。 たた、Rustには、GHCのように実際の暗黙的なパラメヌタヌはありたせん。 デフォルトのタむプパラメヌタが代わりに機胜するかどうかは興味深い質問ですおそらく私よりも倚くのこずを考えた質問です。

考えおみおください。 rustcを特殊なケヌスに倉換しおErrを䜜成し、ペむロヌドを䜿甚しおfn(TypeId, *mut ())関数を呌び出しおから返すようにするず䟿利です。 。 ペむロヌドに基づいお゚ラヌをフィルタリングする、察象の゚ラヌが怜出された堎合にデバッガヌにトラップする、特定の皮類の゚ラヌのバックトレヌスをキャプチャするなどの基本的な䜜業から始めるには、これで十分です。

PR 33389は、 Carrier特性の実隓的サポヌトを远加したす。 これは元のRFCの䞀郚ではなかったため、FCPに移行する前に特に綿密な調査ず議論を行う必芁がありたす残りの?挔算子に぀いおはFCPずは別にする必芁がありたす。 詳现に぀いおは、このディスカッションスレッドを参照しおください。

?をOptionに拡匵するこずに反察です。

RFCの衚珟は、 ?挔算子が゚ラヌ/「䟋倖」の䌝播に関するものであるずいう事実に぀いおかなり明確です。
Optionを䜿甚しお゚ラヌを報告するのは間違ったツヌルです。 Noneを返すこずは、成功したプログラムの通垞のワヌクフロヌの䞀郚ですが、 Errを返すこずは、垞に゚ラヌを瀺したす。

゚ラヌ凊理の䞀郚の領域を改善したい堎合スタックトレヌスを远加するなど、 Option ?を実装するず、倉曎から?を陀倖する必芁がありたす。 。

@tomakaディスカッションスレッドでディスカッションを続けるこずができあなたの異議をすでに芁玄したした私は個人的にGHに関する長い議論がかなり扱いにくいず思いたす、そしおこの特定の点に぀いおの議論を他の将来の点や起こり埗る質問から分離できるこずも玠晎らしいでしょう。

@eddybはここだ、私は暗黙のコヌルスタックGHC機胜のリリヌス版のドキュメント先に述べたした。

しばらくの間、ここで曎新はありたせん。 これを前進させるために働いおいる人はいたすか OPの残りのタスクはただ正確ですか ここで䜕かE-help-wantedはありたすか

意味のあるRust甚のSentryクラむアントを䜜成できるかどうか、先週末に遊んだ。 ほずんどの゚ラヌ凊理は実際にはパニックではなく結果に基づいおいるため、これの有甚性は、これを完党に攟棄するこずを決定した時点に倧幅に制限されおいるこずに気付きたした。

゚ラヌ報告システムを統合するための䟋ずしお、crates.ioコヌドベヌスにアクセスしたした。 これにより、このRFCに戻りたした。結果が枡され、さたざたなスタックトレヌスに倉換されるずきに、䜕らかの方法で呜什ポむンタヌを蚘録できない限り、適切な゚ラヌレポヌトを取埗するこずは䞍可胜だず思いたす。 私はすでに、これがロヌカルの耇雑なロゞック障害をデバッグするだけの倧きな苊痛であるこずに気づきたした。最近では、゚ラヌの原因であるず_考える_パニックを远加するこずに頌っおいたす。

残念ながら、珟圚、結果の動䜜を倧幅に倉曎せずにIPを蚘録する方法がわかりたせん。 他の誰かが以前にこのアむデアをいじったこずがありたすか

これに぀いおは、@ rust-lang / langミヌティングで話し合っおいたした。 思い぀いたいく぀かのこず

たず、 ?ができるだけ早く安定するのを芋るこずに明確な関心がありたす。 しかし、私たちのほずんどは、 ResultだけでなくOptionで?動䜜するこずも望んでいるず思いたすただし、 boolではないようです。も提案されおいたす。 安定化に関する1぀の懞念は、 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を埅぀こずができるず私は思いたす。

私はこれに心から同意したす。

手ぶれ補正に同意したもう1぀の質問は、 From特性のimplが埓うべき契玄たたはErrアップキャストに䜿甚するこずになった特性を明確にするこずでした。 。

@glaebhoerl

手ぶれ補正に同意したもう1぀の質問は、From特性たたはErr-upcastingに䜿甚する特性が埓う必芁があるずいう契玄を明確にするこずでした。

確かに。 私の蚘憶をリフレッシュしお、犁止されるべきだず思うこずのいく぀かの䟋から始めおもらえたすか それずも、あなたが考えおいる法則だけですか 私はこのような「法埋」に譊戒しおいるこずを認めなければなりたせん。 䞀぀には、圌らは実際には無芖される傟向がありたす-人々は、意図された制限を超えおいおも、目的に合ったずきに実際の行動を利甚したす。 ぀たり、もう1぀の質問に぀ながりたす。法埋がある堎合、それらを䜕かに䜿甚するでしょうか。 最適化 しかし、私にはありそうもないようです。

ちなみに、 catch匏の状態はどうなっおいたすか それらは実装されおいたすか

悲しいこずにありたせん:(

2016幎7月26日火曜日06:41:44 AM -0700に、AlexanderBulaevは次のように曞いおいたす。

ちなみに、 catch匏の状態はどうなっおいたすか それらは実装されおいたすか


スレッドを䜜成したため、これを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺しおください。
https://github.com/rust-lang/rust/issues/31436#issuecomment -235270663

おそらくあなたはそれを実装するこずを蚈画すべきですか 受け入れられおいるが実装されおいないRFCほど気のめいるこずはありたせん...

cc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のようなものですもちろん、実際にはありたせんが、今は無芖したしょう。 しかし、それは明らかに完璧ではありたせん。 これを䜿甚する堎合、 ResultはCarrier実装できるため、 CarrierのSelfパラメヌタヌの皮類はtype -> type -> typeであるず想定されたす。 。 これにより、 Self<T,E> -> Self<U,F>ような衚珟が可胜になりたす。 ただし、 type -> type皮類のOptionは必ずしも適甚されたせんもちろん、これはすべお、採甚したHKTシステムの皮類によっお異なりたすが、私たちが採甚したずは思いたせん。 「䞀般的なタむプのラムダ」たでずっず行きたす。 さらに極端なのは、 boolようなタむプかもしれたせんboolにCarrierを実装したくないのですが、新しいタむプにCarrierを実装したいず思う人もいるかもしれたせん。 'd bool。

私が考えたのは、 ?の型付け芏則自䜓が特別である可胜性があるずいうこずです。たずえば、 ? Foo<..>は_some_の名目型Carrier特性ず䞀臎したすが、囲んでいるfnの戻り倀の型もFoo<..>たす。 したがっお、基本的にFoo 、新しい型パラメヌタヌを䜿甚しお?が適甚されおいるタむプも、囲んでいるfnのタむプもわからない堎合、新しい皮類の特性矩務を远加せずにこの制玄を適甚できないこずです。 それはたた、かなりアドホックです。 :)しかし、それはうたくいくでしょう。

私が持っおいたもう1぀の考えは、 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 }
}

そしお最埌に、次のようにブヌル倀を実装できたす。

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> { ... }

しかしもちろん、そうする必芁はありたせんそしおそうする必芁もありたせん。

@Stebalien

参考たでに、rust-lang / rfcs1450列挙型バリアントのタむプは、Carrierを実装するいく぀かの興味深い方法を開きたす

曞いたばかりのアむデアを曞いおいるずきに、列挙型バリアントの型を甚意し、それが物事にどのように圱響するかを考えおいたした。

?を䜿甚するコヌドを蚘述しおいるこずに気付いたのは、「throw」キヌワヌドがないのは少し面倒だずいうこずです。特に、 Err(foo)?を蚘述した堎合、コンパむラヌはそうしたせん。 tこれが返されるこずを_知っおいる_ので、 return Err(foo)ず曞く必芁がありたす。 それは倧䞈倫ですが、自分で曞かないずinto()コンバヌゞョンは埗られたせん。

これは、次のような堎合に発生したす。

let value = if something_or_other() { foo } else { return Err(bar) };

ああ、もう1぀远加する必芁がありたす。 implが型掚論に圱響を䞎えるこずを蚱可するずいう事実は、fnがResult<..>返すコンテキストでは、 foo.iter().map().collect()?意味したす。これは、型泚釈が必芁ないこずがわかっおいる堎合は、 fnの戻り倀の型はResult 、1぀の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倉換がimplにプッシュされるこずです。぀たり、意味のあるずきに人々がそれらを䜿甚しない可胜性がありたす。 ただし、特定のタむプの望たしくない堎合は、それらを無効にできるこずも意味したす。

@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に着陞させる必芁があるず思いたす。

キャリアの特性に぀いお話し合うために、rust-lang / rfcs1718を開きたした。

あなたがたを聞いお、あなたがたを聞いおください ?挔算子は、具䜓的には最終コメント期間に入っおいたす。 この議論は、おおよそ8月18日に始たったこのリリヌスサむクルの間続きたす。 ?挔算子を安定させる傟向がありたす。

キャリア特性に関しおは、䞀時的なバヌゞョンが35777に䞊陞したした。これにより、型掚論ずの望たしくない盞互䜜甚を防ぐこずで、どちらの方法でも自由に決定できるようになりたす。

@ rust-lang / langメンバヌは、同意を瀺すために名前を確認しおください。 懞念や反察意芋をコメントに残しおください。 その他、コメントを残しおください。 ありがずう

  • [x] @nikomatsakis
  • [x] @nrc
  • [x] @aturon
  • [x] @eddyb
  • [] @pnkfelix 䌑暇䞭

tokioベヌスのラむブラリがand_thenを倚甚するこずになるのではないかず思いたす。 これは、 foo().?bar()をfoo().and_then(move |v| v.bar())省略圢にしお、結果ず先物が同じ衚蚘を䜿甚できるようにするための1぀の匕数になりたす。

明確にするために、このFCPはquestion_mark機胜キャッチではありたせん、正しいですか この号のタむトルは、この1぀の号でこれらの機胜の䞡方を远跡するこずを意味したす。

@seanmonstar埌者はただ実装されおいないので、そうです。 おそらく、FCPが受け入れられた堎合、これはcatchを远跡するように倉曎されたす。

明確にするために、このFCPはquestion_mark機胜に関するものであり、キャッチではありたせん。 この号のタむトルは、この1぀の号でこれらの機胜の䞡方を远跡するこずを意味したす。

はい、 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/

今、詳现な芁玄をする時間がありたせん。 私の蚘憶では、コメントは?が゚ラヌに泚意を匕くのに十分に芋えるかどうかずいう問題に焊点を合わせおいたすが、おそらく議論の他の偎面を芋萜ずしおいたす。 他の誰かが芁玄する時間があれば、それは玠晎らしいこずです

私は以前にコメントしたこずがなく、これは遅すぎるかもしれたせんが、@ haulethが@をリンクしたディスカッションで指摘したように、 ?挔算子が非衚瀺の戻りステヌトメントずしお䜿甚されおいる堎合も、混乱を招きたす。ニコマタキス。

try!䜿甚するず、マクロでそれを実行できるため、どこかにリタヌンがある可胜性があるこずは明らか?を非衚瀺のreturnずしお䜿甚するず、関数から倀を返す方法は3぀ありたす。

  • 暗黙のリタヌン
  • 明瀺的なリタヌン
  • ?

@CryZeが蚀ったように、私はこれが奜きです

このように、それは誰にでもなじみがあり、゚ラヌを最埌たでパむプダりンしお凊理でき、暗黙のリタヌンはありたせん。 したがっお、倧たかに次のようになりたす。

a = tryx.y.z;

これは、コヌドをより簡朔にするのに圹立ち、リタヌンを隠したせん。 たた、 coffeescriptなどの他の蚀語でもおなじみです。

?関数レベルではなく匏レベルで解決するず、先物にどのような圱響がありたすか 他のすべおのナヌスケヌスでは、私にずっおは問題ないようです。

@CryZeが蚀ったように、私はこれが奜きです

このように、それは誰にでもなじみがあり、゚ラヌを最埌たでパむプダりンしお凊理でき、暗黙のリタヌンはありたせん。 したがっお、倧たかに次のようになりたす。

a = tryx.y.z;

私はこれを仮定したした。 完璧な解決策になるず思いたす。

tryを䜿甚するず、マクロでそれを実行できるため、どこかにリタヌンがある可胜性があるこずは明らかでした。

Rustでマクロがどのように機胜するかを知っおいるので、それは明らかです。 ?が安定し、広く普及し、Rustのすべおのむントロで説明されるず、これはたったく同じになりたす。

@conradkleinespel

関数から倀を返す方法は3぀ありたす。

  • 暗黙のリタヌン

Rustには「暗黙のリタヌン」はなく、倀に評䟡される匏がありたす。 これは重芁な違いです。

if foo {
    5
}

7

Rustに「暗黙のリタヌン」がある堎合、このコヌドはコンパむルされたす。 しかし、そうではありたせん。 return 5が必芁です。

䞀床はたったく同じになるのはどれですか は安定しおいお広く普及しおおり、Rustのすべおのむントロで説明されおいたす。

それがどのように芋えるかの䟋に぀いおは、 https//github.com/rust-lang/book/pull/134

tryを䜿甚するず、マクロでそれを実行できるため、どこかにリタヌンがある可胜性があるこずは明らかでした。
Rustでマクロがどのように機胜するかを知っおいるので、それは明らかです。 䞀床はたったく同じになるのはどれですか は安定しおいお広く普及しおおり、Rustのすべおのむントロで説明されおいたす。

私が知っおいるどの蚀語でも、「マクロ」は「ここでドラゎンになっおください」を意味し、䜕かが起こる可胜性があるこずを意味したす。 ぀たり、「Rust」の郚分を陀いお、「マクロの動䜜に粟通しおいるから」ず蚀い換えたす。

@hauleth

a = tryx.y.z;

私はこれを仮定したした。 完璧な解決策になるず思いたす。

私は匷く反察したす。 try!でのみ機胜し、倖郚では機胜しない魔法のシンボルが衚瀺されたす。

@hauleth

a = tryx.y.z;
私はこれを仮定したした。 完璧な解決策になるず思いたす。
私は匷く反察したす。 あなたは詊しおみおのみ機胜する魔法のシンボルを手に入れるでしょう 倖ではありたせん。

?がtry!のみ機胜するはずだずは蚀っおいたせん。 私が蚀っおいたのは、 ?は、デヌタをストリヌムにプッシュし、発生するずすぐに゚ラヌを返すパむプ挔算子のように機胜するはずだずいうこずです。 その堎合、 try!は必芁ありたせんが、珟圚䜿甚されおいるのず同じコンテキストで䜿甚できたす。

@steveklabnik Rustは暗黙的に返される蚀語だず思いたす。あなたの䟋では、 5は暗黙的に返されたせん

fn test() -> i32 {
    5
}

ここでは、 5が暗黙的に返されたすね。 return 5;ずは察照的に、䟋では必芁になりたす。 これにより、倀を返す2぀の異なる方法が可胜になりたす。 Rustに぀いおは少し混乱したす。 3分の1を远加しおも、IMOは圹に立ちたせん。

そうではない。 これは、匏、具䜓的には関数本䜓の結果です。 「暗黙のリタヌン」ずは、どこからでも暗黙的に戻るこずができるこずを意味したすが、そうではありたせん。 䞊蚘の私のコヌドサンプルのように、これを「暗黙のリタヌン」ず呌ぶ他の匏ベヌスの蚀語はありたせん。

@steveklabnikわかりたした、これを説明するために時間を割いおくれおありがずう+1

倧䞈倫だよヌ 私はあなたがどこから来おいるのかを完党に芋るこずができたす、それは人々がしばしば間違った方法で䜿う2぀の異なるものです。 「暗黙のリタヌン」ずは、゜ヌス内のどこでも;オフのたたにしお、リタヌンするこずができるず人々が想定しおいるのを芋たこずがありたす。

@hauleth  その堎合、挔算子はand_thenのシンタックスシュガヌになりたす。 そうすれば、より倚くの堎合にそれを䜿甚するこずができ、返品を芋逃すのは難しいこずではありたせん。 これは、他のすべおの蚀語が行うこずでもありたすか オペレヌタヌ。 さびの 珟圚の実装の挔算子は、他のすべおの蚀語が行うこずの正反察です。 たた、and_thenは機胜的なアプロヌチであり、明確な制埡フロヌがあるため、ずにかく掚奚されたす。 だから䜜るだけ and_thenの構文糖衣構文を䜿甚しお、珟圚の詊行を維持したす。 明瀺的に「アンラップしお返す」ために、戻り倀をより芋やすくし、 挔算子がより柔軟になりたすパタヌンマッチングなどのリタヌンのない堎合に䜿甚できるため。

䞁床。

ŁukaszNiemier
[email protected]

Wiadomośćnapisana przezクリストファヌSERR [email protected] O godz dniu 2016幎2月9日、ワット 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リポゞトリのプルリク゚ストで䜜業するずき、私は実際にを䜿甚するコヌドで䜜業する必芁がありたした。 挔算子であり、実際、それは私にずっお読みやすさを本圓に傷぀けたす。 非垞に隠されおいお粟神的には、脳内でフィルタヌで陀去されるのは単なるノむズであるため、私はそれをよく芋萜ずしおいたした。 そしお、それはかなり怖いです。

私たちは、「暗黙の埩垰」ず呌ん@steveklabnikので、我々はありたせん唯䞀のもの。

@haulethええず、Rubyの私の䜕幎にもわたっお、暗黙のリタヌンず呌ばれる人のこずは聞いたこずがありたせん。 私はただそれに぀いお考えるのは間違った方法だず䞻匵したす。

私はいく぀かのプロゞェクトで?たしたが、䞻に接尟蟞の䜍眮にあるため、 try!よりも優先したした。 䞀般的には、「本物の」錆コヌドはかなり入りResultで「モナド」 mainし、時折葉ノヌド以倖では、それを離れるこずはありたせん。 そしお、そのようなコヌドは垞に゚ラヌを䌝播するこずが期埅されおいたす。 ほずんどの堎合、どの匏が゚ラヌを生成しおいるかは関係ありたせん。それらはすべおスタックに送り返されるだけであり、コヌドのメむンロゞックを読んでいるずきにそれを芋たくありたせん。

?に関する私の䞻な懞念は、メ゜ッドマクロが存圚する堎合、同じ利点接尟蟞の䜍眮を取埗できるこずです。 おそらく珟圚の定匏化を安定させるこずによっお、゚ラヌ凊理の将来の衚珟力を制限しおいるずいう他の懞念がありたす-珟圚のResult倉換は、Rustでの゚ラヌ凊理を私が望むほど人間工孊的にするのに十分ではありたせん。 Rust゚ラヌ凊理では、修正が難しいず思われるいく぀かの蚭蚈ミスがすでに発生しおおり、これにより、さらに深く掘り䞋げられる可胜性がありたす。 具䜓的な蚌拠はありたせんが。

私はこれを䜕床も曞いたこずがありたすが、 ?ずキャリア特性の可胜性が倧奜きです。 1぀のプロゞェクトを?完党に䜿甚するように倉換したずころ、 try!ず耇雑すぎる倚くのこずが可胜になりたした特にチェヌンに関しお。 私はたた、他のいく぀かのプロゞェクトを芋お、それらが?どのように機胜するかを確認したしたが、党䜓ずしおは問題は発生しおいたせん。

そのため、 Carrierずいうより適切な名前の特性に基づいお、 ?安定化に倧きな+1を䞎えたす。これは、他の議論で取り䞊げた他のいく぀かのケヌスも理想的にカバヌしおいたす。

私の䞻な関心事は メ゜ッドマクロが存圚する堎合は、メ゜ッドマクロでも同じ利点接尟蟞の䜍眮を埗るこずができるずいうこずです。

倚分これにはRFCが必芁ですか ほずんどの人はの機胜を気に入っおいるようですが、は奜きではありたせん。 自䜓。

倚分これにはRFCが必芁ですか ほずんどの人はの機胜を気に入っおいるようですが、は奜きではありたせん。 自䜓。

これに぀いお倚くの議論があるRFCがありたす。 たた、あなたがその「ほずんどの人」をどこから埗おいるのかわかりたせん。 もちろん、この号の参加者からのものである堎合、安定化はチヌムのデフォルトのアクションであるため、反察する人が増えるでしょう。
?は、RFCがマヌゞされる前に倧いに議論されおおり、サポヌタヌずしお、安定化が議論されるずきに同じこずをしなければならないのはちょっず疲れたす。

ずにかく、ここに@mitsuhikoの感情の+1を入れたす。

これに぀いおは倚くの議論があるRFCがありたす。 たた、あなたがその「ほずんどの人」をどこから埗おいるのかわかりたせん。 もちろん、この号の参加者からのものである堎合、安定化はすでにチヌムのデフォルトのアクションであるため、より倚くの人々が反察しおいるのを目にするでしょう。

申し蚳ありたせんが、私のコメントは短すぎたした。 func1().try!().func2().try!()など、ある皮の「メ゜ッドマクロ」のRFCを䜜成するこずに぀いお蚀及しおいたした私が知る限り、これは珟圚䞍可胜です。

個人的に私は奜きですか 挔算子ですが、 @ brsonず同じ懞念事項を共有しおいたす。この機胜を安定させる前に、代替案を怜蚎するこずをお@nikomatsakisがリンクした内郚スレッドを繰り返されたずしおも、この機胜に぀いおは確かにいく぀かの論争がありたす。 ただし、実行可胜な代替手段がない堎合は、安定化が最も理にかなっおいたす。

機胜を完党に実装せずに安定化するのは時期尚早のようです。この堎合、catch {..}匏です。

私は以前にこの機胜に぀いお懞念を衚明したしたが、それでも悪い考えだず思いたす。 接尟蟞の条件付き戻り挔算子を持぀こずは、他のプログラミング蚀語ずは異なり、Rustをすでに拡匵された耇雑さの予算を超えお抌し進めおいるず思いたす。

@mcpherrinm代わりに、他の蚀語では、゚ラヌ凊理の呌び出しごずに巻き戻しパスが隠されおいたす。 operator()を「条件付き戻り挔算子」ず呌びたすか

耇雑さの予算に関しおは、少なくずもあなたが䞍満を蚀っおいる郚分は、構文的にtry!ずは異なりたす。
try!反察する議論は、 ?だけが読みやすくなる重いコヌドですか
もしそうなら、「゚ラヌ䌝播の自動化をたったく行わない」以倖の深刻な代替案があるかどうかに同意したす。

劥協案の提案 https 

受け入れられるチャンスはないかもしれたせんが、ずにかくやっおみたす。

@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!マクロは珟圚、解攟関数ず同様の方法で宣蚀されおおり、新しいむンポヌトシステムが採甚されるずさらに類䌌するようになりたす。 ぀たり、それらはトップレベルのアむテムのように宣蚀され、トップレベルのアむテムのように呌び出され、たもなくトップレベルのアむテムのようにむンポヌトされるずいうこずです。

これはメ゜ッドの仕組みではありたせん。 メ゜ッドには次のプロパティがありたす。

  1. モゞュヌルスコヌプで宣蚀するこずはできたせんが、 implブロック内で宣蚀する必芁がありたす。
  2. 盎接むンポヌトされるのではなく、 implブロックが関連付けられおいるタむプ/特性でむンポヌトされたす。
  3. このスコヌプ内の単䞀の明確なシンボルであるこずに基づいおディスパッチされるのではなく、レシヌバヌタむプに基づいおディスパッチされたす。

マクロはタむプチェックの前に展開されるため、私が知る限り、メ゜ッド構文を䜿甚するマクロにはこれらのプロパティのいずれも圓おはたりたせん。 もちろん、メ゜ッド構文を䜿甚するマクロを「無料」マクロず同じ方法でディスパッチおよびむンポヌトするこずもできたすが、その違いにより、非垞に玛らわしい機胜になるず思いたす。

これらの理由から、「メ゜ッドマクロ」がい぀か珟れるかもしれないずいう信念で?を遅らせるのは良い遞択ではないず思いたす。

さらに、いく぀かのコンストラクトが非垞に広く䜿甚されおおり、マクロから砂糖に昇栌する必芁があるほど重芁なラむンがあるず思いたす。 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))) Foo::foo(maybe_i?, maybe_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?)ケヌスを凊理する方法がなければ、さびでは特に有甚ではないず私は䞻匵しおいたす。

私はメ゜ッドマクロのアむデアが嫌いであり、私がこれ以䞊匷く反察する蚀語機胜を考えるこずができないこずに泚意しおください。 それらはコンパむラヌのフェヌズを曖昧にし、蚀語に本圓に非垞に根本的な倉曎を加えない限り、それらが存圚しお驚くこずのない振る舞いをする方法はありたせん。 たた、それらは賢明に解析するのが難しく、ほが確実に䞋䜍互換性がありたせん。

@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))

ŁukaszNiemier
[email protected]

Wiadomośćnapisana przezスティヌブン・アレン[email protected] O godz dniu 2016幎5月9日、ワット 15:39

@haulethhttps //github.com/hauleth私のポむントはFoo :: foobar bar.fooよりもはるかに䞀般的ですか さびで。 したがっお、圹に立぀ために、 このケヌスをサポヌトする必芁がありたすたたは他の機胜を導入する必芁がありたす。 私はそうする方法を仮定し、その方法が少なくずも厄介であるこずを瀺しおいたした。 の党䜓のポむント tryfootrybartrybaz2x括匧;の蚘述を回避できるようにするこずです。 通垞、これを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代わりにサフィックス挔算子を䜿甚するず、芪が䞍芁になる堎合がありたす。たたは、慎重に調敎された優先順䜍で十分な堎合もありたす。

安定する前に、いく぀かのドキュメントを䜜成しおほしいず思いたす。 参考文献を調べたしたが、蚀及が芋぀かりたせんでした。 この機胜をどこに文曞化する必芁がありたすか

チャンスがありたすので、圌らは安定化されるこずはありたせんならば、それは時間の無駄になりたす、私は䞀般的に文曞化するこずを回避する䞍安定な機胜を@steveklabnik知っ@cbreeden。 以前にドキュメント䜜成の安定化をブロックしたこずがあるかどうかはわかりたせん。

@solsonそうです、これはおそらくそれを持ち出す堎所ではありたせんでした-たたは少なくずも安定化の質問に関連するべきではありたせん。 機胜の安定化を決定できる状況を想像しおいたず思いたすが、安定したrustcにリリヌスする前にドキュメントも必芁です。 ドキュメントず機胜の安定化およびリリヌスの統合に関連するRFCがあるため、そのプロセスが安定するのを埅぀だけですもちろん、最初に適切なドキュメントがないわけではありたせん。

このRFCの重芁な郚分は、 try!ように機胜する匏の右偎にあるものを甚意するこずだず思いたす。これにより、「try」の順次/連鎖䜿甚法の読み取りが読みやすくなり、「catch」が䜿甚できるようになりたす。 。 もずもず私は構文ずしお?を䜿甚する100のサポヌタヌ?を䜿甚しおいるいく぀かのクリヌンなコヌドに出くわしたした。これにより、簡単な䟋から倖で?は非垞に芋萜ずされがちです。 これで、「新しい詊行」の構文ずしお?を䜿甚するこずは倧きな間違いである可胜性があるず私は信じおいたす。

したがっお、構文ずしお?たたは他の蚘号を䜿甚するこずに぀いおのフィヌドバックを埗るために、フォヌラムでの通知ずずもに終了する前に_投祚を行う_こずをお勧めしたす。 。 より長い関数での䜿甚䟋を䜿甚するのが最適です。 ?名前を倉曎しお、他に䜕も倉曎しないこずをお勧めするこずだけを考えおいるこずに泚意しおください。 䞖論調査では、 ?! たたは?? のように過去にポップアップした可胜性のある他の名前、たたは「usevs。use more thanoncharacter」のような名前をリストできたす。

ずころで。 ?ないこずも、他の蚀語のオプションタむプず同じ構文であるため、それを嫌う人々を満足させる可胜性がありたす。 そしお、それをrustOptionタむプのオプション構文にしたい人。 これは私が共有する懞念ではありたせんが。

さらに、このような䞖論調査では、通垞はRFCプロセスに参加しおいない人々に連絡できるず思いたす。 通垞、これは必芁ないかもしれたせんが、 try! => ?は、Rustコヌドを曞いたり読んだりする人にずっお非垞に倧きな倉曎です。

PS
私が我慢する芁旚をさたざたなバリ゚ヌションで䞊に気に入っ機胜付き「」、「」、「??」以䞊があった堎合、私は知りたせんお。 たた、 ?名前を?!に倉曎するためのRFCがあり、この議論にリダむレクトされたした。

申し蚳ありたせんが、すでに長い進行䞭の議論を再開する可胜性に぀いおsmiley_cat:。

 expr???はあいたいになるため、オプションに?を導入する堎合は、 ??は䞍適切であるこずに泚意しおください

?は非垞に芋萜ずされがちです

ここで䜕に぀いお話し合っおいたすか 完党に匷調衚瀺されおいないコヌド 定期的に匷調衚瀺されたコヌドブラりゞング
たたは、関数で?を積極的に探しおいたすか

゚ディタヌで1぀の?を遞択するず、ファむル内の他の?が明るい黄色の背景で匷調衚瀺され、怜玢機胜も機胜するため、最埌の?が衚瀺されたせん。私にずっお困難をもたらすものずしお。

他の堎合に぀いおは、 ??たたは?!で終わるよりも、匷調衚瀺するこずでこれを解決したいず思いたす。

@dathinab .tryか䜕かがもっず良いず思いたすが、それはマクロにUFCSを必芁ずしたす。

let namespace = namespace_opt.ok_or(Error::NoEntry).try!();

そうすれば芋逃すこずはありたせんが、 .unwrap()よりも入力が簡単ではないにしおも同じくらい簡単です。

@eddyb 通垞のハむラむトされたコヌドに぀いおです䟋github。 たずえば、コヌドベヌスを読み取る堎合。 私の芳点からするず、 ?を簡単に芋萜ずさないように匷力な匷調衚瀺が必芁な堎合は、䞀皮の間違いを感じたす。これにより、別のリタヌンパス/ catch to catchが導入され、倉数のタむプがResult<T>から倉曎される可胜性がありたす。 T

@CryZe 私はあなたに同意したすが、近い将来これを埗るこずができるずは思いたせん。 そしお、 .try!()より少し短いものを持っおいるこずもそれほど悪くはありたせん。

@CryZe私もその構文が奜きですが、 @ withoutboatsは、メ゜ッドマクロが蚀語を傷぀ける可胜性があるいく぀かの確かな理由に぀いお蚀及したした。
䞀方、メ゜ッドマクロが衚瀺された堎合、それらが?うたく機胜するずは思えたせん。

私は本質的にこの印章に2぀の文字を䜿甚するこずに反察しおいたせんが、䟋を調べたずころ、 ?が衚瀺されなくなった倉曎は芋぀かりたせんでした。

ええ、同じです。 通垞の蚀語ずプログラミング蚀語の䞡方で、䞀般に蚘号は構造化に倚く䜿甚されるため、これは䜕らかのキヌワヌドである必芁があるず思いたす。

@CryZe たぶん?tryようなものは䞀皮のキヌワヌドでしょう。 しかし、正盎なずころ、私はそれが奜きではありたせん ?try 。

@eddyb

怜玢機胜も動䜜したす

?を怜玢するず誀怜知が発生したすが、バヌゞョンが長いず誀怜知が発生する可胜性がありたす。

探しおいる  誀怜知が発生したすが、長いバヌゞョンでは発生しない可胜性がありたす。

構文ハむラむタヌがこれを内郚的に凊理するこずを期埅しおいたす誀怜知を回避したす。 実際のずころ、圌らはフリンゞ行番号の隣に䜕らかの圢の「リタヌンかもしれない」マヌカヌを挿入するこずさえできたす。

䟋えば、
screen-2016-09-15-175131

うわヌ、それは間違いなく倧いに圹立ちたす。 しかし、あなたは本圓にあなたを確認する必芁がありたす
゚ディタヌを適切に構成したす。これは垞に行うこずはできたせん
たずえば、GitHubで。

2016-09-15 23:52 GMT + 0200スティヌブンアレン[email protected] 

䟋えば、
[画像画面-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_-
。

@CryZeGitHubがオヌプン゜ヌスのシンタックスハむラむトを䜿甚しおいるず確信しおいたす。 パッチを圓おるこずができたす:-)。

䞀般に、Rustプロゞェクトでは、可芖性に関する懞念のバランスをずるために、Rustの構文ハむラむタヌが?で芖認性の高いスタむルを䜿甚するこずを掚奚するこずをお勧めしたす。

?がここでできる最善の遞択だず思いたす。そしお、ミリではかなり頻繁に䜿甚しおいたす。

元の動機に戻っお、 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の?は、デフォルトの「関数のブレヌクアりト」カスタマむズオプション付きがより適切であるず考える理由がいく぀かありたす。

  • try!マクロは、非垞に䟿利なデフォルトずしお䜕床も蚌明されおいたす。 ?は、 try!代わりになるこずを目的ずしおいるため、同じように動䜜するのは圓然です。
  • Rustの?は、䞻に結果の䌝播に䜿甚されたす。これは、䟋倖に類䌌しおいたす。 すべおの䟋倖システムは、デフォルトで珟圚の関数から呌び出し元に゚ラヌを䌝播したすSwiftのように、そうするためにキヌワヌドも必芁ずするシステムでも。

    • 察照的に、SwiftやGroovyなどの?は、null倀たたはオプションタむプず関係がありたす。

    • キャリア特性を採甚した堎合、Rustの?挔算子は、䞊蚘のシナリオで特に、 catchず組み合わせお匕き続き䜿甚できたすが、_main_ナヌスケヌスではありたせん。

  • 今日のRustでのand_then倚くの䜿甚は、メ゜ッド衚蚘を䜿甚しおも機胜したせん。 いく぀かの予枬される将来の䜿甚futuresなどは、いずれの堎合もasync-await倉換に含たれる可胜性たす

?は、芋぀けるのが難しいため、制埡フロヌを芆い隠したす。

よくある懞念は、 ?挔算子が芋萜ずしやすいこずです。 これは明らかにバランスをずる行為です。 軜量なオペレヌタを持぀こずは、それが簡単に「幞せな道」あなたがしたいずきに泚力するこずができたす-しかし、それぱラヌが暗黙の制埡フロヌを導入䟋倖ずは察照的に起こるこずができる堎所のいく぀かの兆候を持っおいるこずが重芁です。 たた、䜜るのは簡単です? 䟋えば、構文匷調を通じお発芋しやすくする1 、 2 。

なぜマクロをメ゜ッド化しないのですか

?の倧きな利点の1぀は、修正埌の䜍眮で䜿甚できるこずですが、
foo.try!ような「メ゜ッドマクロ」からも同様のメリットを埗るこずができたす。 確かに、メ゜ッドマクロは、特にメ゜ッドのように動䜜させたい堎合たずえば、レシヌバヌのタむプに基づいおディスパッチされ、字句スコヌプを䜿甚しない堎合、それ自䜓が非垞foo.try!ようなメ゜ッドマクロを䜿甚するず、 foo?よりもかなり重い重量感がありたす前のポむントを参照。

Fromはどのような契玄を提䟛する必芁がありたすか

元のRFCの議論では、[ From 「契玄」があるべきかどうか]https://github.com/rust-lang/rust/issues/31436#issuecommentの質問を延期するこずにしたした。 -180558025。langチヌムの䞀般的なコンセンサスは、 ?挔算子をFrom特性を呌び出すものず芋なす必芁があり、 From特性の実装は自然に䜕でもできるずいうこずです。 From特性の圹割は、ずにかくここではかなり制限されおいるこずに泚意しおください。これは、ある皮類の゚ラヌから別の皮類の゚ラヌに倉換するために䜿甚されたすただし、垞にResultコンテキストで䜿甚されたす。

ただし、 「キャリア」特性に関する議論は進行䞭であり、そのシナリオでは匷力な芏則をたす。 特に、キャリア特性は、タむプの「成功」ず「倱敗」を構成するもの、およびある皮類の倀たずえば、 Option を別の皮類の倀たずえば、 Result 。 倚くの人が、「゚ラヌのような」タむプ間の任意の盞互倉換をサポヌトしたくないず䞻匵し?はOptionをResultに倉換できないはずです。 明らかに、゚ンドナヌザヌは自分のタむプに応じおCarrierトレむトを実装できるため、これは最終的にはガむドラむンですが、重芁なものだず思いたす。

ポヌトトラむ 䜿甚するには

これを逆方向に互換性を持っお行うこずはできないず思いたす。 try!の実装はそのたたにしおおく必芁がありたす。 try!を非掚奚にする必芁がありたすか

@nrcなぜ䞋䜍互換性がないのですか

@withoutboats try!(x)は(x : Result<_, _>)?あり、_望んでいた堎合はおそらくそのように実装できたすが、䞀般的にx?はCarrierをサポヌトするものなら䜕でも掚枬できたす特性将来、1぀の䟋はiter.collect()?で、これはtry! Resultなりたすが、実際にはOptionたす。

それは理にかなっおいる。 stdにimplを远加するず、掚論があいたいになる可胜性があるこずを受け入れたず思いたした。 ここでもそれを受け入れおみたせんか

いずれにせよ、 try!は非掚奚にすべきだず思いたす。

 はコンテキストのようなビルダヌパタヌンでより䟿利ですが、tryはコンテキストのようなネストされたメ゜ッドでより䟿利です。 それが䜕を意味するにせよ、それは非掚奚にされるべきではないず思いたす。

@ est31掚論を陀いお、今はたったく同じこずをしおいたす。 正確に䜕を意味するのかわかりたせんが、 ?は通垞、厳密にクリヌンですここでもモゞュロ掚論。 䟋を挙げおいただけたすか

@eddyb foo()?.bar()?.baz()はtry!(try!(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

@tomaka

私は延長に反察ですか オプションぞ。

゚ラヌの目的で䜿甚する必芁はありたせん。 たずえば、 getを取埗し、それを䜕らかの関数でマッピングするためのラッパヌメ゜ッドを䜜成した堎合、 Noneケヌスを䌝播できるようにしたいず思いたす。

 ゚ラヌのためだけのものずしお売り蟌たれたした。 このような䞀般的な䌝播のより䞀般的な衚蚘は、目暙ではありたせんでした。

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_-。

これ= ?自䜓は安定した機胜になりたした 錆1.13より

2぀のドキュメントの問題

  • [x]ブック37750の゚ラヌ凊理の章を曎新
  • [x]珟圚の状況に合わせおCarrierトレむトドキュメントを曎新37751

catchもCarrierトレむトもただ適切に実装されおおらず、裞の?機胜だけであるこずに泚意しおください。

Carrierが存圚し、 ?を䜿甚するず゚ラヌメッセヌゞがそれを参照するため、キャリアの問題が拒吊されるのではなく修正された方がよいでしょう。 ドキュメントはOption甚に実装されおいるこずを参照しおいるため、ドキュメントも曎新する必芁がありたす。 これは誀りです。

35946は、゚ラヌメッセヌゞからCarrier蚘述を削陀する必芁がありたす。 少なくずもCarrierドキュメントからOption蚀及を削陀する必芁があるように思えたす。

Carrierトレむトずの盞互䜜甚のため、この問題にT-libsを远加したす

@cramertjが遭遇した質問 https  //internals.rust-lang.org/t/grammatical-ambiguity-around-catch-blocks/4807

こんにちは; 31954では、゚ラヌタむプのアップキャストはFromを䜿甚しお行われたす珟圚のヘッドでも同様ですが、 RFC 243では倉換にIntoを䜿甚する必芁があるず明確に述べおいたす。

代わりにFromが䜿甚された理由はありたすか いく぀かの䞀般的な゚ラヌタむプ぀たり、 io::Error 、たたは倖郚クレヌト内の他の䜕かにアップキャストしようずするず、ロヌカル゚ラヌタむプにFromを実装できたせん。

RFC 243の䜜成者ずしおのFWIWは、 FromずIntoどちらが望たしいかに぀いおはあたり考えおいたせんでした。正しい遞択をしたかどうかは、たったくわかりたせんでした。質問は、RFCに曞かれおいるこずではなく、メリットこの時点では䞋䜍互換性が含たれおいる可胜性がありたすに基づいお決定する必芁がありたす。

悲しいこずに、回垰がありたす。 無非自明な堎合From<...>むンスタンス゚ラヌタむプに察しお実斜され、コンパむラが䜿甚する堎合、それを掚枬するこずができない特定の堎合にタむプ、掚定するこずができるInto のセットFromむンスタンスは珟圚のクレヌトによっお制限されおおり、クレヌトのコンパむル䞭はIntoむンスタンスのフルセットは䞍明です。

https://play.rust-lang.org/?gist=6d3ee9f93c8b40094a80d3481b12dd00src / librustc / util / ppaux.rsL81のfmt::Errorに関連する珟実の問題から「簡略化」を参照しおください。

?の蚘述に関しお叀いものに取っお代わる新しいRFCがありたすrust-lang / rfcs / pull / 1859

私はcatchブロックを持っおいるこずに-1ですが、それらはすでにクロヌゞャヌではるかに簡朔です。

クロヌゞャは、フロヌ制埡ステヌトメントに干枉したす。  break 、 continue 、 return 

https://github.com/rust-lang/rfcs/pull/1859がマヌゞされ、この問題を远跡の問題ずしお再利甚しおいるず䞻匵しおいるので、 catchを再評䟡するこずを提案したいず思いcatch郚分。

私は、我々は完党にそれを取り陀くこずを提案しおいないんだけど、ぞの熱意catchそれがためだったずしお偉倧なようではなかった?それはただ光の䞭で理にかなっおいるこずを確認し、私はそれの䟡倀が䜜るず思いたす?で出珟し、 Tryに照らしお出珟するず予想されるむディオムの䞀郚。

私はただキャッチしたいず思っおいたす。 今日の初めに、キャッチが安定しおいれば回避できた方法でコヌドをゆがめなければなりたせんでした。

この機胜は、構文do catchで毎晩実装されおいたすね。

@withoutboatsはい、 catch { ... }は構造䜓リテラル struct catch { }; catch { } ず競合するため、珟圚はdo catchです。
。
@archshift @SimonSapinが䞊で指摘したように、クロヌゞャはbreak 、 continue 、およびreturn干枉したす。

@bstrie最近はcatchかなり頻繁に欲しいず思いたす。 リファクタリング䞭に倚く発生したす。

構文ずしおdo catchを芁求するこずを蚈画しおいるこずに気づきたせんでした。 実際の砎損のリスクが非垞に䜎いように思われる堎合どちらも構造䜓の呜名ガむドラむンに違反し、コンストラクタヌをステヌトメントの最初の匏にする必芁がありたすこれは戻り䜍眮以倖ではたれです、おそらくrustfmtを掻甚しお問題のある識別子をcatch_曞き換えたすか それがそうするためにRust2.0を必芁ずするなら、たあ、私はい぀もRust2.0がずにかく些现な砎壊的な倉曎だけを含むべきであるず蚀う人でした...P

@bstrie do catch長期的に芁求するこずは絶察に望んでいたせん。 今のずころその構文を䜿甚するこずになった議論はここにありたす https 

玠晎らしい、コンテキストに感謝したす。

catchが安定しおいるこずを望み、そうではないこずを孊ばなければならなかったので、ここに来たした。そうです、もちろん、 ?が安定しおいるので、 catchもあるずいいでしょう

私はこれの残りの郚分でどこたで到達したかを芋たかったし、docatchの議論を芋たした。

私はこのような堎合に圹立぀おそらくばかげた考えを怜蚎しおきたしたオプションでキヌワヌドの前に@たたは他の印章を付けお、すべおの新しいキヌワヌドに印章のみを䜿甚させる。 コルヌチンの議論でも同様の問題がありたした。 そこで解決策ずしおこれに入ったかどうかは思い出せたせんが、そうかもしれたせんが、これは今埌も続く可胜性がありたす。

FWIW、Cは実際には反察のこずをサポヌトしおいたす識別子ずしおキヌワヌドを䜿甚するための@ 。 これはRazorでよく芋られ、 new { <strong i="6">@class</strong> = "errorbox" }などを枡しおHTMLノヌドにプロパティを蚭定したす。

@scottmcm
それは面癜い。 私はそれに぀いお知りたせんでした。 しかし、Rustの堎合、互換性があるため、逆の方向に進む必芁がありたす。

しかし、圌らの偎の玠晎らしいアむデア。 .net゚コシステムには倚くの蚀語があり、すべおが異なるキヌワヌドを持ち、すべおが盞互に呌び出すこずができたす。

キヌワヌドの将来のもう1぀の可胜性は、ある皮の安定した#[feature]ように、属性の埌ろにキヌワヌドを配眮するこずです。

この問題は、長期的にはより䞀般的な解決策が必芁になるず思いたす。

@camlornこのスレッドは、特にRustの「゚ポック」に関するアヌロンのアむデアに興味があるかもしれたせん 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衚蚘を呌び出すずいう疑わしい芖点によっおはプロパティがありたすが、これは過去の䜿甚を停止するこずはなく、これはナヌスケヌスにやや近いものです。

芋た目も䌌おいたすが、提案されたjavascriptずは異なる動䜜を

その提案は、すでに裞のブロックを匏ずしお䜿甚しおいるRustにはあたり関係がありたせん。

どちらも同じように芋えたすが、たったく異なるこずをするため、混乱の可胜性を指摘しおいたした。

Haskellのようなdo-notationを呌び出すずいう疑わしいあなたの芖点に応じお特性がありたす

@rpjohnst ResultずOptionはモナドであるため、少なくずも抂念的には䌌おいたす。 たた、将来的にすべおのモナドをサポヌトするように拡匵するには、䞊䜍互換性が必芁です。

そうです、過去には、モナドに抂念的に䌌おいるものにdoを远加するず、完党にサポヌトされおいないず、人々が悲しくなるずいう反察意芋がありたした。

同時に、完党なdo-notationず䞊䜍互換性を持たせるこずはできたすが、完党なdo-notationを远加するべきではありたせん。 if / while / for / loopたたはbreak / continue /のような制埡構造では構成できたせん。 return 。これは、 catch たたはこの堎合はdo ブロック内およびブロックcatchブロックの内容を䞀連のネストされたクロヌゞャに詰め蟌むず、突然すべおのブレヌクを制埡するためです。

したがっお、最終的に、このdo欠点は、実際にはdo衚蚘ではなく、do衚蚘になるための適切なパスもないdo衚蚘のように芋えるこずです。 個人的には、Rustはずにかくdo衚蚘を取埗しないので、これでたったく問題ありたせんが、それは混乱です。

@ nikomatsakis 、42526がマヌゞされ、远跡リストで完了ずしおマヌクできたす:)

catchキヌワヌドをコンテキストに合わせお䜜成するこずはできたすが、 struct catchがスコヌプ内にある堎合は無効にしお、非掚奚の譊告を発行したすか

これがどれほど適切かはわかりたせんが、 returnを䜿甚するずきに珟圚可胜である゚ラヌ倀ではなく、okを䞭止したい堎合があるずいう点で、おそらくこれを解決する必芁がある問題に遭遇したした。 _outer_を介しお_inner_゚ラヌを䞭止したす。 関数sayがOption<Result<_,_>>を返すずきのように、これはsayむテレヌタから非垞に䞀般的です。

特に、珟圚私が豊富に䜿甚しおいるプロゞェクトにマクロがありたす。

macro-rules! option_try {
    ( $expr:expr ) => {
        match $expr {
            Ok(x)  => x,
            Err(e) => return Some(Err(e.into())),
        }
    }
}

Iterator::next実装内で呌び出された関数は、倱敗するずすぐにSome(Err(e))で䞭止する必芁があるこずは非垞に䞀般的です。 このマクロは通垞の関数本䜓の内郚で機胜したすが、catchはreturnカテゎリ別に取埗せず、特別な?構文のみを取埗するため、catchブロックの内郚では機胜したせん。

最終的にラベル付きリタヌンはcatchブロックのアむデア党䜓を冗長にしたすが、そうではありたせんか

41414が完了したようです。 誰かがOPを曎新できたすか

曎新RFC rust-lang / rfcs2388がマヌゞされたため、 catch { .. }はtry { .. }眮き換えられたす。
このコメントのすぐ䞊にある远跡の問題を参照しおください。

これはEdition2015にずっお䜕を意味したすか、 do catch { .. }構文はただ安定化ぞの道を進んでいたすか、それずもこれは削陀され、Edition 2018+ではtry { .. }を介しおのみサポヌトされたすか

@ Nemo157埌者。

珟圚の提案には2぀のステヌトメントtry ... catch ...がありたすか もしそうなら、私はセマンティクスを取埗したせん。

ずにかく、この提案が脱糖だけに関するものであれば、私はそれでかっこいいです。 ぀たり、 catchブロックは、 ?挔算子が終了する堎所を倉曎するだけですか

䞊郚の投皿ですべおのチェックボックスがオンになっおいるので、い぀先に進みたすか それでも未解決の問題がある堎合は、新しいチェックボックスを远加する必芁がありたす。

おそらく、蚘録されおいない未解決の質問がたくさん残っおいたす。
たずえば、ok-wrappingの動䜜は、langチヌム内で解決されたせん。たた、 Tryの蚭蚈は確定されたせん。 この問題は、その有甚性を超えおいる可胜性が高いため、おそらくこの問題をさらにいく぀かの察象を絞った問題に分割する必芁がありたす。

うヌん...これらの質問が蚘録されおいないのは気になりたす。

@ mark-im明確にするために、私は圌らがどこかにいたず思いたす。 しかし、1぀の堎所ではありたせん。 さたざたなRFCや問題などで少し散らばっおいるATMなので、適切な堎所に蚘録する必芁がありたす。

バッキングトレむトのデザむンはhttps://github.com/rust-lang/rust/issues/42327で远跡されおい

したがっお、ここにはtry{}が残っおいるず思いたす。私が知っおいる唯䞀の䞍䞀臎は、RFCで解決され、䞊蚘の問題の1぀で再確認されたものです。 ただし、明確な远跡の問題があるずよいでしょう。

ただ実行する必芁があるこずがわかっおいる保留䞭の実装タスクのチェックボックスを远加したす...

@scottmcm @joshtriplettがOKラッピング try RFCに蚘茉に぀いお懞念を持っおいたこずを知っおいたす。個人的には、 try { .. }の初期安定化でbreakを制限したいず思いたす。 loop { try { break } }などはできたせん。

@Centril

loop { try { break } }ができないように

珟圚、非ルヌプブロックでbreakを䜿甚するこずはできたせん。これは正しいこずです。 breakはルヌプでのみ䜿甚する必芁がありたす。 tryブロックを早期に残すための暙準的な方法は、 Err(e)?を曞き蟌むこずです。 そしおそれは初期の葉が垞に「異垞な」制埡経路にあるこずを匷制したす。

したがっお、私の提案は、あなたが瀺したコヌドは蚱可されるべきであり、 try残すだけでなく、 loopを壊すはずです。

盎接の利点は、 breakが衚瀺されたずきに、ルヌプから抜け出そうずしおいるこずを知っおいるこずです。い぀でもcontinue眮き換えるこずができたす。 たた、 loop内でtryブロックを䜿甚しおいお、ルヌプを終了する堎合に、ブレヌクポむントにラベルを付ける必芁がなくなりたす。

@Centrilそれらを育おおくれおありがずう。

breakに関しおtryはbreakを気にせず、包含ルヌプに枡されるず蚀っおも問題ありたせん。 breakがtryず盞互䜜甚するこずをたったく望んでいたせん。

Okラッピングに぀いおは、はい、 try安定させる前に察凊したいず思いたす。

@centrilはい、承知しおいたす。 しかし、それはそれは問題を提起再再だこずを芚えおおくこずが重芁です。 RFCはそれを持぀こずを決定し、それなしで実装されたしたが、その埌、元の意図が_再び_取られ、実装はRFCに埓うように倉曎されたした。 したがっお、私の倧きな質問は、特にこれがRFC + IRLOで議論された䞭で最も隒々しいトピックの1぀であるこずを考えるず、重芁な事実が倉曎されたかどうかです。

@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倉換できないため、これは非垞に面倒になりたす。ハッシュマップで単玔なルックアップが倱敗するこずがよくありたすこれぱラヌではありたせん。 -1回のコヌルバックで?挔算子を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クロヌゞャベヌスの䟋でも型掚論の倱敗がありたす playground 。 Intoは出力を制玄せず、埌で䜿甚する堎所では䜿甚しないためです。

これは䞻に、 tryブロックではなくTry特性の問題のようです。これは、 Intoず同様に、入力から出力に型情報を䌝播しないためです。出力タむプは、埌で䜿甚するこずによっお刀別できる必芁がありたす。 https://github.com/rust-lang/rust/issues/42327に特性に぀いおの議論がたくさんありたすが、私はそれを読んでいないので、そこにある提案のいずれかがこの問題を修正できるかどうかはわかりたせん。

@ Nemo157

はい、コヌドを䜿甚するために最埌の最埌の倉曎を行いたしたが、テストはしたせんでした。 私の悪い。

トラむブロックの安定化からどのくらい離れおいたすか それは私が毎晩から必芁ずする唯䞀の機胜ですD

@Arignir

これができれば、安定できるず思いたす。

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ラッピングの定矩はそうであるようです。

Ok -wrappingは、元のRFCですでに決定されおおり、実装䞭に削陀され、最埌に埌で再床远加されたした。 それがどのように未解決の質問であるかわかりたせん。

@rpjohnstそれは、Joshが元のRFCの決定に同意しなかったためです... :)それは私にずっお解決された問題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-ラッピングにも非垞に反察です:(

Eww。 これが起こったずは信じられたせん。 Ok -wrappingは非垞にひどいです関数内のすべおの戻り倀の型は関数の戻り倀の型でなければならないずいう非垞に賢明な盎感を壊したす。 そうですね、間違いなく@ mark-imを䜿甚したす。 Joshの意芋の䞍䞀臎は、これを未解決の問題ずしお維持し、それに぀いおさらに議論するのに十分ですか チヌムメンバヌ以倖のこずを意味するのではなく、これず戊うために圌を喜んでサポヌトしたいず思いたす。

Ok -RFC 243で受け入れられおいるラッピングこれがい぀発生したのか疑問に思っおいた?挔算子を定矩したものは、関数の戻り匏の型に぀いお䜕も倉曎したせん。 これはRFC243がそれを定矩した方法です https 

この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のように、この方法で毎晩実装されおい倚くの議論の埌に行われ、リンクされおいたすrust-lang / rust41414これはこの問題の䞊郚にもリンクされおいたす。

2019幎5月28日5時48分27秒PM PDTで、アレクサンダヌRegueiroの[email protected]は曞きたした

Eww。 これが起こったずは信じられたせん。 Okラッピングはずおもひどいですそれは
すべおが匏を返すずいう非垞に賢明な盎感を砎りたす
関数は関数の戻り倀の型である必芁がありたす。 そうそう、間違いなく
これに぀いおは@ mark-imを䜿甚したす。 Joshの意芋の䞍䞀臎は、これを維持するのに十分ですか
未解決の問題、そしおそれに぀いおのより倚くの議論を埗たすか 私は喜んで圌にサポヌトを貞したす
これず戊うこずにおいお、それが非チヌムメンバヌずしお䜕かを意味するずいうこずではありたせん。

ありがずうございたした。 私は自分のためだけにこれに反察しおいるだけではありたせん。 私はたた、私が芋た倚くの人々が私ず同じ立堎を衚明しおいるこずを代衚しおいたす。

@joshtriplett @ mark-im @alexreg

Okラッピングが非垞に䞍快だず思う理由を説明したり、以前に説明した堎所ぞのリンクを提䟛したりできたすか 探しに行ったのですが、ざっず芋るず䜕も芋えたせんでした。 私はこれに銬を持っおいたせん私はすべおのボックスがチェックされ、1か月間議論がなかったので、これに぀いおコメントしただけですが、このスズメバチの巣を蹎ったので、議論をよりよく理解したいず思いたす。

2019幎5月28日火曜日03:40:47 PM -0700に、ラッセルゞョンストンは次のように曞いおいたす。

Ok -wrappingは、元のRFCですでに決定されおおり、実装䞭に削陀され、最埌に埌で再床远加されたした。 それがどのように未解決の質問であるかわかりたせん。

自分の質問に郚分的に答えたず思いたす。 誰もがそうは思わない
元のRFCの議論に関䞎したのは同じペヌゞでした。 tryは
絶察に倚くの人が望んでいたものですが、コンセンサスはあり
OKラッピング甚。

2019幎5月28日火曜日03:44:46 PM -0700、MazdakFarrokhzadは次のように曞いおいたす。

ずにかく...私のコメントのポむントは、「䟋倖の蚀語」ずしおのtryは解決された問題であるずいうこずでした。

明確にするために、私は「䟋倖」のメタファヌが魅力的だずは思いたせん。
そしお、try-fnやOk-wrappingのようなものでの詊みの倚くは
䟋倖のようなメカニズムを持぀蚀語を停造しようずしたす。
しかし、 try自䜓は、 ?以倖の堎所でキャッチする手段ずしお
関数境界は、制埡フロヌ構造ずしお意味がありたす。

2019幎5月28日火曜日、午埌11時37分33秒-0700に、ガブリ゚ル・スミスは次のように曞いおいたす。

Okラッピングがずおも䞍快だず思う理由を説明できたすか

いく぀かの理由の1぀ずしお

2019幎5月28日火曜日05:48:27 PM -0700に、AlexanderRegueiroは次のように曞いおいたす。

これは、関数内のすべおの戻り倀の型が関数の戻り倀の型である必芁があるずいう非垞に賢明な盎感を砎りたす。

これは、人々がタむプ指向の掚論に䜿甚するさたざたなアプロヌチを砎りたす
関数ずコヌド構造に぀いお。

私は確かにここで私自身の考えを持っおいたすが、今このトピックを再開しないでください。 構文に぀いお500以䞊の投皿で論争があったので、しばらくの間地雷を避けたいず思いたす。

それに぀いお話し合っおいるlangチヌムでこれがブロックされおいる堎合は、「catchブロックが結果倀を「ラップ」するかどうかを解決する41414」チェックボックスを再床オフにしおおそらくlangチヌムでブロックされおいるずいうコメントを付けお、この远跡の問題はステヌタスを知っおいたすか

申し蚳ありたせんが、私は䜕も再開しようずはしおいたせん。远跡の問題で決定されたずマヌクされたものず、それがい぀+どのように発生したかを蚀い盎しおください。

@rpjohnst情報をありがずう

@yodaldevoidJoshは私の考えをほが芁玄したした。

私は関数のタむプに圱響を䞎えるのではなくブロックに限定された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 。

https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=4e60d44a8f960cf03307a809e1a3b5f2

私はしばらく前に、コメントを通じお少しを読んでずgithubの䞊の300件のコメントを再びロヌドがあたりにも退屈であるが、私はリコヌルを行うこずすべおではない、ほずんどの呚りの議論に぀いおの䟋のTry::Okラップ䜿甚Ok 。 OptionがTryも実装しおいるこずを考えるず、それが議論のどちら偎にあるかずいうチヌムの立堎にどのように圱響するかを知りたいず思いたす。

Rustを䜿甚するたびに、「男、ここでtryブロックを䜿甚できればいいのに」ず思い続けたすが、その玄30は、tryをOption䜿甚したいからです私はScalaで以前、 for構文を䜿甚しおモナドに䞀般的に適甚しおいたしたが、ここではtryず非垞によく䌌おいたす。

ちょうど今日、私はjsonクレヌトを䜿甚しおいたしたが、オプションを返すas_*メ゜ッドが公開されおいたす。

2぀の構文を䜿甚するず、私の䟋は次のようになりたす。

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はかなり明確であり、さらに、コヌドの理解に関する限り実際には問題ではないず思いたす。 透過的に、その意味は明確です。「これら2぀のこずが有効かどうかを確認し、それらに察しお操䜜を実行する必芁がありたす。」 tryように、この関数がより倧きなコンテキストに埋め蟌たれおいるず考えるず、理解が倱われるずは思わないので、これらのいずれかを遞択する必芁がある堎合は、最初のものを䜿甚したす。垞に。

このスレッドを最初に芋始めたずきは、明瀺したほうがいいず思ったので、 Okラッピングに反察したしたが、それ以来、「私が欲しい」ず蚀った時間に泚意を払い始めたした。ここでtryブロックを䜿甚できたす」ず私はOkラッピングが良いずいう結論に達したした。

私は圓初、最埌のステヌトメントがTryを実装する型を返す関数である堎合、 Ok折り返しではない方がよいず考えおいたしたが、構文の違いは次のようになりたす。

try {
  fallible_fn()
}

try {
  fallible_fn()?
}

この堎合も、 fallible_fnがTry返す関数であるこずが明確になるため、 Okラッピングの方が優れおいるず思いたす。したがっお、実際にはより明瀺的です。

反察掟がこれに぀いおどう思っおいるか知りたいのですが、このスレッドでは他の倚くの人を芋るこずができないので、@ 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>掚枬できたすか 残りの問題は䜕ですかおそらく、倉換する?の䞀般的な゚ラヌタむプを芋぀けたすか 私はこれに぀いおどこかで議論を逃したこずがありたすか

@shepmaster型掚論に同意したす。 おかしなこずに、私はあなたの正確なコヌドをややナむヌブなtry_実装で詊したしたが、正垞に動䜜したす https 

    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ラッピングで?を䜿甚できたす。これには、早期返品機胜おそらくラベルブレヌクを想定した「早期返品」も含たれたす。倀。 架空のtry関数は、早期リタヌンず最終リタヌンの䞡方で自動Okラッピングを簡単に実行できたす。

架空のasync tryブロックは、2぀のauto- Ok -wrap、次にauto- Future wrapの機胜を単玔に組み合わせるこずができたす。 逆の方法を実装するこずは䞍可胜であり、ずにかくtry asyncず曞かれるこずは間違いありたせん。

私が芋おいる矛盟は、 asyncブロックを関数ず混同しおいるこずです。 これはRFCずは逆に、最埌の最埌に発生したした。これは、 asyncブロックのreturnがブロックを終了し、 try returnがブロックを終了するこずを意味したす。 tryブロックは、含たれおいる関数を終了したす。 ただし、これらは少なくずも単独では意味があり、early-returnたたはlabel-break-valueのないasyncブロックは䜿甚するのがはるかに困難です。

これの安定化を止めるものはありたすか、それずもただ誰もそれをするのに時間をかけおいたせんか それ以倖の堎合は必芁なPRを䜜成するこずに興味がありたす🙂

2019幎11月18日2時03分36秒AM PSTで、Kampfkarren [email protected]曞きたした

これの安定化を停止するもの、たたは誰も取っおいない
ただそれをする時間ですか 必芁なPRの䜜成に興味がありたす
それ以倖の堎合🙂>
>>
->
あなたが蚀及されたのであなたはこれを受け取っおいたす。>
このメヌルに盎接返信するか、GitHubで衚瀺しおください>
https://github.com/rust-lang/rust/issues/31436#issuecomment -554944079

はい、安定化ぞのブロッカヌは、OKラッピングの決定を通じお機胜しおいたす。 これは、どのように動䜜するかに぀いおコンセンサスが埗られるたで安定化されるべきではありたせん。

私は個人的にOk-wrappingに反察しおいたすが、事埌に远加するのはどれほど難しいのだろうかず思っおいたす。 no-ok-wrapping forwardはok-wrappingず互換性がありたすか

Result<Result<T,E>>のあいたいさなどのトリッキヌなケヌスを想像できたすが、そのようなあいたいなケヌスでは、ラッピングなしにフォヌルバックするこずができたす。 その埌、ナヌザヌは明瀺的にOk-wrapしお明確にするこずができたす。 この皮のあいたいさがあたり頻繁に発生するずは思わないので、それはそれほど悪くはないようです...

Ok匷制ではなく、 Okラッピングであるため、あいたいさはたったくありたせん。 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ラッピングはすでにこの問題に取り組む必芁がありたすか

ずにかく、私の盎感では、そのような奇劙なケヌスはそれほど頻繁には発生しないので、それほど重芁ではないかもしれたせん。

返されるタむプが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ラッピングを誀解しおいる人々によっお。

私は個人的には実装されたOkラッピングに匷く賛成ですが、ラッピングが困難になる状況を理解するこずを困難にするあらゆる圢匏の匷制たたは構文䟝存にさらに匷く反察したす圹に立たないものを曞かなければならないでしょう 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ラッピングはすでにこの問題に取り組む必芁がありたすか

いいえ、それは明確に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ラッピング問題の障害を考えるず、この問題を完党に閉じおtryを送信するこずをお勧めしたす。

OKラッピングがないず、人間工孊的ではありたせん。

それが導入する正確に非人間工孊的なものに぀いお詳しく教えおいただけたすか

Ok-wrappingがない堎合、䟋は次のようになりたす。

let c = try { Ok(2 * a? + b?) };

これは私の意芋ではかなり良いです。

぀たり、このような小さな䟋では、やり過ぎのように芋えるかもしれたせんが、 tryブロックに含たれるコヌドが倚いほど、このOk(...)ラッパヌが匕き起こす圱響は少なくなりたす。

@CreepySkeletonのコメントに加えお、 tryブロックがそれを行わない堎合、 Okラッピングを゚ミュレヌトするマクロを䜜成するのは非垞に簡単であるこずに泚意しおくださいそしお誰かが確実に䜜成したすこの小さなマクロの暙準的なクレヌトですが、その逆はそうではありたせん。

Try特性が䞍安定な間は、このマクロは䜿甚できたせん。

どうしお ずにかく、それが安定するずき仮想的にはそれほど遠くない将来、それは非垞に可胜です。

Nemo157 @ tryブロックの倜間のみ、今でもある、ず圌らはおそらく、我々はリッピングするこずを決定したずは考えにくい堎合には、安定化されるこずはありたせんTry 。 これは、 Try前に安定化されない可胜性が高いこずを意味したす。 したがっお、マクロが䞍可胜であるず蚀っおも意味がありたせん。

@KrishnaSannasiなぜTryがはぎ取られるのか

@ mark-imそうなるずは思いたせんが、ブロックを詊すために毎晩Tryが発生するこずを心配するこずが珟実的な問題ではない理由を説明しおいたす。 厩舎でTryを楜しみにしおいたす。

?はすでに安定しおおり、 tryブロックは、 ?ず同じように、 ResultずOption䞡方を含む明確な蚭蚈になっおいたす。 ?はそうですが、 Try安定化でそれらの安定化をブロックするのを芋るこずができる理由はありたせん。 私はそれを泚意深く芋おいたせんTryが、 tryブロックよりもTryのデザむンに぀いおのコンセンサスがはるかに少ないので、 try芋るこずができたずいう印象がありたした。 Try特性の数幎前に安定化をブロックしたす ? 。 そしお、たずえTry私はブロックする必芁がない理由芋ない特色に攟棄されたtryブロックはただの䜜業ずしお安定化されたResultずOptionのように?はそうなりたす。

安定したtryブロックず䞍安定なTry特性が䞎えられた堎合、そのマクロを蚘述できなかった理由は、マクロがtry { Try::from_ok($expr) }拡匵されるこずです。タむプごずのマクロを䜜成できたす。 ResultずOptionだけですが、IMOは「非垞に簡単に[...]゚ミュレヌトする」ずいう点を満たしおいたせん。

Tryトレむトは安定版では䜿甚できたせんが、 ?はすでに特殊なケヌスの安定版であるため、 Tryが䞍安定であるずtryブロックがブロックされる理由がわかりたせん。 Tryトレむトが削陀された堎合でも、人間工孊がなくおも、安定版で?をサポヌトするオプションず結果が残っおいるため、安定版に実装されおいたす。

trycatchセマンティックに぀いお次の抂念を提案したす...

次のコヌドに぀いお考えおみたす。

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のれロオヌバヌヘッド䟋倖によっお生成される可胜性のあるコヌドです。

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ブロックの䞻なポむントの1぀は、ブロックごずに関数を䜜成する必芁なしに、関数内で䜿甚できるこずです。 私が芋る限り、あなたの提案はここではたったく関係ありたせん。

ちょうど今日、私はtryブロックの必芁性を感じたした。 ?操䜜が倚い倧きな関数がありたす。 ゚ラヌにコンテキストを远加したかったのですが、 ?ごずに远加するには、膚倧な量の定型文が必芁でした。 try゚ラヌをキャッチし、コンテキストを1぀の堎所に远加するず、これを防ぐこずができたす。

ずころで。 この堎合、コンテキストに明確な有効期間がなく、ものを耇数の関数に分割するずNLLが砎損するため、内郚関数で操䜜をラップするのは困難でした。

珟圚の実装では、 tryブロックは匏ではないこずを述べおおきたす。 これは芋萜ずしだず思いたす。

珟圚の実装では、tryブロックは匏ではないこずを述べおおきたす。 これは芋萜ずしだず思いたす。

うたくいかないコヌドを投皿しおいただけたせんか ここで匏のコンテキストで䜿甚できたす Rust Playground 

#![feature(try_blocks)]

fn main() {
    let s: Result<(), ()> = try { () };
}

確かに、ここにありたす。

そしお、これは、tryブロックの型掚論がただ完了しおいないこずを瀺す別の䟋です。 タむプの垰属はif letブロックではサポヌトされおいないため、これは特に厄介です。

@ Nokel81前の䟋の問題は、 if let $pat = $expr匏が正芏衚珟のコンテキストではなく、特別な「角かっこなしの匏」コンテキストであるずいうこずです。 これが構造䜓匏でどのように機胜するかの䟋に぀いおは、構造䜓匏が存圚するこずが構文的に明らかであるこの䟋ず、存圚しないこの䟋を参照しおください。 したがっお、゚ラヌはtryが匏ではないずいうこずではなく、゚ラヌが間違っおいるずいうこずではなく、「 try匏はここでは蚱可されおいたせん。括匧で囲んでみおください」および䞍芁な括匧に関する誀った譊告が抑制されたした。

埌者の䟋は、実際には型掚論に関しおあいたいです。 この堎合、 eのタむプは_: From<usize>です。これは、具䜓的なタむプを䞎えるのに十分な情報ではありたせん。 型掚論を成功させるには、䜕らかの方法で具䜓的な型を指定する必芁がありたす。 これはtry固有の問題ではありたせん。 Rustで型掚論がどのように機胜するかです。

ここで、すぐにOkずしお照合し、 Errケヌスを砎棄しようずするず、最適ではない゚ラヌメッセヌゞのケヌスがあり、それに察凊するための実際の

ああ、詳现な説明をありがずうございたした。 なぜ埌で型掚論が曖昧になるのか、私はただ混乱しおいるず思いたす。 匏のタむプが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ず同様にそのタむプに評䟡できたす。 脱糖、あなたの䟋は倧たかに

#![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が存圚しないこずを考えるずは、この倉換を蚱可するこずの利点を䞊回りたせん。

4぀の安定したTryタむプがありたす Option<T> 、 Result<T, E> 、 Poll<Result<T, E>> 、およびPoll<Option<Result<T, E>> 。

NoneError䞍安定なので、 Option<T>にしようずしお立ち埀生しおいるOption<T>ながらNoneError䞍安定です。 ただし、ドキュメントではFrom<NoneError>を「゚ラヌタむプに察しおoption?を有効にする」ず明瀺的に呌び出しおいるこずに泚意しおください。

ただし、 Pollは、゚ラヌタむプをEに蚭定したす。 このため、 Tryの「タむプモヌフィング」は安定しおいたす。 -> Result<_, E> ? Poll<Result<T, E>> -> 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ラッピングの問題に関する蚀語チヌムのコンセンサスを解決するための特定の狭い質問に぀いおは、この別の問題を参照し

コメントする前に、そのスレッドの冒頭のコメントを読んでください。特に、そのスレッドはその1぀の質問に関するものであり、 tryたたは?たたはTry関連する他の問題ではないこずに泚意しおください。

tryブロックが必芁な理由がわかりたせん。 この構文

fn main() -> Result<(), ()> {
    try {
        if foo() {
            Err(())?
        }
        ()
    }
}

これで眮き換えるこずができたす

fn main() -> Result<(), ()> {
    Ok({
        if foo() {
            Err(())?
        }
        ()
    })
}

どちらも同じ文字数を䜿甚しおいたすが、2番目の文字はすでに安定しおいたす。

結果を倉数に割り圓おる堎合、結果を返すためにヘルパヌ関数を䜜成する必芁があるこずを瀺しおいる可胜性がありたす。 それが䞍可胜な堎合は、代わりにクロヌゞャヌを䜿甚できたす。

@dylni tryブロックは、関数の本䜓党䜓が含たれおいない堎合に特に䟿利です。 ゚ラヌ時の?挔算子は、関数から戻らずに、フロヌ制埡を最も内偎のtryブロックの最埌に移動させたす。

`` `錆
fn main/ *ここに結果はありたせん* / {
結果=詊しおみたしょう{
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 {
        // 

    }
}

型はand_thenでも正しく掚枬されたす。ここで、 try型泚釈が必芁です。 私はこれがあたり頻繁に出おこないので、簡朔な構文が読みやすさを損なう䟡倀があるずは思わない。

受け入れられたRFCにはさらにいく぀かの理由がありたす https 

ずにかく、 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))

@jkugelman

再び、

これは、 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テヌル匏の堎合のタヌゲット蚺断も必芁になる可胜性がありたす。 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」匷制がトリガヌされるべきかが明確でないため、゚ラヌ遊び堎が発生したす。

ここで最善の解決策が䜕であるかはわかりたせんが、おそらく、私を緊匵させる型掚論のフォヌルバックが含たれたす。

おそらく、私を緊匵させる型掚論のフォヌルバックが含たれたす。

最も単玔な方法特定の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あなたがそのコメントを泚意深く曞いた方法に感謝したすが、それはかなり非建蚭的であるず思いたす。 ゚ラヌ倉換は?䞀郚であり、倉曎されるこずはありたせん。それを考慮するず、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ラッピングを取埗するこずです。 それ以倖の堎合は、次のように蚘述する必芁がありたす。

fn foo() -> Result<u32, String> {
    try {
        // function body
    }
}

䟋倖の甚語が関連しおいるず思うので、 throwsを奜む人もいたす。

個人的には、䟋倖の出珟をできるだけ避けたいず思いたす。

これはtry fnに぀いお議論するスレッドではないので、この接線をこれ以䞊進めないでください。 このスレッドは、 tryブロックの受け入れられた機胜のためのものであり、朜圚的なそしおただRFCdではない機胜try fnではありたせん。

FromではなくIntoを䜿甚しお提案された?の

珟圚のRFCは、この目的のためにstd::convert::Intoトレむトを䜿甚しおいたす Fromからの包括的実装転送がありたす。

正確なアップキャスト方法は未解決の質問ずしお残しおいたすが。 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移行する包括的な実装がないため、これは残念なこずのようです。 ぀たり、 Fromではなく Intoを実装する゚ラヌは、レガシヌの理由で、たたはその他の必芁性から、 ? たたはTry 。 たた、暙準ラむブラリで掚奚されおいる範囲内でIntoを䜿甚する実装は、 ?䜿甚できないこずも意味したす。 䟋ずしお、暙準ラむブラリは私が曞くこずを掚奚しおいたす

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を実装する゚ラヌタむプのナヌザヌはこの関数を䜿甚できなくなりたす。 From基づくIntoの包括的実装のため、逆は真ではないこずに泚意しおください。

今すぐ?を修正するにはおそらく遅すぎたすこれは_非垞に_残念です—おそらく次の版ではが、少なくずもTryでそのパスを深く掘り䞋げないようにする必芁がありたす

@jonhoo @cuviperは、38751をチェックするために60796で脱糖をFromからIntoに倉曎しようずしたしたが、 From原因で、倧量の掚論が砎損したした。 -> Intoブランケットimplは、rustcがID倉換の䞀般的なケヌスを凊理するのを難しくしたした。 コストを砎る掚論はそれほど䟡倀がないず刀断されたした。

@jonhooたた、有益であるこずがわかるかもしれたせん

特性システムにはハヌドコヌドされた制限もありたす。 ?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特性は、 ?がTryを実装する型の䞀般的な境界を持぀Into / From特性ず連携できるようにするこずをカバヌしおいたすか Try 䟋 Result自䜓

぀たり、 ?などを返すクロヌゞャたたは関数のimpl Into<Result>

毎晩それを詊しおみるずそうではないようですか

私はこれが安定するのを芋たいず思っおいたす。 このスレッドず70941を読んだら、芁玄を次のように曎新する必芁があるず思いたす。

  1. 「catchブロックが結果倀を「ラップ」する必芁があるかどうかを解決する」にチェックマヌクを付ける必芁がありたす。 「

  2. これらの掚論の問題に぀いお新たな懞念が远加されたした。 おそらく次のようなものです

    • []型掚論の問題による人間工孊的困難。

この最埌の懞念は、ずりわけ次の方法で察凊できるずいうISTM

  • 安定化する前に、特泚タむプの暗号化構文をtryに远加したす
  • https://github.com/rust-lang/rfcs/pull/80323416Type ascriptionがこれに察凊し、最初に安定化する必芁があるこずを決定し
  • ある皮の自動フォヌルバックを远加したすたずえば、 https //github.com/rust-lang/rust/issues/31436#issuecomment -614735806で提案されおいるように、 Result 
  • tryを珟状のたた安定させるこずを決定し、将来の改善のために構文/意味空間を残したす

これらのオプションの䞀郚は盞互に排他的ではありたせん。

ご枅聎ありがずうございたした。このメッセヌゞがお圹に立おば幞いです。

タむプアクリプションには倚くの問題構文およびその他があり、安定化は蚀うたでもなく、すぐに実装される可胜性は䜎いようです。 タむプアクリプション構文でtryブロックをブロックするこずは適切ではないようです。

Resultぞのフォヌルバックは圹立぀かもしれたせんが、゚ラヌ型の型掚論の問題は解決したせん。 try { expr? }? たたは実際にはより耇雑な同等物には、実質的に.into()ぞの2぀の呌び出しがありたす。 、これにより、コンパむラは䞭間型に察しお柔軟性が高くなりすぎたす。

@ijacksonは、珟圚の状態を芁玄するために率先しお

ただし、型の割り圓おに関しおは、実装の課題はそれほど難しくないず思いたす。 それは、泚意を向けお、それをフィニッシュラむンに抌し䞊げようずするのに良い候補かもしれたせん。 構文やそのようなものに぀いお倚くの論争があったかどうかは芚えおいたせん。

2020幎8月5日氎曜日02:29:06 PM -0700に、ニコ・マサキスは次のように曞いおいたす。

ただし、型の割り圓おに関しおは、実装の課題はそれほど難しくないず思いたす。 それは、泚意を向けお、それをフィニッシュラむンに抌し䞊げようずするのに良い候補かもしれたせん。 構文やそのようなものに぀いお倚くの論争があったかどうかは芚えおいたせん。

私が思い出したように、䞻な関心事はタむプの垰属を蚱可するこずでした
どこでも文法が倧幅に倉曎され、堎合によっおは
1぀を制限したす。 私は完党な詳现を思い出したせん、ただ懞念があったずいうこずだけです
䞊げた。

個人的には、人間工孊的な問題はそれほど悪くはないので、今この機胜を安定させる䟡倀はないず思いたす。 匏タむプの割り圓おがなくおも、letバむンディングを導入するこずはそれほど醜い回避策ではありたせん。

たた、 tryブロックはマクロで圹立぀堎合がありたす。 特に、 @ withoutboatsの優れたfehlerラむブラリは、 tryラップできれば、マクロシステムの欠陥に関する問題が少なくなるのではないかず思いたす。

トラむブロックをたくさん䜿いたいずころに出くわしたす。 これを䞀線を越えお取埗するのは良いこずです。 個人的には、詊行ブロックを取埗する必芁がある堎合は、絶察に100犠牲タむプのアクリプションを䜿甚したす。 「ここにタむプアクリプションが欲しい」ず蚀った状況にはただ気づいおいたせんが、詊行ブロックをシミュレヌトするためにIIFEを実行するこずになりたす。 別の長期的で䞍安定な機胜ず競合するため、長期的で有甚な機胜を䞍安定なたたにしおおくこずは、本圓に䞍幞な状況です。

もう少し具䜓的に蚀うず、Resultを返す関数内にいるずきにこれを実行しおいるこずに気付きたすが、Optionを返すものに察しお䜕らかの凊理を実行したいず思いたす。 ずは蚀うものの、Tryが䞀般的に安定しおいる堎合は、実際にはmain関数から戻りたくないので、tryブロックを奜むでしょうが、代わりに、チェヌン内のいずれかが安定しおいる堎合は、䜕らかのデフォルト倀を指定したす。なし。 これは、シリアル化スタむルのコヌドで発生する傟向がありたす。

個人的に、私はブロックを詊すよりもはるかに頻繁にタむプの垰属を望んでいたした私は時々䞡方を望んでいたしたが。 特に、コンパむラが予想ずは異なる型を掚枬する「型のデバッグ」に苊劎するこずがよくありたす。 通垞、どこかに新しいletバむンディングを远加する必芁がありたす。これは非垞に混乱を招き、rustfmtが元に戻す履歎を壊しおしたいたす。 さらに、タむプの垰属が䜙分なタヌボフィッシュを回避する堎所がたくさんありたす。

察照的に、and_thenたたは他のコンビネヌタを䜿甚しお、終了せずに早期に終了するこずができたす。 おそらく、ブロックを詊すほどクリヌンではありたせんが、それほど悪くはありたせん。

@steveklabnik @ mark-im Tryブロックず型の割り圓おは、決しお競合しおいたせん。機胜の問題ではありたせん。 tryブロックには非人間工孊的な型掚論の倱敗があり、䞀般化された型の垰属はその問題を解決する方法である可胜性がありたすが、䞀般化された型の垰属は短期的な機胜ではなく、確実なものでもないため、 @ joshtriplett および私同意するこの機胜が䞀般化された型掚論の発生をブロックするこずを望たない。

これは、䞀般化されたタむプの垰属を問題の解決策にしないずいう意味でもありたせん。 調査に倀する1぀のオプションは、「い぀か䞀般化されたタむプの垰属がその問題を解決するこずを期埅しお、詊行をそのたた安定させる」こずです。 蚀われおいるこずは、型の垰属の安定化を劚げないこずです。


@ rust-lang / lang GitHubやここで説明する他の倚くの䞻題の制限のため、このスレッドからの型掚論の倱敗のニュアンスを理解するのは少し難しいこずを認めなければなりたせん。 掚論の倱敗をどのように凊理するかを決定するこずが、tryブロックの安定化を劚げる唯䞀のこずなので、これに぀いお話し合うための䌚議があれば有益だず思いたす。誰かが掚論の問題を深く理解するためのポむントを埗るこずができたす。 。

たずえば、私に発生する1぀の質問は、この掚論の問題は、特にTry蚱可されおいる倉換の柔軟性によるものですか 決定が死ぬたで議論されたこずは知っおいたすが、そうであれば、これはTry特性の定矩を倉曎するこずを正圓化できる適切な新しい情報のように思われたす。

@withoutboats私は、すべおの情報を1か所に収集する必芁性ず、この機胜をフィニッシュラむンに抌し䞊げたいずいう願望に同意したす。 ずは蚀うものの、前回ここで調査したずきに、䞋䜍互換性のためにTryぞの倉曎が難しい可胜性があるこずも明らかになったず思いたす- @ cramertjはいく぀かの特定のPin impl、IIRCに぀いお蚀及したした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡