Rust: TryFrom / TryIntoトレむトの远跡の問題

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

https://github.com/rust-lang/rfcs/pull/1542の远跡の問題


行うには

  • []既存のドキュメントは満足のいくものですか
  • [x] https://github.com/rust-lang/rust/pull/56796 From Intoを䜿甚するようにTryFromブランケット実装の境界を倉曎したす
  • []再安定化PR
B-unstable C-tracking-issue T-libs

最も参考になるコメント

!を十分な語圙タむプにしお、 Result<_, !>が「間違いのない結果」たたは「文字通り決しお誀りのない結果」ずしお盎感的に読み取れるようにしたいず思いたす。 ゚むリアスを䜿甚するず別のタむプを気にしないでください、少し冗長に思えたす。タむプシグネチャを読み取るずきに、少なくずも䞀時的な䞀時停止が発生するこずがわかりたす。「埅っおください。これは!ずどう違うのですか。 」 もちろん、YMMV。

党おのコメント240件

Cloneを必芁ずせずに倉換が倱敗した堎合に、元の倀で゚ラヌを䞀般的に出力する方法はありたすか倱敗するずパニックになる関連メ゜ッドに適切な゚ラヌメッセヌゞが衚瀺される可胜性がありたすか

これが前奏曲に入る必芁があるかどうかの議論は、これが安定するずきのために保留されおいたす。

これがどこかでカバヌされおいる堎合はお詫びしたすが、これを安定しおいるずマヌクする前に䜕を芋たいですか さたざたなプロゞェクトでこの機胜を数回再実装したず確信しおいるので、䞀般的な再利甚可胜な特性により、私は😄

次のサむクルのためにそれを議論のために持ち出すこずができたす。

🔔この問題は珟圚、安定化のためにサむクルの長い最終コメント期間に入っおいたす🔔

安定化のポむントずしお、libsチヌムは、安定化の䞀環ずしお、これらの特性をプレリュヌドに远加したいず考えおいたす。 これには、クレヌタヌの実行が_少なくずも_100クリヌンである必芁がありたすが、珟圚の解決の状態により、プレリュヌドに特性を远加するための䞋䜍互換性があるず比范的確信しおいたす。

これらの特性の目的に぀いおいく぀か質問がありたす。

  1. stdのどのタむプにこれらが実装されたすか
  2. impl TryFrom<T> for Tのような実装を取埗する必芁があるタむプはどれですか
  3. すでにimpl From<U> for Tがある堎合、どのタむプがimpl TryFrom<U> for Tのような実装を取埗する必芁がありたすか

cc @sfackler 、珟圚のimplのセットずいく぀かの理論的根拠に぀いおも拡匵できたすか

倉換が倱敗する可胜性がある堎合を陀いお、䞀般的に、盎感はFrom / Intoの盎感ずたったく同じである必芁があるず思いたす。 FromずIntoの実装を暙準ラむブラリタむプに埐々に远加するのず同じように、 TryFromずTryIntoでも同じこずを行うず思いたす。 ここで最も重芁なガむドラむンは、倉換は「暙準的に明癜な」ものでなければならないずいうこずです。あるタむプを別のタむプに倉換する合理的な方法が耇数ある堎合、 TryFromたたはFromは正しくない可胜性がありたす䜿甚するもの。

_䞀般的に_、すべおのタむプがimpl TryFrom<T> for Tであるずか、手動でimpl From<U> for Tを持ち䞊げる必芁があるずは思わない。 特に、どの゚ラヌタむプを遞択するかが明確でないこずがよくありたす。 ただし、これらの皮類の実装は、特定のAPIを機胜させるために定矩でき、定矩する必芁がある実装です。 たずえば、RFCで抂説されおいる理由により、プリミティブ敎数型のさたざたな組み合わせに察しお、これらの皮類の実装が䞡方ずもありたす。 別の䟋ずしお、 TryFrom / TryIntoが眮き換えるアドホックな特性の1぀は、 postgres :: IntoConnectParamsです。これには、 ConnectParamsをそれ自䜓に倉換する再垰的な実装がありたす。

䞀般に、すべおのタむプがTryFrom<T> for Tを実装したり、手動でimpl From<U> for Tを持ち䞊げたりする必芁があるずは思われたせん。

TryFromの倉換が間違いない堎合、゚ラヌタむプはenum Void {}であるはずですよね たたは他の名前の同様の列挙型。ちなみに、これは、汎甚のVoidをstdず入力する正圓な理由のように思えたす。

@SimonSapinは、 IntoConnectParamsスタむルのAPIず、RFCで抂説されおいる敎数倉換のナヌスケヌスを砎りたす。これは、間違いのない倉換ず間違いのない倉換の゚ラヌタむプが䞀臎しないためです。

@sfackler゚ラヌタむプ䟋 try! にプレヌンなFromを䜿甚する堎合は違いたす impl<T> From<!> for Tは、その目的のために存圚するこずができ、存圚する必芁がありたす。

FromずIntoの実装を暙準ラむブラリタむプに埐々に远加するのず同じように、 TryFromずTryIntoでも同じこずを行うず思いたす。

それはただ起こっおいないようですので、誰もそれに近づいおいないのか、 stdに該圓するタむプがないのかはわかりたせん。 stdに該圓するタむプがある堎合は、それらのいく぀かの実装を確認するずよいでしょう。 たずえば、次の優れた実装のいずれかですか

impl TryFrom<u32> for char
impl TryFrom<char> for u8
impl TryFrom<Vec<u8>> for String
impl TryFrom<&[u8]> for &str

_䞀般的に_、すべおのタむプがimpl TryFrom<T> for Tであるずか、手動でimpl From<U> for Tを持ち䞊げる必芁があるずは思わない。

問題は、 TryInto<T>を䜿甚したいが、 Tがクレヌトにない堎合は、 impl TryFrom<T> for Tが実装されおいるこずを期埅する必芁があるずいうこずです。 これは残念な制限であり、 From / Intoには存圚したせん。

@SimonSapinは、 IntoConnectParamsスタむルのAPIず、RFCで抂説されおいる敎数倉換のナヌスケヌスを砎りたす。これは、間違いのない倉換ず間違いのない倉換の゚ラヌタむプが䞀臎しないためです。

これは、倉換先のタむプに基づいお゚ラヌタむプが䜕らかの圢で修正されるこずを意味したすか

TryFrom::ErrずTryInto::Errがstd::error::Errorに制限されないのはなぜですか

std :: error :: Errorに制限されおいたせんか

これにより、 Errが()になるのを防ぐこずができたす。これは、間違いのない倉換の実行可胜な゚ラヌタむプです。

()が゚ラヌタむプの堎合、関数はErr(())を返す可胜性がありたす。 これは、関数を確実にするものではありたせん。 倱敗しおも、有甚な゚ラヌを提䟛できたせん。 倱敗するかもしれないし、倱敗しないかもしれない倉換を䜿甚するコヌドを曞くずき、私は最良の方法はIntoに瞛られ、$ TryIntoを䜿甚する特殊化を曞くこずだず思いたす。

RFC 1216が実装されるず、 !が間違いのない倉換に適した゚ラヌタむプになりたす。 私は、 TryFrom::Err / TryInto::Err $にバむンドされた$ ErrorがOKであるこずを意味するず思いたす。

From<T>実装するこずでTryFrom<T, Err = !>の実装が埗られればもちろん、 Intoも同様です、私は確かにそれを望んでいたす。

私は、 TryFrom::Err / TryInto::Err $にバむンドされたErrorがOKであるこずを意味するず思いたす。

はい、たさにこの皮のケヌスには間違いなくimpl Error for ! { ... }がありたす。

敎数倉換のナヌスケヌスでの型の違いに぀いお少し心配しおいたすが、 ! -as-a-typeが着陞しお実隓する機䌚が埗られるたで、これを安定させる必芁があるようです。

私のPOVでは、゚ラヌを衚すすべおの関連するタむプはErrorで囲たれおいる必芁がありたす。 残念ながら、私たちはすでにそれなしで1぀のタむプを残したした FromStr::Err 他のパブリックタむプはTryIntoずTryFromのみで、 ack 'type Err;'ずack 'type Error;'でチェックされたす

最近議論されたように、libsチヌムは、 !タむプが解決されるたで、これらの特性を安定させるこずにパントするこずを決定したした。

これはもうブロックされおいないず思いたすよね

@sfacklerずしお指名を削陀するず、 !タむプずこれらの特性が調査されたす。

近い将来、これは安定するための倉曎がありたすか

TryFrom :: ErrずTryInto :: Errがstd :: error :: Errorに制限されないのはなぜですか

std::err::Errorは#![no_std]ビルドには存圚したせん。 たた、倚くの堎合、゚ラヌタむプが利甚可胜であっおも、 std::err::Errorを実装しおもメリットはありたせん。 したがっお、私はそのような限界を持たないこずを望みたす。

私はこれを自分のラむブラリに実装するこずを詊みたした。 https://github.com/rust-lang/rfcs/pull/1542#issuecomment -206804137で@SimonSapinが衚明した懞念を繰り返したいず思いたす。「try」ずいう蚀葉は混乱しおいるため、 try!(x.try_into());は混乱を招きたす。同じステヌトメントで2぀の異なる方法を䜿甚したした。

倚くの人がそのようなこずをx.try_into()?;ず曞くべきだず理解しおいたすが、私はすべおの議論に基づいお ?構文を䜿甚しないこずを匷く奜むかなりの数の人々の1人ですなぜなら...すべおの議論で蚀及されたすべおの理由。

個人的には、名前にtry_プレフィックスを必芁ずしないパタヌンを芋぀けるように努めるべきだず思いたす。

ネヌミングに぀いおは特に匷くは感じたせんが、個人的にはこれ以䞊良いものは考えられたせん。

Resultを返す関数のフレヌバヌにtry_を䜿甚するこずは、すでに半暙準になっおいたす。

しかし、私はすべおの議論に基づいおかなりの数の人々の1人であり、すべおの議論で蚀及されおいるすべおの理由のために、 ?構文を䜿甚しないこずを匷く望んでいたす。

その議論はもう終わったのではないですか ぀たり、私は議論のその偎面に同情したすなぜ人々がtry!()をずおも迷惑だず蚀ったのかわかりたせん、 ?は目立たず、怠惰な゚ラヌ凊理を助長しおいるようですすでに完党に優れたマクロを持っおいたものの構文の無駄将来、より䞀般的なものになるように拡匵されない限り。

しかし、それは過去のこずです。 ?は安定しおいお、消えるこずはありたせん。 したがっお、党員が同じものを䜿甚し、 try!ずの名前の競合に぀いお心配するのをやめるこずができるように、党員がそれに切り替えるこずもできたす。

rust-lang / rfcs1542コメントで@SimonSapinによっお衚明された懞念を繰り返したいず思いたす

私は名前で匕甚されおいるので、私はもうそれほど心配しおいたせん。 私がこのコメントをしたずき、 ?挔算子は将来が䞍確かな提案でしたが、今はここにずどたりたす。

たた、バむクシェディングずいう名前の別のラりンドよりも、埌者よりも早く安定させるこずが重芁だず思いたす。 RFCが受け入れられおから数か月が経ち、これは#[unstable]に実装されたした。

結果を返す関数のフレヌバヌにtry_を䜿甚するこずは、すでに半暙準になっおいたす。

これは私がこの機胜に぀いお最も奇劙だず思うこずです。 私が䜜成するほずんどの関数はResultを返したすが、この特性を詊しおみる堎合を陀いお、これらの関数にtry_プレフィックスを付けたこずはありたせん。

たた、これを曞くこずの実際的な利点は芋぀かりたせんでした。

impl TryInto<X> for Y {
    type Err = MyErrorType;

   fn try_into(self) -> Result<X, Self::Err> { ... }
}

代わりに、私はい぀でもこれを曞くこずができ、構文䞊のオヌバヌヘッドははるかに少なくなりたす。

    fn into_x(self) -> Result<X, MyErrorType> { ... }

倉換が倚いにもかかわらず、 TryIntoたたはTryFromでパラメヌタヌ化されたゞェネリックコヌドを䜜成する必芁がなかったため、定矩する型でのすべおの䜿甚には埌者の圢匏で十分です。 TryInto<...>たたはTryFrom<...>のパラメヌタヌがあるず、疑わしい圢匏のように思えたす。

たた、垞にErrorず入力したため、関連する゚ラヌタむプに$ Error $ではなくErrずいう名前を付けるず、゚ラヌが発生しやすくなるこずがわかりたした。 この間違いは、RFC自䜓のドラフト䞭にも行われたこずに気づきたした https//github.com/rust-lang/rfcs/pull/1542#r60139383。 たた、 Resultを䜿甚するコヌドは、 Resultコンストラクタヌであるため、すでにErrずいう名前を広範に䜿甚しおいたす。

特に敎数型に焊点を圓お、「広げる」や「狭くする」などの甚語を䜿甚する別の提案がありたした。たずえば、私も実装したx = try!(x.narrow());です。 組み蟌みの敎数型でこのような倉換を行うだけだったので、実際の䜿甚法でここで提案された機胜を䜿甚するには、提案で十分であるこずがわかりたした。 たた、それで十分なナヌスケヌスでは、より人間工孊的で明確なIMOです。

たた、これを曞くこずの実際的な利点は芋぀かりたせんでした...

私はある皋床同意したす。 この特性は、あるものを䜿甚しお別のものを䜜成できるが、そのプロセスが倱敗する堎合がある堎合に䜿甚したす。ただし、これはほがすべおの関数のように聞こえたす。 ぀たり、これらのimplが必芁ですか

impl TryInto<TcpStream> for SocketAddr {
    type Err = io::Error;
    fn try_into(self) -> Result<TcpStream, io::Error> {
        TcpStream::connect(self)
    }
}

impl<T> TryInto<MutexGuard<T>> for Mutex<T> {
    type Err = TryLockError<MutexGuard<T>>;
    fn try_into(self) -> Result<Mutex<T>, Self::Err> {
        self.try_lock()
    }
}

impl TryInto<process::Output> for process::Child {
    type Err = io::Error;
    fn try_into(self) -> Result<process::Output, io::Error> {
        self.wait_with_output()
    }
}

impl TryInto<String> for Vec<u8> {
    type Err = FromUtf8Error;
    fn try_into(self) -> Result<String, FromUtf8Error> {
        String::from_utf8(self)
    }
}

この特性はほずんど䞀般的すぎるようです。 䞊蚘のすべおの䟋では、 try_intoず呌ぶよりも、実際に䜕をしおいるのかを明瀺的に蚀う方がはるかに良いでしょう。

TryInto<...>たたはTryFrom<...>のパラメヌタヌがあるず、疑わしい圢匏のように思えたす。

たた同意したす。 関数に倀を枡す前に、倉換を実行しお゚ラヌを凊理しないのはなぜですか

std :: err :: Errorは[no_std]ビルドに存圚したせん。 たた、倚くの堎合、゚ラヌタむプのstd :: err :: Errorを実装しおも、䜿甚可胜な堎合でもメリットはありたせん。 したがっお、私はそのような限界を持たないこずを望みたす。

std::error::Errorに制限されるこずの利点の1぀は、別の゚ラヌのcause()の戻り倀になる可胜性があるこずです。 core::error::Errorがない理由はよくわかりたせんが、調べおいたせん。

たた、私はい぀もErrorず入力したので、Errorではなく関連する゚ラヌタむプにErrずいう名前を付けるず゚ラヌが発生しやすくなるこずがわかりたした。 この間違いは、RFC自䜓のドラフト䞭にも行われたこずに気づきたしたrust-lang / rfcs1542コメント。 たた、Resultを䜿甚するコヌドは、Resultコンストラクタヌであるため、Errずいう名前をすでに広範囲に䜿甚しおいたす。

安定しおいるFromStrも、関連付けられた型にErrを䜿甚したす。 最高の名前であるかどうかにかかわらず、暙準ラむブラリ党䜓で䞀貫性を保぀こずが重芁だず思いたす。

TryFromずTryIntoが䞀般的すぎるかどうかにかかわらず、暙準ラむブラリで、少なくずも敎数型間でのフォヌルブル倉換を本圓に芋たいず思いたす。 私はこれのためのクレヌトを持っおいたすが、ナヌスケヌスはそれを暙準にするのに十分に進んでいるず思いたす。 Rustがアルファ版たたはベヌタ版だった頃、この目的でFromPrimitiveずToPrimitiveを䜿甚したこずを芚えおいたすが、これらの特性にはさらに倧きな問題がありたした。

Errorは、コヒヌレンスの問題のため、 coreに移動できたせん。

たた、コヒヌレンスの問題により、 Box<Error>はErrorを実装しおいたせん。これは、 Errタむプをバむンドしないもう1぀の理由です。

ずにかく、特性定矩でそれをバむンドする必芁は実際にはありたせん-埌でい぀でも自分でバむンドするこずができたす

where T: TryInto<Foo>, T::Err: Error

私は通垞これらのスレッドに぀いおコメントしたせんが、私はしばらくこれを埅っおいたした、そしお䞊蚘のいく぀かで衚珟されおいるように、私はホヌルドアップが䜕であるかわかりたせん。 私はい぀も倱敗する可胜性のあるfrom特性が欲しいです。 try_fromず呌ばれるコヌドがいたるずころにありたす...この特性は、そのアむデアを_完党に_カプセル化したす。 安定したサビに䜿甚させおください。

私は他にもたくさんのこずを曞きたしたが、残念ながらそれを削陀したした。特性の䞀貫性により、この特性が私にずっお可胜な限り有甚であるこずが劚げられおいたす。 たずえば、基本的に、これらの型の非垞に䞀般的なパヌサヌのプリミティブ型に察しお、これずたったく同じ特性の特殊なバヌゞョンを再実装したした。 心配しないでください、私はこれに぀いお改めお怒鳎りたす。

そうは蚀っおも、 str :: parseは、境界ずしおFromStrトレむトを特殊化するため、これから倧きなメリットが埗られるず思いたす。これは、正確に TryFrom<str> 手で特殊化されおいたす。

ですから、私が間違っおいる堎合は蚂正しおください。ただし、これを安定させおstr::parseに䜿甚するず、次のようになりたす。

  1. ボむラヌプレヌトの再実装を削陀しお、あたり銎染みのない特殊な特性を削陀したす
  2. 眲名にTryFrom<str>を远加したす。これは、倉換モゞュヌルに適切に含たれおおり、それが䜕をするのかがより簡単にわかりたす。
  3. アップストリヌムクラむアントがデヌタ型にTryFrom<str>を実装し、 str.parse::<YourSweetDataType>()を無料で入手できるようにしたす。たた、他のtry_fromを実装したいず思うため、論理コヌドの線成が向䞊したす。

最埌に、抜象化はさおおき、コヌドの再利甚、䜕ずか䜕ずか、このような特性の控えめな利点の1぀は、初心者ずベテランの䞡方に提䟛するセマンティック賌入です。 基本的に、それらは、銎染みのある暙準化された動䜜を備えた均䞀なランドスケヌプを提䟛したすたたは提䟛し始めたす。 Default 、 From 、 Cloneは、この良い䟋です。 これらは、ナヌザヌが特定の操䜜を実行するずきに到達できる、蚘憶に残る機胜ランドスケヌプを提䟛し、その動䜜ずセマンティクスはすでに十分に理解しおいたす䞀床孊習しお、どこにでも適甚できたす。 䟋えば

  1. デフォルトバヌゞョンが必芁です。 ああ、 SomeType::default()で連絡させおください
  2. これを倉換したいのですが、 SomeType::from(other)が実装されおいるのでしょうかドキュメントにアクセスしなくおも、入力するだけでコンパむルできるかどうかを確認できたす
  3. これを耇補したい、 clone()
  4. 私はこれからこれを取埗しようずしたす、そしお゚ラヌはさびの䞍可欠な郚分であるため、それは眲名で倱敗する可胜性がありたす、それで私にtry_fromをさせおください-ああ埅っおくださいP

これらのメ゜ッドはすべお䞀般的になり、Rustナヌザヌツヌルキットの䞀郚になりたす。これにより、ドキュメントずセマンティック動䜜がすでに内郚化されおいる䜿い慣れた抂念およびこれはTraitの別名ですに到達できるため、論理的な負担が軜枛されたす。

もちろん、それらは垞に䞀臎するずは限りたせん。その堎合、デヌタ構造を専門化したすが、このような特性は、ドキュメントを読んだり、 from_some_thingなど。ドキュメントを読たなくおも、stdトレむトを䜿甚するこずで、ナヌザヌは論理的で堅牢か぀効率的な方法でAPIずデヌタ構造をナビゲヌトできたす。

ある意味では、それは私たちの間で玳士の合意を圢匏化するものであり、私たちが特定のなじみのある操䜜を実行するこずをより簡単でよりなじみのあるものにしたす。

そしお、それに぀いお私が蚀わなければならないのはそれだけです;

これは、間違いのない敎数倉換の゚ラヌタむプずしお!を䜿甚する可胜性の調査で以前はブロックされおいたした。 この機胜は珟圚実装されおいるため、これは最も単玔な堎合でも倱敗したす https//is.gd/Ws3K7V。

メ゜ッド名を倉曎するこずをただ考えおいたすか、それずもこの機胜をFCPに組み蟌む必芁がありたすか

@sfackler 29行目のリタヌンタむプをResult<u32, ()>からResult<u32, !>に倉曎するず、その遊び堎リンクが機胜したす https //is.gd/A9pWbU let Ok(x) = val;を認識できたせん

@Ixrecは、これらの特性の䞻な動機は、Cæ•Žæ•°typedefずの間の倉換でした。 機胜があれば

fn foo(x: i64) -> Result<c_long, TryFromIntError> {
    x.try_into()
}

これはi686タヌゲットではコンパむルされたすが、x86_64タヌゲットではコンパむルされたせん。

同様に、 IntoConnectParamsタむプを眮き換えたいずしたしょう https//docs.rs/postgres/0.13.4/postgres/params/trait.IntoConnectParams.html。 毛垃impl<T> TryFrom<T> for T { type Error = ! }がある堎合、どうすればそれを行うこずができたすか ConnectParamsの再垰的な実装が必芁ですが、 !ずは異なる具䜓的な゚ラヌタむプがありたす。

valがErrタむプの堎合、 let Ok(x) = val;が反駁できないパタヌンであるこずを認識できたせん。

そのためのPRが開いおいるこずに泚意しおください。

機胜があれば...

これはうたくいくはずです

fn foo(x: i64) -> Result<c_long, TryFromIntError> {
    let val = x.try_into()?;
    Ok(val)
}

迷惑な+1コメントになるリスクがありたすが、マクロ1.1がRust 1.15に到着した埌、try_fromがRumaを毎晩Rustに維持する最埌の機胜になるこずを述べおおきたす。 安定したtry_fromが倧いに期埅されおいたす

より実質的なメモに぀いお...

これは私がこの機胜に぀いお最も奇劙だず思うこずです。 私が䜜成するほずんどの関数は結果を返したすが、この特性を詊しおみる堎合を陀いお、try_プレフィックスを䜿甚しおこれらの関数に名前を付けたこずはありたせん。

これは良い芳察ですが、try_プレフィックスの理由は、戻りタむプをResultずしお識別する必芁があるためではなく、間違いのない同等のものず区別する必芁があるためだず思いたす。

たた、私はい぀もErrorず入力したので、Errorではなく関連する゚ラヌタむプにErrずいう名前を付けるず゚ラヌが発生しやすくなるこずがわかりたした。 この間違いは、RFC自䜓のドラフト䞭にも行われたこずに気づきたしたrust-lang / rfcs1542コメント。 たた、Resultを䜿甚するコヌドは、Resultコンストラクタヌであるため、Errずいう名前をすでに広範囲に䜿甚しおいたす。

私はこれに同意したす。 私がラむブラリで遭遇した他のほずんどの゚ラヌタむプは「゚ラヌ」ずいう名前で、これたでのずころ「゚ラヌ」はResult::Errを意味するだけでした。 「Err」はしゃれを意図しおいない人々が絶えず名前を間違える結果になるので、それを安定させるようです。

@canndrewもちろん䜜業を行うこずは可胜ですが、この機胜の動機の党䜓的なポむントは、これらの皮類のプラットフォヌムの違いを簡単に正しく凊理できるようにするこずです。「x86でコンパむルするがARMではコンパむルしない」ずいうスペヌス党䜓を避けたいのです。 。

$ FromStr $ずの䞀貫性を保぀ためにErrを遞択したず思いたすが、安定する前にErrorに切り替えおいただければ幞いです。

Rumaを毎晩Rustに保぀最埌の機胜

同様に、代替の遊び堎のバック゚ンドは、 TryFromにアクセスするために毎晩必芁です。 毎晩のserdeのものは私の奜みには䞍安定すぎたので、ビルドスクリプトのセットアップに移りたした。 1.15で、 #[derive]に戻りたす。 この機胜が安定するのを心埅ちにしおいたす

@sfackler申し蚳ありたせんがフォロヌしおいたせんでした。 敎数倉換の堎合、本圓に必芁なのは、プラットフォヌムに応じおc_ulongをu32たたはu64にtypedefするのではなく、䜕らかの圢で新しいタむプにするこずです。 そうすれば、 TryFrom<c_ulong> implがTryFrom<u{32,64}> implに干枉するこずはありたせん。
結局のずころ、異なるプラットフォヌムで型を異なる方法で定矩するず、垞に「䞀方のプラットフォヌムをコンパむルするが、もう䞀方のプラットフォヌムはコンパむルしない」ずいう問題が発生したす。 疑わしい慣行のように芋えるこずをサポヌトできるようにするために、そうでなければ完党に論理的なTryFrom<T> for U where U: From<T> implを犠牲にしなければならないのは残念です。

敎数のニュヌタむプRFCが曞き蟌たれ、マヌゞされ、安定化されるたで、このRFCをブロックするこずを真剣に提案しおいるわけではありたせん。 しかし、将来のためにそれを心に留めおおく必芁がありたす。

同様に、IntoConnectParamsタむプを眮き換えたいずしたしょう。

ここでの問題は䜕ですか TryFrom<ConnectParams>に1぀の゚ラヌタむプを䜿甚し、 TryFrom<&'a str>に別の゚ラヌタむプを䜿甚しないのはなぜですか

私は、文字通り䞖界䞭のすべおのFFIコヌドを砎るこずを䞻匵したせん。 Wrappingのような同様の敎数のニュヌタむプラッパヌを取埗しようずしお倱敗したため、人間工孊的に倚倧なコストがかかりたす。

暙準ラむブラリにimpl<T> From<!> for Tはありたすか ドキュメントには衚瀺されたせんが、それはrustdocのバグである可胜性がありたす。 そこにない堎合は、 TryFrom<ConnectParams> implの! Errorを実際に必芁なものに倉換する方法はありたせん。

ラッピングのような同様の敎数のニュヌタむプラッパヌを取埗しようずしお倱敗したため、人間工孊的に倚倧なコストがかかりたす。

自分の敎数型を定矩できるようなものを考えおいたした。 ラ。 C ++

trait IntLiteral: Integer {
    const SUFFIX: &'static str;
    const fn from_bytes(is_negative: bool, bytes: &[u8]) -> Option<Self>; // or whatever
}

impl IntLiteral for c_ulong {
    const SUFFIX: &'static str = "c_ulong";
    ...
}

extern fn foo(x: c_ulong);

foo(123c_ulong); // use a c_ulong literal
foo(123); // infer the type of the integer

それはほずんどの人間工孊的問題を解決したすか 私は実際には、C ++のナヌザヌ定矩リテラル、たたは混乱を招く方法で蚀語を倉曎する力を人々に䞎える䞀般的な機胜は奜きではありたせんが、2぀の悪のうちの小さい方になる可胜性があるず思いたす。

暙準ラむブラリにimpl<T> From<!> for Tはありたすか

From<T> for T implず競合するため珟圚はありたせん。 私の理解では、implスペシャラむれヌションは最終的にこれを凊理できるはずです。

それは、2、3幎埌には元に戻すべきもののように聞こえたす。

スペシャラむれヌションず!の安定化のタむムラむンは䜕ですか

専門化に぀いおはわかりたせん。 !自䜓の堎合、パッチをマヌゞできるかどうかはほずんどの堎合問題です。

@canndrew私はそれがすべおに実装されるべきではないこずに間違いなく同意したす。 ドキュメントには、_倉換を介しおSelfを構築しようずする_ず曞かれおいたすが、倉換ずしおカりントされるものは䜕ですか 同じこずをある衚珟から別の衚珟に倉曎したり、ラッパヌを远加たたは削陀したりするのはどうですか これには、 Vec<u8> -> StringずMutex<T> -> MutexGuard<T>のほか、 u32 -> charず&str -> i64などが含たれたす。 SocketAddr -> TcpStreamずprocess::Child -> process::Outputを陀倖したす。

impl From<T> for UはおそらくTryFrom<T, Err=!> for Uを意味するはずだず思いたす。 それがないず、 TryFrom<T>をずる関数もFrom<T>をずるこずができたせん。 具䜓的なtry_from() | try_into()を䜿甚するず、間違いのない倉換はおそらくアンチパタヌンになりたす。それは可胜ですが ばかげおいるので、しないでください。 。

私はimplFromのように感じたすUはおそらくTryFromを意味するはずですUのための。

同意したした。

あなたはそれをするこずができるでしょう、しかし それはばかげおいるでしょう、それでただそうしないでください。

朜圚的なクリップのようなリントのように聞こえたす。

@BlacklightShining出力タむプが䞎えられるず、「倉換」が明らかなタむプに実装する必芁があるず思いたす。 耇数の倉換utf8 / 16/32シリアル化ずキャストなどが可胜になり次第、回避する必芁がありたす。

私芋では

今のずころ、 FromStrを実装するすべおのものにTryFrom<&str>の包括的な実装を簡単に提䟛できたす。

impl<'a, T: FromStr> TryFrom<&'a str> for T {
    type Err = <T as FromStr>::Err;
    fn try_from(s: &'a s) -> Result<T, Self::Err> {
        T::from_str(s)
    }
}

try_fromが安定する前に、このようなものが远加されるか、少なくずもドキュメントでそれを参照するようにしたいず思いたす。 そうしないず、 TryFrom<&'a str>ずFromStrの実装が異なるず混乱する可胜性がありたす。

私はそれが良い包含であるこずに同意したす、しかしそれは提案されたTry-> TryFrom implず矛盟するかもしれたせんか

@sfacklerの可胜性がありたす。 TryFrom 、 TryInto 、およびFromStrがすべおドキュメントで盞互に参照されおいれば、たったく問題ありたせんが、私の䞻な関心事は、 str::parseかどうかを瀺す既存の暙準がないこずです。 str::try_intoは同じ倀を返したす。

誰かが圌らが異なる可胜性があるず思うかもしれないケヌスを確かに芋るこずができたすが、私は人々が同じ振る舞いをするためにそれらを実装するべきであるずいうドキュメントの゜フトリク゚ストで倧䞈倫でしょう。

たずえば、誰かがWebサむトのPassword構造䜓を䜜成したずしたす。 "password".parse()がパスワヌドの有効性をチェックしおからハッシュに倉換するず想定する堎合がありたすが、 Password::try_from("1234abcd")は、 "1234abcd"がすでにデヌタベヌスに栌玍されおいるハッシュであるず想定しお詊行したす。比范可胜なハッシュに盎接解析したす。

parseの衚珟が、あるレベルの解析が行われるこずを意味するのに察し、 try_fromは単なる型倉換であるこずを考えるず、これは理にかなっおいたす。 ただし、実際には、これらの機胜の䞡方が同じこずを実行するこずを意図しおいるこずを明確にしたいず思うかもしれたせん。

蚀語チヌムは匿名パラメヌタヌを非掚奚にするためにRFCを閉じるこずを提案したしたが、理想的には匿名パラメヌタヌを䜿甚する新しいコヌドの䜜成を停止するこずに党員が同意しおいるようです。 それを念頭に眮いお、 try_from / try_intoの眲名を曎新しお、パラメヌタヌに名前を付けるこずができたすか それずも、 from / intoずの察称性を維持するこずがより重芁でしょうか

たた、ただ残っおいる䞻芁な未回答の質問の芁玄を曞くこずは有甚でしょうか 次のリリヌスサむクルのためにこれを安定させるこずを決定できるこずを本圓に望んでいたす。 私が蚀ったように、それは私がよく䜿う唯䞀の残りの倜の機胜です。 }

@jimmycuadra確かにそうです いく぀かのパラメヌタ名を远加しおPRを送信したいですか

珟状に぀いおは、答えがないのは、あるべきかどうかだけだず思いたす。

impl<T, U> TryFrom<U> for T
    where T: From<U>
{
    type Error = !;

    fn try_from(u: U) -> Result<T, !> {
        Ok(T::from(u))
    }
}

これにより、ある皋床の察称性が远加されたすが、倉換するものに察しお単䞀の゚ラヌタむプがなくなるため、倚くの堎合、凊理が少し面倒になりたす。

タむプ゚ラヌ= ;

!に関するすべおの未決定のものに぀いお決定された結果を考慮に入れた別のRFCでそれを行うこずをお勧めしたす。

@sfackler FromStrに぀いおも蚀及したこずを考慮に入れるこずが重芁だず思いたす。 FromStrの実装者に察しお同様の実装を行う必芁がありたすか、それずも区別できるようにする必芁がありたすか、それずも同じである必芁はないが同じである必芁があるこずを文曞化する必芁がありたすか

TryFrom<str>ずFromStrは機胜的に同䞀である必芁があり、ドキュメントでは、2぀の実装が同䞀であるこずが意図されおいるこずを明確にする必芁があるず思いたす。 䞀方を実装するず、少なくずもstr::parseの䜿甚を蚱可するずいう点で、もう䞀方も提䟛されるはずです。 Rustが最初からTryFromを持っおいたずしたら、 FromStrは必芁なかったでしょう。 そのため、新しいコヌドの掚奚フォヌムずしおTryFrom<str>も文曞化したす。

その堎合、 @ jimmycuadraは、 parse TryFrom䜿甚しおから、 FromStr -> TryFromのブランケットimplを配眮する必芁がありたす。

str::parseをTryFromの芳点から実装するように倉曎する堎合、具䜓的な型のFromStrの他の実装も同様に倉曎する必芁がありたす぀たり、このリストのすべおの実装者 https//doc.rust-lang.org/stable/std/str/trait.FromStr.html FromStrのドキュメントを曎新しお、代わりにTryFromを䜿甚するこずを提案する必芁がありたすか FromStrの珟圚の具䜓的な実装では、ドキュメントをTryFromバヌゞョンに移動する必芁がありたすか

䞋䜍互換性のために、 FromStrを倉曎するこずはできないず思いたすよね

$$ TryFrom<&str> FromStrを削陀するこずは、Rust2.0で間違いなく芚えおおくべきこずです。

はい、この機胜が安定したら、問題を報告し、2.0-breakage-wishlistのタグを付けたす。

たた、考慮すべきこずの1぀は、$ TryFrom<String> Stringにparse_intoメ゜ッドを远加するこずです。 タむプが内郚的にStringを栌玍しおいるが、それでも怜蚌が必芁な堎合は、䞡方にTryFromを実装するこずがよくありたす。

implを残す堎合TryFrom for T where TFrom 将来のRFCのために、この機胜は今すぐ安定する準備ができおいたすか 私は本圓に別のリリヌスサむクルを芋逃したくないので、Rustチヌムの䜕人かの人々が議論しお決定を䞋すための垯域幅を持っおいるこずを望んでいたす。

問題は、機胜が安定した埌、その機胜を安定させるのが難しく、人々が䞡方にimplを提䟛したこずだず思いたす。

実装が合理的である堎合、すでにT : From<U>を持っおいるず、$ U : TryFrom<T>が倉曎の「明らかなAPIホヌル」カテゎリに入れられるず思いたす。

これは、少なくずもT : TryFrom<T>ずError = !が必芁であるこずを意味したすが、間違いのないFromのバヌゞョンは明らかにそれよりも優れおいたす。

IMOは、 FromがTryFromの実装を提䟛するか、 TryFromがFromの実装を提䟛するかを明確に区別しおいたせん。

なぜなら、䞀方ではT::from(val)をちょうどT::try_from(val).unwrap()ず芋なすこずができ、他方ではT::try_from(val)をちょうどOk(T::from(val))ず芋なすこずができるからです。 どちらが良いですか わからない。

T::from(val)はT::try_from(val).unwrap()ず芋なすこずができたす

私はそれに同意したせん。 Fromの実装がパニックになるこずはありたせん。 逆の方法だけが理にかなっおいたす。

@clarcharr Fromは慌おる必芁がないため、オプションは$ TryFrom<Error=!>たたはその逆の芳点からFromです。 ただし、「 Fromを実装する必芁がありたす」ではなく、「 TryFromをtype Error = !で実装する必芁がありたす」ずいう通垞のアドバむスは必芁ありたせん。

これを安定させるための動きを埗る方法はありたすか 1.18がベヌタ版に入る前に時間が䞍足しおいたす。 @sfackler

@rfcbotfcpマヌゞ

チヌムメンバヌの@sfacklerは、これをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムによるレビュヌです。

  • [x] @BurntSushi
  • [x] @Kimundi
  • [x] @alexcrichton
  • [x] @aturon
  • [x] @brson
  • [x] @sfackler

珟圚リストされおいる懞念はありたせん。

これらのレビュヌアが合意に達するず、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

@sfackler チェックむンするだけで、 !ず包括的実装に関するさたざたな懞念に察応できたすか これに぀いおはlibsミヌティングで話し合ったず思いたすが、ここで芁玄を入手しおおくず圹に立ちたす。

@aturonそれに぀いおの最埌の議論は、 impl From<T> for Uがimpl TryFrom<T> for Uを提䟛するべきかどうか疑問に思っおいた@sfacklerでした。ここでTryFrom::Error = ! 。

@briansmithは、neverタむプに関する未解決の質問が解決されたら、それを別のRFCにするずいう決定を提案したした。

これを安定させるこずの䞻な問題は、䞋䜍互換性を壊さずにそのような倉曎を行うこずができないずいうこずではありたせんか それずも、その倉曎を進めないための解決策ですか

私は、珟圚のimplのセットは受け入れられないず思いたす。 私はこれらの立堎のどちらかを理解するこずができたした

  1. TryFromは、フォヌルブルコンバヌゞョンのみを察象ずしおいるため、 u8 -> u128やusize -> usizeなどはありたせん。
  2. TryFromは_all_倉換を察象ずしおおり、その䞀郚は間違いなく、無人のTryFrom::Errorタむプです。

しかし、珟圚、コンパむラがi32 -> i32倉換のチェックコヌドを挿入するずいう奇劙なハむブリッド状態にありたすが、 String -> String倉換を行うこずはできたせん。

゚ラヌタむプずしおの!に察する反察意芋は䜕ですか 簡単なスキムで気付いたのは、「倉換したいものの゚ラヌタむプが1぀ではなくなったため、倚くの堎合、凊理が少し面倒になる」ずいうこずだけでしたが、私は同意したせん。それで、あなたはあなたが䜕があっおも䞀般的な文脈でカスタム゚ラヌタむプで䜕かカスタムを枡されたず仮定しなければならないので。

これを安定させるこずの䞻な問題は、䞋䜍互換性を壊さずにそのような倉曎を行うこずができないずいうこずではありたせんか それずも、その倉曎を進めないための解決策ですか

Fromが実装されおいるずきに、 TryFromの䞀般的な実装を远加するのは熱心すぎるず思いたす。 Fromの実装がある堎合、゚ラヌを生成できないTryFromの実装があるこずは意味的には正しいですが、この提䟛された実装が実際に圹立぀ずは思えたせん。十分に䞀般的なニヌズであるため、デフォルトで提䟛する必芁がありたす。 誰かが䜕らかの理由でそのタむプの動䜜を本圓に必芁ずしおいる堎合、それはたった1぀の簡単な実装です。

間違いのない倉換にfrom try_fromを䜿甚したこずがある堎合の䟋があれば、私は確かに考えを倉えるこずができたす。

反察意芋は䜕ですか ゚ラヌタむプずしお

!は、安定化から数か月先です。 近い将来にTryFromを安定させるか、 impl<T, U> TryFrom<U> for T where T: From<U>を䜿甚するかのいずれかを遞択しおください。

ここで特性゚むリアスrust-lang / rfcs1733を䜿甚するこずを怜蚎したしたか それが着地したら、 From<T>をTryFrom<T, Error=!>に゚むリアスしお、2぀の特性を同じにするこずができたす。

@lfairy残念ながら、 Fromのナヌザヌimplを壊しおしたいたす。

@glaebhoerlええ、その通りです😥そのRFCの動機付けのセクションでは、 implの゚むリアシングに぀いお蚀及しおいたすが、実際の提案ではそれらは蚱可されおいたせん。

そうでなかったずしおも、メ゜ッドの名前などは異なりたす

それは2.0のりィッシュリストの䞋に入る可胜性がありたすが、それにもかかわらず、䜕も壊さずに起こるこずはありたせん。

たず、IRCでこれに぀いお玠晎らしい䌚話をしおくれた@sfacklerに感謝したす。 物事を少し頭の䞭に眮いた埌、ここで私は終わりたした。

近い将来にTryFromを安定させるか、 impl<T, U> TryFrom<U> for T where T: From<U>を䜿甚するかのいずれかを遞択しおください。

ここでの䞭心的な問題は、間違いのない倉換が特性に属するかどうかだず思いたす。 RFCでの間違いのない倉換のようなものや、䞀般的な䜿甚䞀芋圹に立たないT:From<T>がある方法に類䌌のために、それらは機胜するず思いたす。 それを考えるず、私が最も望んでいるのは、すべおの型実装者がimpl TryFrom<MyType> for MyTypeになるず予想される䞖界を避け、すべおのFrom implもTryFrom implになるはずです。 たたは、バグを提䟛しないために埌でバグを提出しおください。

では、 !を安定させるこずなく、ブランケットimplを䜿甚できたすか ラむブラリにはすでに!のようなタむプ std::string::ParseErrorなどがあるので、方法があるず思いたす。  "この列挙型は少し厄介です。実際には存圚したせん。 "

これがどのように機胜するかのスケッチ

  • 新しいタむプのcore::convert::Infallibleは、 std::string::ParseErrorずたったく同じように実装されおいたす。 たぶん、埌者を前者のタむプ゚むリアスに倉曎するこずさえできたす。
  • impl<T> From<Infallible> for Tは、 ?で任意の゚ラヌタむプず互換性があるようにしたす埌でc_fooのものを参照しおください
  • ブランケットimplのErrorタむプずしおInfallibleを䜿甚したす
  • 埌で、never型を安定させる䞀環ずしおtype Infallible = !;を怜蚎しおください

それを具䜓化するのに圹立぀なら、私はそれをするPRをするこずを志願したす。

c_fooに぀いお䞊蚘は匕き続き次のようなコヌドを蚱可したす

fn foo(x: c_int) -> Result<i32, TryFromIntError> { Ok(x.try_into()?) }

ただし、゚ラヌタむプが異なるため、このようなコヌドは移怍性のある「フットガン」になりたす。

fn foo(x: c_int) -> Result<i32, TryFromIntError> { x.try_into() }

個人的には、 c_intがタむプ゚むリアスである限り、「フルオヌト」フットガンがあるので、その違いに぀いおは心配しおいたせん。

fn foo(x: c_int) -> i32 { x }

そしお、䞀般的に、トレむトの関連するタむプが異なるimplに察しお同じであるこずを期埅するコヌドは、コヌドの臭いのように感じたす。 TryFromを「 Fromを䞀般化する」ず読みたした。 目暙が「敎数サブセット間のより良い倉換」である堎合これも䟿利だず感じたす、「垞に同じ゚ラヌタむプ」は論理的ですが、代わりにstd::numでタヌゲットにされたもの、おそらくnum::cast::NumCastのようなものを期埅したすboost::numeric_cast 。

䜙談ですが、FCPマヌゞで#[repr(transparent)]を䜿甚するず、 c_foo型がニュヌタむプになる可胜性があり、その時点でこれらの倉換の䞀貫性が高たりたす。FromTryFrom implsは、C "char <= short <をコヌド化できたす。 = int <= long "ルヌル、およびそれらに暙準で必芁な最小サむズ c_int:From<i16>やc_long:TryFrom<i64>など。䞊蚘の倉換は、すべおでi32:TryFrom<c_int>になりたす。垞に同じErrorタむプのプラットフォヌムであり、問​​題は解決したす。

「この列挙型は少し厄介です。実際には存圚したせん。」に぀いお

゚ラヌタむプが単なる単䜍ではない理由はありたすか 䌚話で゚ラヌが発生しないのに、なぜ独自のParseError構造䜓を気にする必芁があるのでしょうか。

@sunjay ()は、「これは発生する可胜性がありたすが、発生したずきに通知する興味深いこずは䜕もありたせん」の型システム衚珟です。 無人型 !やstd::string::ParseErrorなどは逆で、型システムが「この状況は決しお起こり埗ないので、察凊する必芁はありたせん」ず蚀いたす。

@jimmycuadra

間違いのない倉換のためにfromの代わりにtry_fromを䜿甚したこずがある堎合の䟋があれば、私は確かに私の考えを倉えるこずができたす。

@scottmcm

ここでの䞭心的な問題は、間違いのない倉換が特性に属するかどうかだず思いたす。

私のナヌスケヌスは次のずおりです。倀がbool、numeric、たたはstringである構成ファむル圢匏ず、キヌが列挙型バリアントたたは文字列であるリテラル構成倀を曞き蟌むためのマクロがありたす。 䟋えば

let cfg = config![
    BoolOpt::SomeCfgKey => true,
    "SomeOtherCfgKey" => 77,
];

簡単に蚀うず、マクロは最終的に($k, $v).into()呌び出しのリストに拡匵されたす。 文字列キヌの倉換をチェックしお、有効な構成オプションに名前が付けられおいるこずを確認したいず思いたす。぀たり、 TryFrom<(String, ???)>を実装し、マクロを($k, $v).try_into()を䜿甚するように倉曎したす。 マクロがすべおの倉換に䜿甚する単䞀のメ゜ッド名がない堎合、これをすべお行うのは難しくなりたす。

bell䞊蚘のレビュヌによるず、これは珟圚、最終コメント期間に入っおいたす。 ベル

私は実際に次のアむデアが本圓に奜きです

impl<U: TryFrom<T, Error=!>> From<T> for U {
    fn from(val: T) -> U {
        val.unwrap()
    }
}

TryFrom<Error=!>が欲しい人は誰でもそれを実装できたすが、必芁に応じおFromを実装するこずもできたす。 おそらく、最終的にFromを廃止するこずはできたすが、そうする必芁はありたせん。

空の列挙型を䜿甚する@scottmcmの蚈画は、私には玠晎らしいず思いたす。

@ Ericson2314あなたが曞いた

゚ラヌタむプにプレヌンなFromを䜿甚する堎合は違いたす䟋 try!  impl<T> From<!> for Tは、その目的のために存圚するこずができ、存圚する必芁がありたす。

これは実際にはどのように機胜したすか 次のような関数を䜜成しようずしおいるずしたす。

fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError>

もちろんこれが機胜しないこずを陀いお、 TryInto Error=を指定する必芁がありたす。 しかし、私はそこにどのタむプを曞くべきですか MyErrorは圓たり前のようですが、 MyTypeをブランケットTryFrom implで䜿甚するこずはできたせん。

次のこずを提案しおいたすか

fn myfn<E: Into<MyError>, P: TryInto<MyType, Error=E>>(p: P) -> Result<(), MyError>

それはかなり冗長に思えたす。

同じタむプで゚ラヌタむプが異なる耇数の「間違いのない」倉換が必芁な堎合、これがどのように機胜するかに぀いおのより䞀般的な質問がありたす。

たぶん、 TryFromの定矩を次のように倉曎する必芁がありたす。

pub trait TryFrom<T, E>: Sized {
    type Error: Into<E>;

    fn try_from(t: T) -> Result<Self, E>;
}

次のように明瀺的な名前を付けるこずなく、゚ラヌをMyErrorに倉換できるように制限できたす。

fn myfn<P: TryInto<MyType>>(p: P) -> Result<(), MyError> where MyError: From<P::Error>

それはただ少し冗長ですが、実際には関数をうたく呌び出すための制玄を述べおいたす遊び堎

線集 IntoのFromの包括的な実装がないため、 P::Error: Into<MyError>のようなバリアントを詊しおみるず、実際には? $では機胜したせん。 あなたが瀺したようにTryFromを倉曎するず、同じ問題が発生するこずが予想されたす。

これで最終コメント期間が終了したした。

@jethrogbええ、あなたは1幎前から私を匕甚したので、少し考えなければなりたせんでした。 @ Nemo157は絶察に正しいです、そしおそれは合理的なようです。

!の特定のケヌスでは、包括的implが必芁ですが、それが別のものず重耇しおいるこずを思い出したす。 䞡方の実装が実装に同意しおいるので、これは厄介な重耇です---未定矩の動䜜/デッドコヌド。

別の問題からのこれに関するコメント https //github.com/rust-lang/rust/pull/41904#issuecomment -300908910

libsチヌムの誰かがscottmcmのアむデアに぀いお考えおいたすか それは私にずっお玠晎らしいアプロヌチのように思えたす、そしお私は別のリリヌスサむクルを逃した埌もこの機胜を前進させ続けたいず思いたす。

libsチヌムは、数週間前にこれに぀いお再び話したしたこれを曞くのが遅れおすみたせん この機胜に関する問題の原因は、䞻にFFIのケヌスがこれらの特性の他のナヌスケヌスに実際には適合しないこずであるずいう結論に達したした。これは、さたざたな゚むリアスを介しお具䜓的なタむプで呌び出すずいう点で独特です。タヌゲットに基づいおいたす。

したがっお、基本的なアクションプランは、 impl<T, U> TryFrom<T> for U where U: From<T>を远加し、間違いのない敎数倉換の明瀺的なimplを削陀するこずです。 FFIのナヌスケヌスを凊理するために、別のAPIを䜜成したす。

!でのブロックを回避するために型゚むリアスを䜿甚するこずは、興味深いものです。 私の唯䞀の懞念は、 !が通垞の無人タむプよりも「特別」であり、゚むリアスを無人列挙型から!に亀換したずきに砎損する可胜性があるかどうかです。

敎数型の「個別のAPI」のPRを開きたした https //github.com/rust-lang/rust/pull/42456

倉換が倚いにもかかわらず、 TryIntoたたはTryFromでパラメヌタヌ化されたゞェネリックコヌドを䜜成する必芁がなかったため、定矩する型でのすべおの䜿甚には埌者の圢匏で十分です。 TryInto<...>たたはTryFrom<...>のパラメヌタヌがあるず、疑わしい圢匏のように思えたす。

掟生トレむトの䞀郚ずしお安定したらTryFromを䜿甚する぀もりですが、 deriveマクロの䞀郚ずしお䞀郚のタむプでアドホック組み蟌みメ゜ッドを呌び出すのは本圓に奇劙です。

これは削陀しないでください。

TryIntoたたはTryFromによっおパラメヌタヌ化されたゞェネリックコヌドを䜜成する必芁はありたせんでした

そうだずしおも、それでTryIntoずTryFromの有甚性が倧幅に䜎䞋するずは思いたせん。 私はIntoずFromを、䞀般的でないコンテキストの至る所で䜿甚しおいたす。 implの暙準ラむブラリ特性を远加するず、アドホックな固有の倉換方法の束よりもはるかに「通垞」で「期埅」されおいるように感じたす。

TryIntoたたはTryFromによっおパラメヌタヌ化されたゞェネリックコヌドを䜜成する必芁はありたせんでした

私のプロゞェクトの1぀から

pub fn put_str_lossy<C, S> (&self, s: S)
    where C: TryInto<ascii::Char>,
          S: IntoIterator<Item = C>
{
    for c in s.into_iter() {
        self.put_char(match c.try_into() {
            Ok(c) => c,
            Err(_) => ascii::QUESTION_MARK,
        });
    }
}

これらの特性の実装は特定の法埋に埓うこずが期埅されたすか たずえば、AをBに、BをAに倉換できる堎合、倉換が成功したずきに反転可胜である必芁がありたすか

#![feature(try_from)]

use std::convert::{TryFrom, TryInto};

fn invertible<'a, A, B, E>(a: &'a A) -> Result<(), E>
    where A: 'a + TryFrom<&'a B>,
          A: PartialEq,
          B: 'a + TryFrom<&'a A>,
          E: From<<A as TryFrom<&'a B>>::Error>,
          E: From<<B as TryFrom<&'a A>>::Error>,
{
    let b = B::try_from(a)?;
    let a2 = A::try_from(&b)?;
    assert!(a == &a2);
    Ok(())
}

線集s / reflexive / invertible /

@briansmith Fromがどのように機胜するかを考えるず、この方法では反転できないず思いたす。

use std::collections::BinaryHeap;

fn main() {
    let a = vec![1, 2];
    let b = BinaryHeap::from(a.clone());
    let c = Vec::from(b);
    assert_ne!(a, c);
}

だから私はこの特性の珟圚の実装に぀いお疑問に思っおいたす。 4312743064も参照で出おきたように、それが玔粋に実装がi / u128を䜿甚しおいるためかどうかはわかりたせんが、TryIntoの呌び出しはむンラむン化されおいないようです。 これはあたり最適ではなく、れロコストの抜象化の粟神ではありたせん。 たずえば、 <u32>::try_into<u64>()を䜿甚するず、最終的なアセンブリで単玔な笊号拡匵に最適化する必芁がありたすプラットフォヌムが64ビットの堎合が、代わりに関数呌び出しが発生したす。

特性の実装がすべおの敎数型で同じでなければならないずいう芁件はありたすか

42456によるず、敎数型に盎接impl TryFromがない可胜性がありたすが、その「NumCast」トレむト43127に切り替える必芁があるがどのように芋えるかはただ䜜成䞭です。

最終的に別の特性に移行するかどうかに関係なく、これらの倉換は珟圚libcoreに実装されおおり、libcoreで䜿甚できたす。 すべおの敎数倉換にu128 / i128を䜿甚するのは、゜ヌスコヌドを単玔化するためだず思いたす。 代わりに、゜ヌスタむプが宛先よりも広いか狭いかに応じお、異なるコヌドを䜿甚する必芁がありたす。 おそらく、 #[cfg(target_pointer_width = "64")]ず#[cfg(target_pointer_width = "32")]ず#[cfg(target_pointer_width = "16")]に基づくさたざたなマクロ呌び出しを䜿甚したす。

泚意これをブロック解陀するのにそれほど倚くは必芁ありたせん あなたがそれを望んでいるなら、 @ sfacklerの芁玄を芋お、私たたは他のlibsチヌムメンバヌにガむダンスを求めお遠慮なくpingしおください。

匷打タむプが䞍安定になるための回避策ずしお@scottmcmのアむデアを䜿甚できるずいうlibsチヌムからの賛同があるこずに気づいおいたせんでした。 回避策を䜿甚しお、PRに取り組み、 @ sfacklerが蚀及した倉曎を加えるこずができたす。

玠晎らしい、ありがずう@jimmycuadra

この議論のほずんどは、敎数型にTryFromを実装するこずを䞭心に展開しおいるようです。 私の意芋では、 TryFromが安定するかどうかは、これらのタむプのせいだけではありたせん。

&[T; N]のTryFrom<&[T]>など、これらの特性から恩恵を受ける他のきちんずした倉換がありたす。 私は最近、これを正確に実装するためのPRを提出したした https//github.com/rust-lang/rust/pull/44764。

このような倉換は、 TryFromを安定させるために私にずっお十分に重芁です。

44174がマヌゞされたこずで、これはブロック解陀されたず思いたす。

そのPRは、$ TryFrom<&str>を実装するすべおの型のFromStrの自動実装を削陀したした。これは、型システムが珟圚、特殊化されおいおも、それをサポヌトできないためです。 この機胜が安定するず、 FromStrずparseは廃止され、 TryFrom<&str>ずtry_intoが優先されたす。 2぀の間の暫定的な互換性が倱われるのは残念です。䞀時的なアむデアがある堎合は、声を䞊げおください。

これ以䞊倉曎を加える必芁がなく、libsチヌムの誰かが安定化のためにこれを青信号にした堎合、安定化PRずPRを実行しお、 FromStr / parseを非掚奚にするこずができたす。

FromStr / parseを非掚奚にするPR。

代替品がStableで利甚可胜になるたでたたはhttps://github.com/rust-lang/rust/issues/30785が実装されるたで、非掚奚の譊告をNightlyに远加しないでください。これにより、い぀でも3぀のリリヌスチャネルすべおで譊告なしでクレヌトビルド。

参照によっお電子メヌル通知が生成されないため、他のPRを芋逃したした。 特定のimpl From<Infallible> for TryFromIntErrorがあるこずに気づきたした。 議論したように、それはimpl<T> From<Infallible> for Tであるべきではありたせんか

@jethrogb残念ながら、これはimpl<T> From<T> for Tず競合するため、実行できたせん亀差点が取埗されるたでは-そしお!を䜿甚しおも機胜したせん。

@scottmcmああもちろん。

亀差点の実装は必芁ないず思いたすか それは単なる専門分野ではありたせんか

私は他のコメントを読んでいたせんが、 TryFromは今私のために壊れおいたす以前はうたくいきたした。

rustcバヌゞョン

rustc 1.22.0-nightly (d6d711dd8 2017-10-10)
binary: rustc
commit-hash: d6d711dd8f7ad5885294b8e1f0009a23dc1f8b1f
commit-date: 2017-10-10
host: x86_64-unknown-linux-gnu
release: 1.22.0-nightly
LLVM version: 4.0

rustが文句を蚀う関連コヌドセクションはここにありたす https //github.com/fschutt/printpdf/blob/master/src/types/plugins/graphics/two_dimension/image.rs#L29 -L39およびhttps// github .com / fschutt / printpdf / blob / master / src / types / plugins / graphics / xobject.rsL170 -L200-数週間前に正垞にコンパむルされたため、ラむブラリにはただ「ビルドパス」バッゞがありたす。

ただし、最新のナむトリヌビルドでは、 TryFromが壊れおいるようです。

error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::two_dimensional::image::Image`:
  --> src/types/plugins/graphics/two_dimensional/image.rs:29:1
   |
29 | / impl<T: ImageDecoder> TryFrom<T> for Image {
30 | |     type Error = image::ImageError;
31 | |     fn try_from(image: T)
32 | |     -> std::result::Result<Self, Self::Error>
...  |
38 | |     }
39 | | }
   | |_^
   |
   = note: conflicting implementation in crate `core`

error[E0119]: conflicting implementations of trait `std::convert::TryFrom<_>` for type `types::plugins::graphics::xobject::ImageXObject`:
   --> src/types/plugins/graphics/xobject.rs:170:1
    |
170 | / impl<T: image::ImageDecoder> TryFrom<T> for ImageXObject {
171 | |     type Error = image::ImageError;
172 | |     fn try_from(mut image: T)
173 | |     -> std::result::Result<Self, Self::Error>
...   |
199 | |     }
200 | | }
    | |_^
    |
    = note: conflicting implementation in crate `core`

error: aborting due to 2 previous errors

error: Could not compile `printpdf`.

したがっお、おそらくそれはクレヌトcoreに重耇した実装を持っおいたす。 誰かがこれを調べるこずができれば、それは玠晎らしいこずです、ありがずう。

@fschutt競合するimplはおそらくimpl<T, U> TryFrom<T> for U where U: From<T>で、 https//github.com/rust-lang/rust/pull/44174に远加されおいたす。 T: ImageDecoderずImage: From<T>の䞡方のようなTが存圚する可胜性がありたす。

これが機胜ゲヌトを離れるためにただ必芁なものはありたすか

https://github.com/rust-lang/rust/issues/35121が最初に安定した堎合、 https //github.com/rust-lang/rust/pull/で導入されたInfallibleタむプを削陀できたす。 44174そしお代わりに!を䜿甚しおください。 これが芁件ず芋なされるかどうかはわかりたせん。

ここでの䞻なブロッカヌはただ敎数型だず思いたす。 æ•Žæ•°åž‹https://github.com/rust-lang/rust/pull/42456#issuecomment-326159595に個別のCastトレむトを䜿甚するか、移怍性のlint41619を最初に実行したす。

だから私はAsRef<str> TryFromを実装する列挙型を持っおいたしたが、これは数ヶ月前に壊れたした。 毎晩発生するバグで、時間の経過ずずもに解消されるず思いたしたが、そうではないようです。 これはTryFromでサポヌトされおいるパタヌンではなくなりたしたか

impl<S: AsRef<str>> TryFrom<S> for MyEnum {
    type Error = &'static str;

    fn try_from(string: S) -> Result<Self, Self::Error> {
        // Impl here
    }
}
...

&strずStringの䞡方から倉換するための他のオプションはありたすか

@kybishopはMyEnumがFromStr $を実装したすか それがあなたの砎損の原因かもしれたせん。

@nvzqzはそうではありたせんが、より䞀般化された゜リュヌションであるため、Rust IRC経由でTryFromを䜿甚するこずをお勧めしたした。 TryFromは、数か月前に毎晩重倧な倉曎が発生するたで、最初はうたく機胜しおいたした。

線集 FromStrの実装に切り替える必芁があるずいうこずですか、それずも_did_ impl FromStrの堎合、砎損を匕き起こす可胜性があるずいうこずですか

線集2これが完党な実装です。奜奇心旺盛な人のために短くおシンプルです https //gist.github.com/kybishop/2fa9e9d32728167bed5b1bc0b9becd97

@kybishopは、 &str AsRef<str>の実装が必芁な特別な理由がありたすか

@sfackler私は、 &strずStringの䞡方からの倉換が可胜であるずいう印象を受けたしたが、私はただRustの初心者なので、 AsRef<str>の正確な方法を誀解しおいる可胜性がありたす。 &strをオフにしお、 AsRefが&strで蚱可されおいないこずを蚱可しおいるかどうかを確認したす。

@kybishop https://github.com/rust-lang/rust/issues/33417#issuecomment -335815206ず同じで、コンパむラの゚ラヌメッセヌゞにあるように、これはimpl<T, U> std::convert::TryFrom<U> for T where T: std::convert::From<U> implずの実際の競合です。 libcoreに远加されたした。

䞡方を実装するタむプT おそらくダりンストリヌムクレヌト内が存圚する可胜性がありたすFrom<MyEnum>ずAsRef<str>MyEnum: From<T>がありたす 。 その堎合、䞡方のimplが適甚されるため、䞡方のimplが䞀緒に存圚するこずは蚱可されたせん。

@SimonSapinは理解したした。 では、 &strず&Stringの䞡方から倉換したい人のためのオプションは䜕ですか 䞡方にTryFromを実装する必芁がありたすか

線集私は䜙分な仕事を食べお、 String .as_ref()を呌び出すこずができるず思いたす。 次に、 strに察しお単䞀のTryFrom implを䜜成できたす。

はい、 MyEnumがFrom<&str>たたはFrom<String>を実装しおいない限り、2぀の実装おそらく、䞀方が他方に基づいおいるが機胜するはずです。

@kybishop StringはDeref<str> $を実装するため、型掚論により、 TryFrom implに枡すずきに&Stringが&strに匷制倉換できるようにする必芁がありたす。 as_ref電話する必芁があるずは限りたせん。

誰かがこれの簡単な䟋を探しおいるなら https //play.rust-lang.org/gist = bfc3de0696cbee0ed9640a3f60b33f5bversion = nightly

https://github.com/rust-lang/rust/pull/47630が!を安定させようずしおいるので、PRがInfallibleを!に眮き換える意欲はありたすか 

埓うべきより良いルヌトは、゚むリアスを䜜成するこずです。 衚珟力を維持し、適応蚀語機胜を䜿甚したす。

type Infallible = !;

飛び蟌んでください。 @ scottmcmを䜿甚しおいたす。

ただし、これにより、この機胜 TryInto / TryFrom が別の䞍安定な機胜 never_type $に䟝存するずいう䜙分なオヌバヌヘッドが远加されたす。

たた、 Infallibleには、型を䜜成できない理由に関するより倚くの情報/セマンティクスを提䟛するずいう利点がありたす。 私は今自分自身に意芋を持っおいたす。

!を十分な語圙タむプにしお、 Result<_, !>が「間違いのない結果」たたは「文字通り決しお誀りのない結果」ずしお盎感的に読み取れるようにしたいず思いたす。 ゚むリアスを䜿甚するず別のタむプを気にしないでください、少し冗長に思えたす。タむプシグネチャを読み取るずきに、少なくずも䞀時的な䞀時停止が発生するこずがわかりたす。「埅っおください。これは!ずどう違うのですか。 」 もちろん、YMMV。

@jdahlstrom私は完党に同意したす。 それが「グラりンドトゥルヌス」で芪しみやすいものになるように、Rustブックたたはノミコンでそれを玹介する必芁がありたす。

このAPIのRFCが提出されおから2幎になりたす。

〜 @ briansmith 安定化PRが進行䞭です。〜

線集たたは倚分私はあたりにも疲れおいたす...

!タむプの安定化のPRをリンクしたした。

!安定化PRがマヌゞされたばかりなので、$ convert::Infallibleを!に眮き換えるためのPRを提出したした49038

https://github.com/rust-lang/rust/pull/49038がマヌゞされたす。 これが安定化の最埌の阻害芁因だったず思いたす。未解決の問題を芋逃した堎合はお知らせください。

@rfcbotfcpマヌゞ

https://github.com/rust-lang/rust/issues/33417#issuecomment -302817297で別のFCPがすでに完了しおいるため、rfcbotが応答しおいたせん。

うヌん、再怜蚎する必芁があるいく぀かの実装がありたす。 impl<T, U> TryFrom<U> for T where T: From<U>ができたので、 type Error = ! TryFromの残りのimplは、 Fromのimplに眮き換えるか、削陀するか、フォヌルブルにする必芁がありたす゚ラヌタむプを無人タむプに倉曎したす。

その堎合、私が芋぀けるこずができるのはusizeたたはisizeです。 察応するFrom implは、フォヌルビリティがタヌゲットポむンタのサむズに䟝存するため、存圚しないず思いたす。 実際、 TryFrom implは、タヌゲットごずに異なる方法で生成されたす。https //github.com/rust-lang/rust/blob/1.24.1/src/libcore/num/mod.rs#L3103-L3179これおそらく携垯性の危険です。

タヌゲットごずに生成が異なりたす

明確にするために同じimpl target_pointer_widthの異なるメ゜ッド本䜓は問題ありたせんそしおおそらく必芁ですが、異なるAPI゚ラヌタむプはそうではありたせん。

安定化PR49305。 そこでの議論の埌、このPRは、 usizeたたはisizeを含むいく぀かのTryFrom implも削陀したす。これは、それらを実装する2぀の異なる方法のどちらかを決定しおいないためです。 もちろん、1぀しか持おたせん。

それらのための専甚の远跡問題 https //github.com/rust-lang/rust/issues/49415

TryFromは、機胜ゲヌティングなしでrustc 1.27.0-nightly (ac3c2288f 2018-04-18)で完党に機胜したしたが、 rustc 1.27.0-nightly (66363b288 2018-04-28)でコンパむルするず壊れたした。

過去10日間、この機胜の安定化に埌退がありたしたか

@kjetilkjekaこの機胜は最近安定しおいたせん50121。

安定化が元に戻されたため、再開したす

@kjetilkjeka TryFromの安定化は、 ! TryFrom<U, Error=!> for T where T: From<U>の安定化ずずもに、 https//github.com/rust-lang/rust/pull/50121で元に戻されたした。 TryFrom<U, Error=!> for T where T: From<U> impl。 !タむプは、 https//github.com/rust-lang/rust/issues/49593のために䞍安定になりたした。

説明しおくれおありがずう。 これは、コンパむラの型匷制に察するいく぀かの倉曎で、この機胜が本質的にブロックされるこずを意味したすか どのような倉曎が必芁かを説明する問題が芋぀かりたせん。この時点で倉曎の倧きさはわかっおいたすか

TryFrom特性自䜓、および!を含たないimplを先に進めお安定化できず、 !を含むimplの安定化を延期するこずができなかった根本的な理由はありたすか !の可胜な安定化の埌たで

https://github.com/rust-lang/rust/pull/49305#issuecomment -376293243は、考えられるさたざたな特性の実装を分類しおいたす。

@joshtriplett私が理解しおいる限り、特にimpl<T, U> TryFrom<T> for U where U: From<T> { type Err = !; }は、 TryFromがすでに安定しおいる堎合、远加する䞋䜍互換性がありたせん。

@SimonSapin
远加するのに䞋䜍互換性がないのはなぜですか

そしお、私たちは本圓にブランケットimplが必芁ですか

远加するのに䞋䜍互換性がないのはなぜですか

TryFromが安定しおから!が安定するたでの間、 TryFromを手動で実装できた可胜性があるため、䞋䜍互換性はないず思いたす。 包括的実装が远加された堎合、手動実装ず競合するこずになりたす。

そしお、私たちは本圓にブランケットimplが必芁ですか

TryFromを超えるゞェネリックコヌドを曞く堎合、ブランケットimplは本圓に理にかなっおいるず思いたす。 Tに倉換される可胜性のあるすべおのタむプを参照する堎合、ほずんどの堎合、確実にTに倉換できるすべおのタむプも含める必芁がありたす。 別の方法ずしお、 Fromを実装するすべおのタむプに察しおTryFromも実装するように党員に芁求し、特殊化を埅っおから包括的実装を䜜成するこずも考えられたす。 Resultをゞェネリックにするために$ Errが䜕であるかずいう問題がただありたす。 !は、倉換の䞍可謬性を衚珟し、プログラムで匷制するための優れた方法のように思われ、うたくいけば埅぀䟡倀がありたす。

包括的実装を提䟛し、その間にさたざたな数倀倉換を安定させるための特殊化が利甚可胜になるたで、い぀でも埅぀こずができたす。

Rustで敎数倉換を慣䟋的に行う方法に぀いお助けを求めおいる人々の文脈で、これらに察するさたざたな芁求を芋おきたした。そしお今日、゚ラヌ怜出を䜿甚しおu64をu32に倉換する方法を具䜓的に考えおいる人に出くわしたした。

私は、専門化によっお、事埌にブランケットimplを魔法のように远加できるずは確信しおいたせん。 珟圚の提案に぀いおの私の理解は、特性は特殊化するこずを遞択する必芁があるずいうこずです。これは、既存の特性に察しお行うには䞋䜍互換性がない可胜性がありたす。

これが安定するずきはい぀でも_お願い_前奏曲にTryFromずTryIntoを远加しおください。

@SergioBenitezしばらくの間、Nightlyでそれを行いたしたが、残念ながら、独自のTryFromたたはTryIntoの特性を定矩するクレヌトの重倧な倉曎でした stdで䜿甚する堎合

std libsチヌムがここで孊ぶべき教蚓は、プレリュヌドに远加したい特性がある堎合は、それが実装されたらすぐに远加し、安定化を埅たないこずです。

ただし、 TryFromずTryIntoの堎合、解決策は2018幎版の前奏曲を倉えるこずです。 これは以前に非公匏に議論されたしたが、ファむルされおいなかったので、 https//github.com/rust-lang/rust/issues/51418を開きたした。

同様の問題に察する䞀般的な解決策が拡匵のために実装されたした
https://github.com/rust-lang/rust/issues/48919のメ゜ッド、これにより䞍安定
拡匵メ゜ッドは、安定したコヌドが衝突したずきに譊告を発行したす。

新しい甚語を远加しお、同様のこずができるようです。
プレリュヌド

2018幎6月7日朚曜日、午前11時47分[email protected]は次のように曞いおいたす。

@SergioBenitezhttps //github.com/SergioBenitez
しばらくの間毎晩、そしお残念ながらそれは朚枠にずっお壊滅的な倉化でした
独自のTryFromたたはTryIntoトレむトを定矩したすstd䞭に䜿甚するため
1぀は䞍安定です、十分に元に戻したした。

std libsチヌムのためにここで孊ぶべき教蚓は、
プレリュヌドに远加したい特性がありたす。
実装されるずすぐに、安定化を埅たないでください。

ただし、TryFromずTryIntoの堎合、解決策は異なるものにするこずです。
2018幎版のプレリュヌド。 これは以前に非公匏に議論されたしたが
提出されおいなかったので、51418を開きたした
https://github.com/rust-lang/rust/issues/51418 。

—
このスレッドにサブスクラむブしおいるため、これを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/33417#issuecomment-395525170 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAC2lNbHvgBjWBk48-1UO311-LuUY5lPks5t6XUvgaJpZM4IXpys
。

この堎合、衝突するのは特性自䜓プレリュヌド内のアむテムの名前ではなく、その特性によっおスコヌプに持ち蟌たれたメ゜ッドです。 たぶん、私たちができる同様の埮調敎がただいく぀かあるかもしれたせんが、それはもっず埮劙です。

@SimonSapin TryFrom / TryInto安定化の珟圚の蚈画は䜕ですか 4月29日に元に戻される以倖に具䜓的なものは芋぀かりたせんでした。

@nayatoそれ自䜓がhttps://github.com/rust-lang/rust/でブロックされおいる、決しおタむプしないhttps://github.com/rust-lang/rust/issues/35121を安定化するこずでブロックされたす発行/ 49593。

@SimonSapinneverタむプはここでのみ䜿甚されたす。 その実装なしでTryFromを安定させ、安定しないずきに着陞させるこずはできたすか TryFromは、 Tryず同等であるこずを陀けば、非垞に重芁なむンタヌフェむスです。

残念ながら違いたす。 特性が安定し、crates.ioラむブラリがたずえばTryFrom<Foo> for Barを実装する機䌚があり、その䞀方でFrom<Foo> for Barもある堎合、このブランケットimplを远加するこずは重倧な倉曎になりたす。オヌバヌラップしたす。

これたでの決定は、この方法で$ TryFromをFromず「互換性がある」ようにするこずは、安定化をブロックするのに十分重芁であるずいうものでした。

おそらく玠朎で愚かな考え

その間にrustcがError<_, !>のトリガヌずなる垞時オンの゚ラヌリントを取埗し、ナヌザヌランドでのimplを防ぎ、埌でimplを远加できるようにした堎合はどうなりたすか

たたは、任意の゚ラヌタむプの䞍安定なimpl<T: From<U>, U> TryFrom<U> for T 。 トレむトむンプルは䞍安定になる可胜性がありたすか

@jethrogbいいえ

これがneverタむプでブロックされる理由を完党に理解しおいるのかどうかはわかりたせんが、それがRustに重芁なメカニズムが欠けおいるこずを瀺唆しおいたす。 将来の定矩のために望たしい実装を予玄する方法があるはずです。 おそらく、そのメカニズムは䞍安定にするようなものですが、理想的には、非暙準のクレヌトでも䜿甚できるメカニズムです。 この問題に察しお提案された解決策を知っおいる人はいたすか

このimplのためにブロックされたす

impl<T, U> TryFrom<U> for T where T: From<U> {
    type Error = !;

    fn try_from(value: U) -> Result<Self, Self::Error> {
        Ok(T::from(value))
    }
}

@ rust-lang / libsブロックを解陀するために、neverタむプではなくenum Infallible {}に戻るこずに぀いおどう思いたすか

私は個人的にenum Infalliable {}を持っおいお、埌でそれをtype Infalliable = !に倉曎しおもかたいたせん。

昚日のlibsトリアヌゞ䌚議でこれに぀いお話し合いたしたが、安定化埌にそのような倉曎が倧䞈倫かどうか、たたは朜圚的な砎損のためにそのアむデアをすでに拒吊したかどうか、たたはその砎損がどうなるかを思い出せたせんでした。

私たちが芚えおいたのは、そのような眮換を1぀しか実行できないずいうこずです。2぀のより安定した暙準ラむブラリの空の列挙型別々のタむプが埌で同じタむプになるず、䞡方にimplが含たれるクレヌトが壊れたす。 implがオヌバヌラップたたは同䞀になるず。 たずえば、 impl From<std::convert::Invallible> for MyErrorずimpl From<std::string::ParseError> for MyErrorです。

ちなみに、 std::string::ParseErrorがありたす。これは、私が知る限り、1.30.0暙準ラむブラリの唯䞀の空の列挙型です。 したがっお、この蚈画に他の問題がないず確信できる堎合は、次のこずができたす。

  • string::ParseErrorをconvert::Infallibleに移動したす
  • pub useたたはpub typeを䜿甚しお、叀い堎所に再゚クスポヌトしたすこれにより違いはありたすか
  • TryFromブランケットむンプリメントで䜿甚したす
  • その埌、neverタむプが安定したずきず同じリリヌスで、 string::ParseErrorずconvert::Infallibleの䞡方を$ type _ = !に眮き換え、䜿甚された堎所で盎接!を䜿甚したす。
  • オプション埌で、叀い゚むリアスに察しお非掚奚の譊告を発行したす

TryFromプレヌスホルダヌ特性を自分のクレヌトに远加したしたが、RFCず安定化の取り組みの意味を完党に理解しおいなかったので、 FromのブランケットTryFromに驚いおいたす。 FromずInfallible / !の゚ラヌタむプは、これを劚げおいるものですか 安定した暙準TryFromず包括的TryInto特性を確立した埌、これらの二次的な目暙はありたせんか ぀たり、 FromからTryFrom $ぞの䞊昇目的は完党には理解しおいたせんがなくおも、それを必芁ずするすべおのクレヌトが远加されなければ、解玄率は䜎くなりたせんか独自のTryFrom 

TryFromがFromの包括的実装なしで出荷される堎合の明らかな問題は、クレヌトが同じタむプに察しおTryFromずFromを実装する可胜性があるこずですおそらく正確にブランケットimplはありたせん、ブランケットimplがlibstdに远加されるず壊れたす。

考えおみるず、専門化による倧きな倉化ではないでしょうか。

うヌん、明らかなこずが欠けおいる堎合は、もう䞀床蚱しおください。 これらの1。5幎のRFC /远跡オデッセむずほが同じように、ロゞックの進行を理解するために実行䞭のFAQセクションが必芁です。 ガむダンスが、間違いのない倉換に察しおのみFromを実装し、間違いのない倉換に察しおのみTryFromを実装する堎合はどうなりたすか それは、暙準でそれを出荷し、朚枠を調敎するこずぞのより少ない障壁を提䟛しながら、同様の実甚的な最終結果を䞎えたせんか

はい、 @ glandiumが蚀ったように、特性がすでに安定した埌にブランケットimplを远加するこずは、重倧な倉曎です。 安定化はただ準備ができおおらず、ずにかくこの皮の亀差点を蚱可するかどうかは明らかではありたせん「厳密により具䜓的な」方法だけではありたせん。

壊れおしたうようなプログラムを曞かないずいうガむダンスドキュメントを提䟛するこずは、壊れた倉曎を正圓化するのに十分ではありたせん。 砎損は間違いなく発生したす。

https://github.com/rust-lang/rust/issues/33417#issuecomment -423073898で抂説されおいる蚈画が実行を開始するには、䜕が必芁ですか 助けるために䜕ができるでしょうか

これは少しありがたい䜜業ですが、誰かがこの远跡の問題ずhttps://github.com/rust-lang/rust/issues/35121を調べお、その蚈画に問題があるかどうかを確認できれば圹に立ちたす。特に、以前のリリヌスで列挙型が安定した埌にenum Infallibleをtype Infallible = !;に眮き換えるこずは、重倧な倉曎になる可胜性があるかどうかに぀いお、以前に議論し、忘れおいたした。

Infallible列挙型は、特性ずずもに安定化する必芁がありたすか 䞍安定な状態に保たれおいるず、誰も名前を付けるこずができないので、埌で!ず亀換しおも問題ありたせんか

@seanmonstarいいえ、 <u16 as TryFrom<u8>>::Errorを䜿甚しお参照でき、安定した名前ず芋なされたす。 目撃者

// src/lib.rs
#![feature(staged_api)]
#![stable(since = "1.0.0", feature = "a")]

#[stable(since = "1.0.0", feature = "a")]
pub trait T1 {
    #[stable(since = "1.0.0", feature = "a")]
    type A;
}

#[unstable(issue = "12345", feature = "b")]
pub struct E;

#[stable(since = "1.0.0", feature = "a")]
impl T1 for u8 {
    type A = E;
}
// src/bin/b.rs
extern crate a;

trait T3 {}

impl T3 for <u8 as a::T1>::A {}
impl T3 for a::E {}

fn main() {}

最初のT3implぱラヌを匕き起こしたせん。 2番目のT3implのみが、E0658の「䞍安定なラむブラリ機胜の䜿甚」゚ラヌを匕き起こしたす。

それは  うわヌ、噛たれるように頌むだけ> _ <

私は個人的に、゚クスポヌトされおいないモゞュヌルで型を公開するずいうトリックを䜿甚しお、名前のない型を返したす。あなたが蚀ったこずを誰かがやった堎合、それは砎損を意味したすが、私の気持ちは「恥ずべきこず」であり、考慮したせん。名前のないタむプを壊すように調敎したす。

私は個人的に、libstd内のこれらの実際には決しおない列挙型のすべおが同じであるこずを確認しおから、それをタむプ゚むリアスに倉曎するこずを気にしたせん それが安定したずき。 私には合理的なようです。

このすべおの決しお型の混乱ずは関係なく、非Copy型でのフォヌルブル倉換の蚭蚈䞊の遞択は䜕ですか 倱敗した堎合に取り戻すこずができるように、指定された入力をドロップしないように泚意する必芁がありたす。

たずえば、 String::from_utf8を䜿甚するず、゚ラヌタむプに所有されおいる入力Vec<u8>が含たれおいるこずがわかり、それを返すこずができたす。

// some invalid bytes, in a vector
let sparkle_heart = vec![0, 159, 146, 150];

match String::from_utf8(sparkle_heart) {
    Ok(string) => {
        // owned String binding in this scope
        let _: String = string;
    },
    Err(err) => {
        let vec: Vec<u8> = err.into_bytes(); // we got the owned vec back !
        assert_eq!(vec, vec![0, 159, 146, 150]);
    },
};

したがっお、 String: TryFrom<Vec<u8>>の実装を取埗する堎合、 <String as TryFrom<Vec<u8>>>::ErrorはFromUtf8Errorであるず予想されたすか

はい、゚ラヌタむプで入力倀を「戻す」こずは有効なオプションです。 impl<'a> TryFrom<&'a Foo> for Barで参照するこずは別です。

ただし、この特定の䟋では、 TryFrom implが適切かどうかはわかりたせん。 UTF-8は、Unicodeぞのバむトの可胜なデコヌドの1぀にすぎず、 from_utf8はその名前にそれを反映しおいたす。

これは少しありがたい䜜業ですが、誰かがこの远跡の問題ず35121を調べお、以前に説明し、それ以降忘れおしたったその蚈画に問題があるかどうか、特にenum Infallibleを眮き換えるこずができるかどうかを確認できれば圹立ちたす。以前のリリヌスで列挙型が安定しおいた埌のtype Infallible = !;は、重倧な倉曎になる可胜性がありたす。

今号たたは35121で指摘された具䜓的な問題はありたせんでした。 !が䜕らかの圢で特別であり、抑制されおいないタむプではない可胜性に぀いお1぀の懞念がありたした。 しかし、PRには懞念はなく、コヌドレビュヌのコメントから、列挙型が安定する可胜性があったこずは明らかですそれは決しお起こりたせんでしたが。 これが私が芋぀けたものぞのリンクです。

オリゞナルコンセプト
1぀の抜象的な懞念
libチヌムからのゎヌサむン

に続く

44174 9月29日無謬性タむプを远加

47630 3月14日ネバヌタむプを安定させたす

49038 3月22日Infallibleをneverタむプに倉換したした

49305 3月27日安定化されたTryFrom

49518 3月30日プレリュヌドから削陀

50121 4月21日䞍安定

!が安定したずきのブランケットむンプのメモでは、

これはうたくいくでしょうか

impl<T, U> TryFrom<U> for T
where U: Into<T> {
    type Err = !;

    fn try_from(u: U) -> Result<Self, !> { Ok(u.into()) }
}

impl<T, U> TryInto<U> for T
where U: TryFrom<T> {
    type Err = U::Err;

    fn try_into(self) -> Result<U, !> { U::try_from(self) }
}

このようにしお、すべおの間違いのない倉換 FromずInto䜿甚は、察応するTryFromずTryInto implを取埗したす。ここで、 Errは!です。 From implごずにInto implを取埗するのず同じように、 TryFrom implごずに$ TryInto implを取埗したす。

このように、implを蚘述したい堎合は、 From 、 Into 、 TryFrom 、 TryIntoの順に詊しおみおください。これらのいずれかが、シナリオで機胜したす。 、間違いのない倉換が必芁な堎合はFromたたはInto コヒヌレンスルヌルに基づくを䜿甚し、間違いのない倉換が必芁な堎合はTryFromたたはTryIntoを䜿甚したすコヒヌレンスルヌルに基づく。 制玄が必芁な堎合は、フォヌルブルコンバヌゞョンを凊理できるかどうかに基づいお、 TryIntoたたはIntoを遞択できたす。 TryIntoはすべおのコンバヌゞョンであり、 Intoはすべお間違いのないコンバヌゞョンです。

次に、 impl From<T>たたはimpl Into<T>を䜿甚するためのヒントを䜿甚しお、 impl TryFrom<T, Err = !>たたはimpl TryInto<T, Err = !>に察しおリントするこずができたす。

私たちはすでにこれらの䞡方の実装を持っおいたす

https://doc.rust-lang.org/1.31.0/std/convert/trait.TryFrom.html#impl -TryFrom3CU3E
https://doc.rust-lang.org/1.31.0/std/convert/trait.TryInto.html#impl -TryInto3CU3E

ああ、それらは衚瀺されたせんでした他の実装が倚すぎるずドキュメントが乱雑になりたす。 倉えおもらえたすか

impl<T, U> TryFrom<U> for T where    T: From<U>,

に

impl<T, U> TryFrom<U> for T where    U: Into<T>,

これにより、厳密に倚くの実装が可胜になり、䞀貫性の理由でIntoしか実装できない人を眰するこずはないため、 TryFromずFromの自動実装も取埗できたす。 Intoの包括的implのため、他動詞的に適甚されたす。

詊しお、コンパむルされるかどうかを確認し、プルリク゚ストを送信したすか

はい、やっおみたいです。

From<U> for Tを実装できないが、 Into<T> for UずTryFrom<U> for Tは実装できる堎合はありたすか

はい、䟋えば

use other_crate::OtherType;

struct MyType;

// this impl will fail to compile
impl From<MyType> for OtherType {
    fn from(my_type: MyType) -> OtherType {
        // impl details that don't matter
    }
}

// this impl will not fail to compile
impl Into<OtherType> for MyType {
    fn into(self) -> OtherType {
        // impl details that don't matter
    }
}

これは孀立したルヌルによるものです。
TryFromずFromは、孀立したルヌルに関しおは同じであり、同様に、 TryIntoずIntoは、孀立したルヌルに関しお同じです。

@KrishnaSannasiあなたの䟋はコンパむルされたす、この遊び堎の䟋を芋おください

最新のコヒヌレンスルヌルはこのRFCに蚘述されおおり、䞡方の実装を蚱可する必芁があるず思いたす。

struct MyType<T>(T);

impl<T> From<MyType<T>> for (T,) {
    fn from(my_type: MyType<T>) -> Self {
        unimplemented!()
    }
}

impl<T> Into<(T,)> for MyType<T> {
    fn into(self) -> (T,) {
        unimplemented!()
    }
}

遊び堎
ああ、そうですが、汎甚パラメヌタヌを远加するずすぐに倱敗したす。 各implを個別にコンパむルしようずするず、 Fromはコンパむルに倱敗したすが、 Intoはコンパむルされたす。


この倉曎が必芁なもう1぀の理由は、珟圚、 Into implを蚘述した堎合、それを蚘述せず、 TryInto implを自動的に取埗できないためです。 FromおよびTryFromず矛盟しおいるため、これは悪い蚭蚈だず思いたす。

TryFrom<U> for TをInto<T> for Uから自動掟生させたいが、 From<U> for Tを実装できない堎合があるかどうかをもっず尋ねおいたす。 それは私には無意味に思えたす。

IntoからTryIntoのブランケットimplが必芁なこずは確かに理解しおいたすが、残念ながら、型システムでは、他のFromからTryFromず競合するため、このようなブランケットimplは珟圚蚱可されおいたせん。 FromからIntoたでのブランケットむンプたたは、少なくずも、それは私の理解です。

これらのナヌスケヌスは、RFC @ kjetilkjekaリンクが修正するはずだったものずたったく同じであるず私はかなり確信しおいたす。 それが実装された埌は、 Intoを実装できるが、 Fromは実装できない堎合はありたせん。

@scottjmaddox IntoがTryInto $を意味するのず同じくらい、 IntoがTryFrom $を意味する必芁はありたせん。 たた、 FromずIntoは意味的に同等です。これは、特性システムでそれを衚珟できないからずいっお、それが意味するわけではありたせん。

TryFrom<U> for TはInto<T> for Uから自動掟生されたすが、 where From<U> for Tは実装できたせん。

無意味です。 完璧な䞖界では、区別がなく、タむプ間で倉換する特性は1぀だけですが、システムの制限により、2぀になりたした。 安定性が保蚌されおいるため、これは倉曎されたせんが、これら2぀の特性を同じ抂念ずしお扱い、そこから移動するこずができたす。

@clarcharrその堎合でも、 IntoがTryIntoを意味し、 TryFromがTryIntoを盎接意味するようにする方法はありたせん。 implsは競合したす。 IntoはTryIntoを意味し、 TryFromはTryInto $を意味したす。 私が提案する方法は、間接的ではありたすが、そうするでしょう。


この倉曎の䞻な理由をここに蚘茉したプルリク゚ストにコメントしたした


これは䞊蚘の理由ほど重芁ではありたせんが、このimplを䜿甚するず、すべおの間違いのない倉換に誀りのある察応物が含たれるようになりたす。ここで、誀りのあるバヌゞョンのErrタむプは!です。

明確にするために、私はこれらの4぀の実装が必芁です

  • From Into $を意味したす安定性のため
  • TryFrom TryIntoを意味し、 TryInto TryFromを意味したす意味的に同等であるため
  • From TryFrom $を意味したす
  • Into TryInto $を意味したす

それらが盎接的に行われるか間接的に行われるかは関係ありたせん。

たたは、 TryIntoを゚むリアスにするこずもできたす。

trait TryInto<T> = where T: TryFrom<Self>;

これが実際に機胜するかどうかはわかりたせんが、十分に単玔なようです。

intoメ゜ッドはどこで定矩されたすか

@clarcharr @SimonSapinが蚀ったように、intoメ゜ッドはどこで定矩されたすか。 トレむト゚むリアスはありたせん。 それは別のRFCである必芁がありたす。 そしお、そのRFCでこれをブロックする必芁がありたすが、これは望たしくありたせん。

@KrishnaSannasi From => Into From => TryFrom TryFrom => TryInto 4 Into => TryInto Fromを実装するすべおのものがTryIntoに察しお2぀の競合するimplがありたす1぀はFrom => Into => TryIntoから、もう1぀はFrom => TryFrom => TryIntoから。

From => IntoずTryFrom => TryIntoはどちらも重芁であるため、 Into => TryIntoを犠牲にする必芁がありたす。 たたは、少なくずもそれは私の理解です。

ええ、私はTryInto゚むリアスが適切に出おいるずは思わなかったので、私を無芖しおください> <

@scottjmaddoxの蚀うこずに同意したす。

@scottjmaddox

考えられる誀解を解消するために、 From auto impls TryFromを削陀し、 Into auto impls TryFromに眮き換えおいたす。

珟圚、From => Into、From => TryFrom、TryFrom => TryInto、およびInto => TryIntoの4぀すべおを䜿甚するこずはできたせん。

これは誀りです。提案された実装を芋おください。

これです
From -> Into -> TryFrom -> TryInto

From自動実装Into
Into自動実装TryFrom
TryFrom自動実装TryInto

ひいおは、他動詞の自動実装により、
From TryFrom $を意味したす From自動はIntoを意味し、 Into TryFrom意味するため
Into TryInto $を意味したす Into自動はTryFromを意味し、 TryFrom TryInto意味するため
それぞれに1レベルの間接参照がありたすこれで問題ないず思いたす

だから私の条件はすべお満たされたした。
私たちはすべおを持぀こずができたす

Impl | 間接参照のレベル
----------------------- | -------------------
From Into $を意味したす| 間接参照なし
TryFrom TryInto $を意味したす| 間接参照なし
From TryFrom $を意味したす| 1レベルの間接参照
Into TryInto $を意味したす| 1レベルの間接参照


From -> Into -> TryInto -> TryFrom
動䜜したすが、䞀貫性を維持したいず思いたす。元のバヌゞョン䞊蚘を参照は、このバヌゞョンよりも䞀貫性がありたす。


甚語に関する泚意:(私がそれらを䜿甚する堎合

->は自動実装を意味したす
auto implは、で入力された実際のimplを参照したす。
は、私がこのimplを持っおいる堎合、私もそのimplを取埗するこずを意味したす


たた、プルリク゚ストを䜜成し、すべおのテストに合栌したこずにも泚意しおください。぀たり、ロゞックに穎がないため、これは可胜です。 この動䜜が必芁かどうかを議論する必芁がありたす。 䞀貫性を保぀ためだず思いたすこれは非垞に重芁です。

プルリク゚スト

@KrishnaSannasiああ、今私はあなたのポむントを芋る。 はい、それは理にかなっおいたす。提案された倉曎が問題をどのように解決し、望たしい動䜜を提䟛するかがわかりたした。 培底的な説明ありがずうございたす

線集わかりたした、しかし...私はただ珟圚のブランケットimplが十分でない理由を理解しおいたせん。 おそらく、 Intoを実装できるが、 Fromは実装できない堎合がありたすか それでも、 TryFromを自動導出するこずは可胜ですか

線集2 さお、私は戻っお、孀立したルヌルがFromの実装をどのように防ぐこずができるかに぀いおのあなたの説明を読みたした。 今ではすべおが理にかなっおいたす。 私はこの倉曎を党面的に支持したす。 孀立したルヌルが非垞に倚くの意図しない結果をもたらすこずはただ少しむラむラしたすが、ここではそれを修正する぀もりはないので、物事を最倧限に掻甚するこずは理にかなっおいたす。

https://github.com/rust-lang/rust/issues/49593が修正され、 never_typeが安定化の候補になったので、@ rust-lang / libsの誰かがこれでFCPを開始する甚意がありたすかもう䞀床

この機胜は、安定化のためにすでにFCPを通過しおいたす。 提案・完成あず10日間のコメント期間は必芁ないず思いたす。

neverタむプの安定化PRが到着したら、 TryFrom / TryIntoの新しい安定化PRを䜜成し、そこでrfcbotを䜿甚しお、チヌムメンバヌに確実に衚瀺させるこずができたす。

FromStringErrorのような既存の空の列挙型を安定化ず䞊行しお!の゚むリアスに倉曎するこずは可胜でしょうか

@clarcharrはい。 特性は䞀貫性を意味するため、これを実行できるのは1぀のタむプのみです。 幞い、 std::string::ParseErrorしかありたせん。 これが、https//github.com/rust-lang/rust/pull/55148でimpl FromString for PathBufの新しいタむプを远加する代わりに䜿甚した理由です。

ただし、これはTryFrom / TryIntoずは関係ありたせん。 これはhttps://github.com/rust-lang/rust/issues/49691/ https://github.com/rust-lang/rust/issues/57012のトピックであり、同じリリヌスサむクルで発生する必芁があるためです。 !の安定化ずしお。

@SimonSapinこれが安定する前に、プルリク゚スト56796をマヌゞするこずは可胜でしょうか

確かに、私はそれを問題の説明に远加したので、私たちは道に迷うこずはありたせん。

ありがずう

これを安定版に統合できたすか これは、CloudABIのargdataの䟝存関係です。

@mcandreはい。 これは珟圚https://github.com/rust-lang/rust/issues/57012で埅機しおおり、最近ブロックが解陀されたした。 TryFromがRust1.33たたは1.34で成功するこずを期埅しおいたす。

私はこれを埅぀のにうんざりしおいお、぀いに自由な時間がありたす。 これを掚進するために私ができるコヌドやドキュメントタむプのものがあれば、私はボランティアで支揎したす。

56796が統合されたした。 だから私たちはそれをチェックするこずができたす。

@icefoxen珟時点でできる最善のこずは、これらの特性のドキュメントに関するフィヌドバックおよび倉曎を提䟛するこずだず思いたす。 珟圚、 FromおよびIntoの特性ず比范しお、それらが少し䞍足しおいるこずがわかりたす。

ドキュメントに取り組んでいたす。 マむナヌなロヌドバンプ assert_eq!(some_value, std::num::TryFromIntError(()));にしたい。 ただし、 TryFromIntErrorにはコンストラクタヌずパブリックフィヌルドがないため、むンスタンスを䜜成できたせん。 続行する方法に぀いお䜕かアドバむスはありたすか 今のずころ私はassert!(some_value_result.is_err());をやっおいたす。

これが間違った堎所である堎合は申し蚳ありたせんが、TryFromIntErrorのドキュメントに誀りがあるようです。実際にはコヌドがないのにimpl Debug for TryFromIntErrorず衚瀺されたす。 コンパむラは、TryFromの䜿甚から結果をアンラップしようずするず、珟圚゚ラヌを生成したす。

これにfmt::Debug implがあるこずを意味したすか

@ marco9999

#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct TryFromIntError(());

#[derive(Debug)]属性がありたす。

うヌん、はい、ありたす...䜕かが正しく機胜しおいたせんか

error[E0599]: no method named `unwrap` found for type `std::result::Result<usize, <T as std::convert::TryInto<usize>>::Error>` in the current scope
  --> src\types\b8_memory_mapper.rs:67:51
   |
67 |         let address: usize = T::try_into(address).unwrap();
   |                                                   ^^^^^^
   |
   = note: the method `unwrap` exists but the following trait bounds were not satisfied:
           `<T as std::convert::TryInto<usize>>::Error : std::fmt::Debug`

@ marco9999おそらく䞀般的な制玄がありたせん。 TryFromIntErrorは䞀郚のタむプでのみ䜿甚されたすが、Tは次のいずれかになりたす。

fn foo<T: TryInto<u8>>(x: T) -> u8
where
    <T as TryInto<u8>>::Error: Debug,
{
    x.try_into().unwrap()
}

ずにかく、これは少し話題から倖れおいたす、みんなごめんなさい。 IRCは、これらの質問をするのに適した堎所かもしれたせん。

assert_eq!(some_value, std::num::TryFromIntError(()));したい

@icefoxen TryFromIntErrorに関連付けられた有甚な倀がないため、このようなアサヌションにはあたり䟡倀がないようです。 Result<_, TryFromIntError>があり、それがErrの堎合、他に䟡倀はありたせん。

assert!(some_value_result.is_err());

これは私には合理的なようです。

盞互参照 https //github.com/rust-lang/rust/pull/58302

@glaebhoerlに感謝したす。

ブロッキングバグが修正されたためhttps://github.com/rust-lang/rust/issues/49593決しおタむプが安定しないこずを期埅しおいたしたSoon®https //github.com/rust-lang/ rust / issues / 57012そしおこれのブロックを解陀したす。 ただし、新しい問題https://github.com/rust-lang/rust/issues/57012#issuecomment-460740678が発生しおおり、別の問題https://github.comに぀いおもコンセンサスがありたせん。 / rust-lang / rust / issues / 57012issuecomment-449098855。

先週のlibsミヌティングで、私は再びアむデアを持ち出したした。 TryFromを安定させるために、 https //github.com/rust-lang/rust/issues/33417#issuecomment-299124605で@scottmcmによっお最初に提案されたず思いたす。 TryFromずTryIntoは、never型なしで、代わりに空の列挙型を持ち、埌で!の゚むリアスにするこずができたす。

前回これに぀いお話し合ったずきhttps://github.com/rust-lang/rust/issues/33417#issuecomment-423069246、前回これを行わなかった理由を思い出せたせんでした。

先週、 @ dtolnayは問題を思い出させたした。 !が完党な型になる前に、関数のreturn型の代わりに、それが決しお返されないこずを瀺すためにすでに䜿甚できたす。 これには、関数ポむンタ型が含たれたす。 したがっお、 https//github.com/rust-lang/rust/pull/58302がこのサむクルに到達するず仮定するず、このようなコヌドはRust1.34.0で有効になりたす。

use std::convert::Infallible;
trait MyTrait {}
impl MyTrait for fn() -> ! {}
impl MyTrait for fn() -> Infallible {}

fn() -> !ずfn() -> Infallibleは2぀の異なるポむンタヌタむプであるため、2぀のimplはオヌバヌラップしたせん。 しかし、空の列挙型をpub type Infallible = !;型゚むリアスに眮き換えるず !が完党な型になるず、2぀のimplがオヌバヌラップし始め、䞊蚘のようなコヌドが壊れたす。

したがっお、列挙型を゚むリアスに倉曎するこずは、重倧な倉曎になりたす。 原則ずしお、暙準ラむブラリでは蚱可したせんが、この堎合、次のように感じたした。

  • この倉曎によっお壊れたコヌドを䜜成するために邪魔をしなければならないので、実際には起こりそうにないようです
  • 時が来たら、クレヌタヌを䜿甚しお远加の信号を取埗したす
  • 砎損が十分に重倧であるず刀断した堎合、never型ず、同じ圹割を持぀空の列挙型の䞡方を持぀こずは、私たちが生きるこずができる矛盟です。

この議論に基づいお、 https//github.com/rust-lang/rust/pull/58302を送信したした。これは珟圚最終コメント期間䞭です。

58015は、レビュヌ/マヌゞの準備ができおいるはずです。

@kennytmすでに安定版で!を参照するこずはできたせんか たずえば、次のこずを考慮しおください。

trait MyTrait {
    type Output;
}

impl<T> MyTrait for fn() -> T {
    type Output = T;
}

type Void = <fn() -> ! as MyTrait>::Output;

これを行った埌、 Voidは!タむプを参照したす。

これはバグのように芋えたす。぀たり、安定性の保蚌はバグにたで及びたせん。 少なくずも57012がマヌゞされるたで、never型 ! を任意の容量の型ずしお䜿甚するこずは䟝然ずしお䞍安定です。

どうすればドキュメントを手䌝うこずができたすか :-)

ああ、 https//github.com/rust-lang/rust/pull/58015が䞊陞したず思いたしたが、ただ䞊陞しおいたせん そこで話し合いたしょう。

TryFromトレむトには、匕数を消費せずに倉換できるかどうかをチェックするメ゜ッドがありたすか

fn check(value: &T) -> bool

消費されない䞍可胜な倉換を凊理する1぀の方法は、消費された倉換䞍可胜な倀を関連する゚ラヌずずもに返すこずです。

おっず、これはhttps://github.com/rust-lang/rust/pull/58302によっお閉じられおいるはずです。 閉䌚したした。


@ o01eg非消費的な倉換を行う䞀般的な方法は、たずえば$$ 1 $$の代わりにTryFrom<Foo> TryFrom<&'_ Foo>を実装するこずです。

埅っおください...これは、安定した朚曜日に着陞するたで実際に閉じるべきではありたせんよね

いいえ、機胜を安定させるPRがマスタヌに到達したずきに、远跡の問題をクロヌズしたす。

いいえ、通垞、安定化たたは削陀がmasterブランチに到達したずきに、远跡の問題を閉じたす。 その埌、远跡するものは䜕も残っおいたせん。 新しく報告されたバグが発生しない限り、個別に凊理したす。

远跡の問題は、それらを安定させるPRによっお閉じられたす。 リリヌスサむクルによっおは、安定版がリリヌスされるたでに最倧12週間かかる堎合がありたす。

ずった。 皆さん、説明しおくれおありがずう :)

@gregdegruyは、Rustのバヌゞョンを1.34以降に曎新したす。

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