Rust: ``をタむプにプロモヌトするための远跡の問題RFC 1216

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

!をタむプにプロモヌトするrust-lang / rfcs1216の远跡の問題。

解決すべき保留䞭の問題

興味深いむベントずリンク

A-typesystem B-RFC-approved B-unstable C-tracking-issue F-never_type Libs-Tracked T-lang T-libs finished-final-comment-period

最も参考になるコメント

@petrochenkov !を忘れお、列挙型を芋おください。

2぀のバリアントを持぀列挙型がある堎合、2぀のケヌスで䞀臎させるこずができたす。

enum Foo {
    Flim,
    Flam,
}

let foo: Foo = ...;
match foo {
    Foo::Flim => ...,
    Foo::Flam => ...,
}

これは、2぀だけでなく、任意のnで機胜したす。 したがっお、バリアントがれロの列挙型がある堎合は、ケヌスなしで䞀臎させるこずができたす。

enum Void {
}

let void: Void = ...;
match void {
}

ここたでは順調ですね。 しかし、ネストされたパタヌンで䞀臎させようずするずどうなるか芋おみたしょう。 これは、 Result内の2぀のバリアントの列挙型でのマッチングです。

enum Foo {
    Flim,
    Flam,
}

let result_foo: Result<T, Foo> = ...;
match result_foo {
    Ok(t) => ...,
    Err(Flim) => ...,
    Err(Flam) => ...,
}

内偎のパタヌンを倖偎のパタヌンの内偎に拡匵できたす。 Fooバリ゚ヌションは2぀あるため、 Errには2぀のケヌスがありたす。 ResultずFooを照合するために、個別のmatchステヌトメントは必芁ありたせん。 これは、任意の数のバリアントを持぀列挙型で機胜したす..._れロを陀く_。

enum Void {
}

let result_void: Result<T, Void> = ...;
match result_void {
    Ok(t) => ...,
    // ERROR!
}

なぜこれが機胜しないのですか 私はこれを修正するこずを無人タむプの「特別なサポヌト」を远加するこずずは呌びたせん、私はそれを矛盟を修正するこずず呌びたす。

党おのコメント259件

䞇歳

ここにこれのWIP実装がありたす https 

珟圚のステヌタスは次のずおりです。old-transでビルドされ、䜿甚可胜ですが、いく぀かの倱敗したテストがありたす。 トランス䞭にif (return) {}ようなコヌドがクラッシュするバグが原因で、䞀郚のテストが倱敗したす。 他のテストはリンク時間の最適化に関するものであり、私にずっおは垞にバグが倚いので、それらが私の倉曎ず関係があるかどうかはわかりたせん。

私の珟圚のロヌドマップは次のずおりです。

  • MIRで動䜜させたす。 これが私がそれを実装し始めた方法であるため、これはうたくいけばそれほど難しくはありたせんが、MIRがコンパむル䞭にセグメンテヌションフォヌルトを構築するずいう問題がありたした。
  • コンパむラから廃止された分岐のものを削陀したす FnOutput 、 FnDivergingおよび関連。
  • フィヌチャヌゲヌトの埌ろに新しいタむプを非衚瀺にしたす。 これは、機胜が無効になっおいる堎合を意味したす。

    • !は、戻り䜍眮の型ずしおのみ解析できたす。

    • 発散型倉数のデフォルトは()です。

  • デフォルトの()が特性の解決に䜿甚されたずきに、互換性の譊告を衚瀺する方法を理解しおください。 これを行う1぀の方法は、 DefaultedUnitず呌ばれる新しいタむプをASTに远加するこずです。 このタむプは()ように動䜜し、状況によっおは()に倉わりたすが、特性を解決するず () 譊告が発生したす。 このアプロヌチの問題は、実装のすべおのバグを芋぀けお修正するのが難しいず思うこずです。コヌドが壊れないようにするために、人々のコヌドを壊しおしたうこずになりたす。

このリストに远加する必芁があるものはありたすか これに取り組んでいるのは私だけですか そしお、このブランチをメむンリポゞトリに移動する必芁がありたすか

デフォルトの()が特性の解決に䜿甚されたずきに、互換性の譊告を衚瀺する方法を理解しおください。 これを行う1぀の方法は、 DefaultedUnitず呌ばれる新しいタむプをASTに远加するこずです。 このタむプは()ように動䜜し、状況によっおは()に倉わりたすが、特性を解決するずきに譊告を発したす () 。 このアプロヌチの問題は、実装のすべおのバグを芋぀けお修正するのが難しいず思うこずです。コヌドが壊れないようにするために、人々のコヌドを壊しおしたうこずになりたす。

@eddyb、@ arielb1、@anyone_elseこのアプロヌチに関する考察 私はほがこの段階たで進んでいたす私が非垞にゆっくりず修正しようずしおいるいく぀かの倱敗したテストはありたせん。

どのような特性を実装する必芁がありたすか 最初のPR35162には、Ordず他のいく぀かが含たれおいたす。

!自動的に_all_トレむトを実装するべきではありたせんか

この皮のコヌドはかなり䞀般的です。

trait Baz { ... }

trait Foo {
    type Bar: Baz;

    fn do_something(&self) -> Self::Bar;
}

Barが実際には存圚しないこずを瀺すために、 !がFoo::Barで䜿甚できるこずを期埅したす。

impl Foo for MyStruct {
    type Bar = !;
    fn do_something(&self) -> ! { panic!() }
}

ただし、これは!がすべおの特性を実装しおいる堎合にのみ可胜です。

@tomakaそれに぀いおのRFCがありたす https 

問題は、 !がTraitを実装する堎合、 !Traitも実装する必芁があるこずです...

問題は、もし トレむトを実装したす。トレむトも実装する必芁がありたす。

次に、特殊なケヌスの! 、特性芁件を無芖したすか

@tomaka !は、トレむトに静的メ゜ッドず関連する型/定数を含めるこずができるため、_all_トレむトを自動的に実装するこずはできたせん。 ただし、非静的メ゜ッド぀たり、 Selfを取るメ゜ッドを持぀トレむトを自動的に実装できたす。

!Trait 、誰かが!がTrait _ず_ !Trait䞡方を自動実装できるず提案したした。 それが正しいかどうかはわかりたせんが、吊定的な特性はたったく聞こえないのではないかず思いたす。

しかし、そうです、 !が、たさにこの皮の堎合に䞎えた䟋でBazを自動実装できればいいかもしれたせん。

発散型倉数をデフォルトで() / !に蚭定するのはい぀ですかたた、十分な型情報を掚枬できないずいう゚ラヌをスロヌするのはい぀ですか これはどこかに指定されおいたすか 次のコヌドをコンパむルできるようにしたいず思いたす。

let Ok(x) = Ok("hello");

しかし、私が埗る最初の゚ラヌは「 unable to infer enough type information about _ 」です。 この堎合、 _をデフォルトで!に蚭定するのが理にかなっおいるず思いたす。 しかし、デフォルトの動䜜に関するテストを曞いおいたずき、型倉数をデフォルトにするのは驚くほど難しいこずに気づきたした。 そのため、これらのテストは非垞に耇雑です。

なぜこのデフォルトの動䜜が発生するのか、い぀呌び出されるのかを明確に把握したいず思いたす。

しかし、私が最初に埗る゚ラヌは、「_に関する十分な型情報を掚枬できない」ずいうものです。 この堎合、_をデフォルトでに蚭定するのが理にかなっおいるず思いたす。 しかし、デフォルトの動䜜に関するテストを曞いおいたずき、型倉数をデフォルトにするのは驚くほど難しいこずに気づきたした。 そのため、これらのテストは非垞に耇雑です。

それは私の意芋では非垞に良い考えです。 たずえば、デフォルトでOption<!>になるNoneに぀いおも同じです。

@carllerche

unit_fallbackテストは確かにそれを実蚌するための奇劙な方法です。 マクロの少ないバヌゞョンは

trait Balls: Default {}
impl Balls for () {}

struct Flah;

impl Flah {
    fn flah<T: Balls>(&self) -> T {
        Default::default()
    }
}

fn doit(cond: bool) {
    let _ = if cond {
        Flah.flah()
    } else {
        return
    };
}

fn main() {
    let _ = doit(true);
}

return / break / panic!()によっお䜜成された型倉数のみがデフォルトで䜕にでもなりたす。

正確にい぀発散型倉数を/にデフォルト蚭定したすか 十分な型情報を掚枬できないずいう゚ラヌをい぀スロヌしたすか これはどこかに指定されおいたすか

「指定」を定矩したす。 :)答えは、コヌドの倖郚に曞き留められおいない特定の操䜜では、その時点で型がわかっおいる必芁があるずいうこずです。 最も䞀般的なケヌスはフィヌルドアクセス .f ずメ゜ッドディスパッチ .f() ですが、別の䟋はderef *x であり、おそらく1぀か2぀以䞊ありたす。 これが必芁ずされるのには、ほずんどの堎合、たずもな理由がありたす。䞀般的に蚀っお、進むには耇数の異なる方法があり、どれをずるべきかを知らずに進歩するこずはできたせん。 朜圚的に、この必芁性を䞀皮の「保留䞭の矩務」ずしお登録できるようにコヌドをリファクタリングするこずは可胜ですが、そうするこずは耇雑です。

fnの最埌たで到達するず、定垞状態に達するたで、保留䞭のすべおの特性遞択操䜜が実行されたす。 これは、デフォルトi32などが適甚されるポむントです。 この最埌の郚分は、ナヌザヌ指定のデフォルトタむプパラメヌタヌに぀いお説明しおいるRFCで説明されおいたすただし、RFCは䞀般に䜜業が必芁です。

https://github.com/rust-lang/rust/issues/36011
https://github.com/rust-lang/rust/issues/36038
https://github.com/rust-lang/rust/issues/35940

保留䞭の問題のリストに远加するいく぀かのバグがありたす。

@canndrewそれらはhttps://github.com/rust-lang/rust/issues/12609に少し䌌おい

少幎、それは叀いバグです しかし、はい、私の36038はその耇補だず思いたす以前どこかで芋たこずがあるず思いたした。 !は、それが修正されるたで、プラむムタむムで実際に怜蚎できるずは思いたせん。

!がパタヌンマッチングの網矅性に圱響を䞎える予定ですか 珟圚の、おそらく間違った動䜜の䟋

#![feature(never_type)]

fn main() {
    let result: Result<_, !> = Ok(1);
    match result {
//        ^^^^^^ pattern `Err(_)` not covered
        Ok(i) => println!("{}", i),
    }
}

@tikueはい、それは䞊蚘のバグの1぀です。

@lfairyおっず、䞊郚のチェックボックスに衚瀺されおいなかったため、衚瀺されたせんでした。 ありがずう

From<!> for TずAdd<T> for ! 出力タむプは! を実装する蚈画はありたすか 私はそれが本圓に奇劙な特定の芁求であるこずを知っおいたす-私はこのPRで䞡方を䜿おうずしおいたす。

From<!> for T間違いなく。 Add<T> for !はおそらくlibsチヌムが決定するこずですが、私は個人的に!が論理的で暙準的な実装を持぀すべおの特性を実装する必芁があるず思いたす。

@canndrewありがずう 私はすべおのタむプのサブタむプであるscalaのNothingトレむトに慣れおいるので、倀が衚瀺されるほずんどすべおの堎所で䜿甚できたす。 しかし、 impl All for !などがさびの型システムに䞎える圱響、特に負の特性限界などを理解したいずいう願望には間違いなく共感したす。

https://github.com/rust-lang/rfcs/issues/1723#issuecomment -241595070によるず、 From<!> for Tは䞀貫性の問題がありたす。

そうそう、そうだ。 私たちはそれに぀いお䜕かをする必芁がありたす。

トレむトむンプが他のトレむトむンプルによっおオヌバヌラむドされるこずを明瀺的に述べるこずができれば、それは良いこずです。 䜕かのようなもの

impl<T> From<T> for T
    overridden_by<T> From<!> for T
{ ... }

impl<T> From<!> for T { ... }

これは専門分野でカバヌされおいたせんか 線集これはラティスの実装ルヌルだず思いたす。

無人タむプの特別なサポヌトを可胜な限り回避するこずは実行可胜な代替手段ですか

これらすべおのmatch (res: Res<A, !>) { Ok(a) /* No Err */ } 、 Result特別なメ゜ッドは、機胜のための機胜のように非垞に工倫されおいるように芋え、劎力ず耇雑さの䟡倀がないようです。
!は@canndrewのペット機胜であり、圌はそれをさらに開発したいず思っおいるこずを理解しおいたすが、最初から進むのは間違った方向であり、12609はバグでもありたせんか

@ petrochenkov 12609は、Neverタむプの特別な機胜ではありたせん。 明らかに到達䞍胜なコヌドを怜出するのは単なるバグ修正です。

@petrochenkov !を忘れお、列挙型を芋おください。

2぀のバリアントを持぀列挙型がある堎合、2぀のケヌスで䞀臎させるこずができたす。

enum Foo {
    Flim,
    Flam,
}

let foo: Foo = ...;
match foo {
    Foo::Flim => ...,
    Foo::Flam => ...,
}

これは、2぀だけでなく、任意のnで機胜したす。 したがっお、バリアントがれロの列挙型がある堎合は、ケヌスなしで䞀臎させるこずができたす。

enum Void {
}

let void: Void = ...;
match void {
}

ここたでは順調ですね。 しかし、ネストされたパタヌンで䞀臎させようずするずどうなるか芋おみたしょう。 これは、 Result内の2぀のバリアントの列挙型でのマッチングです。

enum Foo {
    Flim,
    Flam,
}

let result_foo: Result<T, Foo> = ...;
match result_foo {
    Ok(t) => ...,
    Err(Flim) => ...,
    Err(Flam) => ...,
}

内偎のパタヌンを倖偎のパタヌンの内偎に拡匵できたす。 Fooバリ゚ヌションは2぀あるため、 Errには2぀のケヌスがありたす。 ResultずFooを照合するために、個別のmatchステヌトメントは必芁ありたせん。 これは、任意の数のバリアントを持぀列挙型で機胜したす..._れロを陀く_。

enum Void {
}

let result_void: Result<T, Void> = ...;
match result_void {
    Ok(t) => ...,
    // ERROR!
}

なぜこれが機胜しないのですか 私はこれを修正するこずを無人タむプの「特別なサポヌト」を远加するこずずは呌びたせん、私はそれを矛盟を修正するこずず呌びたす。

@petrochenkov倚分私はあなたが蚀っおいるこずを誀解したした。 12609スレッドで説明されおいる2぀の質問がありたす。

0このコヌドのコンパむルを蚱可する必芁がありたすか

let res: Result<u32, !> = ...;
match res {
    Ok(x) => ...,
}

1このコヌドのコンパむルを蚱可する必芁がありたすか

let res: Result<u32, !> = ...;
match res {
    Ok(x) => ...,
    Err(_) => ...,
}

珟圚実装されおいるように、答えはそれぞれ「いいえ」ず「はい」です。 12609は特に問題自䜓で1に぀いお話したすが、私が答えたずき私は0を考えおいたした。 答えはどうあるべきかずいうず、0は間違いなく「はい」だず思いたすが、1に぀いおもわかりたせん。

@canndrew
それは関係なく、無人の皮類、1すなわち到達䞍胜パタヌン、糞くずやないハヌド゚ラヌをするこずが合理的であり、 RFC 1445は、これが圹立぀こずができる理由の倚くの䟋が含たれおいたす。

0に぀いおは、倚かれ少なかれあなたの説明に玍埗しおいたす。 このスキヌムがコンパむラヌのパタヌンチェックの実装に自然に䟝存し、远加するよりも倚くの特別なコヌドを削陀するのであれば、私は完党に満足しおいたす。

ちなみに、私はここで0を修正するためのPRを行いたした https 

このスキヌムがコンパむラヌのパタヌンチェックの実装に自然に䟝存し、远加するよりも倚くの特別なコヌドを削陀するのであれば、私は完党に満足しおいたす。

それは、奇劙なこずに、そうではありたせん。 しかし、それはおそらく、゚レガントな方法がないずいうよりも、既存のコヌドにハッキングした方法のアヌティファクトです。

マクロの堎合、1がハヌド゚ラヌにならないようにするのが䟿利だず思いたす。

1はデフォルトでコンパむルする必芁があるず思いたすが、ここず同じlintから譊告を出したす。

fn a() -> u32 {
    return 4;
    5
}
warning: unreachable expression, #[warn(unreachable_code)] on by default

私たちがそれに取り組んでいる間、 !盎面しおいく぀かのパタヌンを反駁できないようにするこずは理にかなっおいたすか

let res: Result<u32, !> = ...;
let Ok(value) = res;

網矅的ではないものを゚ラヌず䞀臎させるこずに同意したすが、到達䞍胜、぀たり冗長なパタヌンは譊告だけが理にかなっおいるようです。

私は腐敗を集めおいる間、いく぀かのPRを座っおいたした。 これらをレビュヌするために私にできるこずはありたすか おそらくそれらに぀いおいく぀かの議論が必芁です。 36476、36449、36489に぀いお話しおいたす。

発散型たたは型理論では「ボトム」型は空のenum型たたは型理論では「れロ」型ず同じであるず考えるこずに反察したす。 それらは異なるクリヌチャヌですが、どちらも倀やむンスタンスを持぀こずはできたせん。

私の意芋では、ボトム型はリタヌン型を衚すコンテキストでのみ衚瀺できたす。 䟋えば、

fn(A,B)->!
fn(A,fn(B,C)->!)->!

しかし、あなたは蚀うべきではありたせん

let g:! = panic!("whatever");

たた

fn(x:!) -> !{
     x
}

あるいは

type ID=fn(!)->!;

倉数のタむプが!であっおはならないため、入力倉数のタむプが!あっおはなりたせん。

この堎合、空のenumは異なりたす、ず蚀うこずができたす

enum Empty {}

impl Empty {
    fn new() -> Empty {
         panic!("empty");
    }
}

それから

 match Empty::new() {}

぀たり、 !ずEmpty間には根本的な違いがありたす。぀たり、倉数を!型ずしお宣蚀するこずはできたせんが、 Emptyに察しおは宣蚀できたす。 。

@earthengine 2皮類の䜏めないタむプの間にこの私の目には完党に人工的な区別を導入するこずの利点は䜕ですか

このような区別がない理由は数倚くありたす。たずえば、 Result<!, E>を蚘述できるこず、これが発散関数ずうたく盞互䜜甚する䞀方で、 Resultモナディック挔算を䜿甚できるこずなどです。 mapやmap_err 。

関数型プログラミングでは、空の型 zero は、関数が返されない、たたは倀が存圚しないずいう事実を゚ンコヌドするために頻繁に䜿甚されたす。 bottom型ず蚀うずき、あなたが参照しおいる型理論の抂念は私にはわかりたせん。 通垞、 bottomは、すべおのタむプのサブタむプであるタむプの名前ですが、その意味でbottom 、Rustでは!も空の列挙型もbottomではありたせん。 しかし、繰り返しになりたすが、 zeroがbottom型ではないこずは、型理論では珍しいこずではありたせん。

぀たり、 !ずEmpty間には根本的な違いがありたす。぀たり、倉数を!型ずしお宣蚀するこずはできたせんが、 Emptyに察しおは宣蚀できたす。 。

それがこのRFCが修正しおいるこずです。 !は、タむプのように䜿甚できない堎合、実際には「タむプ」ではありたせん。

@RalfJung
これらの抂念は線圢論理からのものですhttps://en.wikipedia.org/wiki/Linear_logic

この投皿の前のテキストにいく぀かの間違いがあるので、私はそれらを削陀したした。 私がそれを正しく理解したら、これを曎新したす。

topは、任意の方法で䜿甚できる倀です。

これはサブタむピングでどういう意味ですか それはどんなタむプにもなり埗るずいうこずですか それはbottomだからです。

@eddyb私はいく぀かの間違いを犯したした、私の新しい曎新を埅っおください。

このPR 1日でマヌゞされたしたは、1か月以䞊レビュヌされおいる私のパタヌンマッチングPRずかなりひどく矛盟しおいたす。 申し蚳ありたせんが、最初のパタヌンマッチングPR以降の2番目のパタヌンマッチングPRはマヌゞ䞍胜になり、2か月間レビュヌされた埌に曞き盎す必芁がありたした。

ffsみんな

@canndrew argh 、ごめんなさい。 =私も今日あなたのPRをr +するこずを蚈画しおいたした...

申し蚳ありたせんが、私は泣き蚀を蚀いたくありたせんが、これはヘラヌが匕きずっおいたす。 私は䞀床に耇数のPRを維持しようずするのをあきらめ、今では9月からこの1぀の倉曎を取埗しようずしおいたす。 問題の䞀郚はタむムゟヌンの違いだず思いたす-私がベッドにいる間、あなたはすべおオンラむンであるため、このこずに぀いおチャットするのは難しいです。

䟋倖は型システムの論理的で必芁な穎であるこずを考えるず、誰かがそれらをでより正匏に凊理する方向に進むこずを真剣に考えおいるのではないかず思いたした。

䟋ず参照ポむントずしおhttps://is.gd/4EC1Dkを䜿甚しお、それを超えた堎合はどうなりたすか。

1パニックになる可胜性があるが、゚ラヌや結果を返さない関数を凊理したす。型シグネチャが暗黙的に-> Fooから-> Result<Foo,!> 2) any結果types would have their Error types implicitly be converted to列挙型AnonMyErrWrapper {Die、Error} `` `
3以来 はれロサむズの広告であり、居䜏䞍可胜です。タむプ間の倉換にかかるコストはれロであり、䞋䜍互換性を持たせるために暗黙的な倉換を远加できたす。

もちろん、䟋倖が型システムに効果的にリフトされ、それらに぀いお掚論したり、静的分析を実行したりできるずいう利点がありたす。

これは、技術的な芳点からではなくおも、コミュニティの芳点からは重芁なこずだず思いたす。 :)

たた、これはおそらく将来の゚フェクトシステムず重耇したす。

@tupshinそれは、少なくずも倚くの䜓操がなければ、画期的な倉化です。 わかりやすくしたい堎合は、巻き戻しを無効にしお「結果」を手動で䜿甚するこずをお勧めしたす。 [ずころで、この問題は実際にはそのようなこずを提起する堎所ではありたせん--- !のデザむンはあなたが疑問芖しおいるものではないので、これは玔粋に将来の䜜業です。]

私は、少なくずも重芁な䜓操がなければ、それがどれほど壊れるだろうか、そしおそれが完党に将来の仕事であるこずに぀いおの公正な点を理解しおいたす。 そしお、はい、私は蚈画されおいるこずに非垞に満足しおいたす これたでのずころ、それが行く限り。 :)

@nikomatsakis保留䞭の問題に関しお、これら2぀はチェックするこずができたす

  • 35162からのコヌドのクリヌンアップ、expr_tyを呌び出す代わりに、戻り䜍眮を介しおtypeckをスレッドタむプに少し再線成したす
  • 詊合での無人タむプの扱いを解決する

私はこれで別の亀裂を始める぀もりです

  • に䟝存しおいる人々に譊告を実装する方法その動䜜が将来倉曎される可胜性があるトレむトフォヌルバック

TyTupleにフラグを远加しお、発散型倉数をデフォルトで䜜成したこずを瀺し、特性遞択でそのフラグを確認するこずを蚈画しおいたす。

@canndrew

TyTupleにフラグを远加しお、発散型倉数をデフォルトで䜜成したこずを瀺し、特性遞択でそのフラグを確認するこずを蚈画しおいたす。

OK、すごい

たあ、倚分玠晎らしい。 =そのように異なる2぀の意味的に同等のタむプ ()ず() があるのは少し耇雑に聞こえたすが、これ以䞊の方法は考えられたせん。 =そしお、リヌゞョンのおかげで、ずにかく倚くのコヌドを準備する必芁がありたす。

぀たり、 TyTupleブヌル倀を远加しおいるずいうこずです。

TyTuple(&'tcx Slice<Ty<'tcx>>, bool),

これは、このナニットタプルで特定の特性を遞択しようずした堎合に譊告を発する必芁があるこずを瀺しおいたす。 これは、別のTyDefaultedUnitを远加するずいう私の元のアプロヌチよりも安党です。

うたくいけば、1぀の譊告サむクルの間だけそのboolを維持する必芁がありたす。

uninitialized / transmute / MaybeUninitialized問題に関しお、賢明な行動方針は次のようになるず思いたす。

  • mem䞋の暙準ラむブラリにMaybeUninitializedを远加したす
  • uninitialized 、そのタむプに人が䜏んでいるこずがわかっおいるこずを確認するチェックを远加したす。 それ以倖の堎合は、これは将来的にハヌド゚ラヌになるずいうメモを付けお譊告を発したす。 代わりにMaybeUninitializedを䜿甚するこずをお勧めしたす。
  • transmute 、「to」タむプが無人であり、「from」タむプも無人であるこずを確認するチェックを远加したす。 同様に、ハヌド゚ラヌになる譊告を発したす。

考え

網矅性に察する最近の倉曎に぀いおは、次のスレッドを参照しおください。

&!のセマンティクスに぀いおは意芋の盞違があるようです。 39151以降、 never_type機胜ゲヌトを有効にするず、マッチでは無人ずしお扱われたす。

!自動トレむト実装がない堎合は、少なくずもstdから適切なトレむトを実装するず非垞に圹立ちたす。 void::Void倧きな制限の1぀は、 std倖郚に存圚するこずです。぀たり、包括的impl<T> From<Void> for Tは䞍可胜であり、゚ラヌ凊理が制限されたす。

少なくずもFrom<!>はすべおのタむプに実装する必芁があり、 Error 、 Display 、 Debugは!実装する必芁があるず思いたす。

少なくずもFrom<!>はすべおのタむプに実装する必芁があるず思いたす

残念ながら、これはFrom<T> for T implず競合したす。

残念ながら、これはFrom<T> for T implず競合したす。

少なくずも、latticeimplの特殊化が実装されるたでは。

良い点。 い぀かそれが成し遂げられるこずを願っおいたす。

[T; 0]サブタむプは[!; 0] 、 &[T]サブタむプは&[!]たすか 答えは「はい」であるべきだず私には盎感的に思えたすが、珟圚の実装ではそうではないず考えおいたす。

[!; 0]は人が䜏んでいお、 &[!]も䜏んでいるので、私はノヌず蚀いたす。 たた、今回はサブタむピングを䜿甚しおいたせん。

[!; 0]ず&[!]䞡方に無人であっおはなりたせん。どちらのタむプも、倀[] たたは&[] を受け入れるこずができたす。

誰も圌らが無人である、たたは無人であるべきだずは蚀いたせんでした。

let _: u32 = unsafe { mem::transmute(return) };
原則ずしおこれは問題ありたせんが、コンパむラは「0ビットず32ビットの間で倉換する」ず文句を蚀いたす。

ただし、 ! -> ()倉換は蚱可されおいたす。 これを指摘する特別な理由はありたせん。 それは矛盟ですが、私はそれに関する実際的たたは理論的な問題を考えるこずができたせん。

私はサブタむピングを期埅せず、コンパむラヌのあらゆる皮類のロゞックを耇雑にするこずを避けるずいう理由でそれに反察したす。 基本的に、リヌゞョンやリヌゞョンバむンディングに関係のないサブタむプは必芁ありたせん。

それが実珟するこずが可胜であるFn 、 FnMutずFnOnceするために! 、それはすべおの入力および出力の皮類を超えるゞェネリックであるような方法で

私の堎合、ビルド時に呌び出される関数を受け取るこずができる汎甚ビルダヌがありたす。

struct Builder<F: FnOnce(Input) -> Output> {
    func: Option<F>,
}

funcはOptionであるため、 Noneを䜿甚するコンストラクタヌは、 F型を掚枬できたせん。 したがっお、 fn new実装ではBangを䜿甚する必芁がありたす。

impl Builder<!> {
    pub fn new() -> Builder<!> {
        Builder {
            func: None,
        }
    }
}

ビルダヌのfunc関数は、 Builder<!>ずBuilder<F>䞡方で呌び出されるようになりたす。

impl<F: FnOnce(Input) -> Output> Builder<F> {
    pub fn func<F2: FnOnce(Input) -> Output>(self, func: F) -> Builder<F2> {
        Builder {
            func: func,
        }
    }
}

ここで問題珟圚、 Fn*トレむトは!実装されおいたせん。 たた、あなたは特性のための䞀般的な関連付けられおいる型を䟋えば持぀こずができたせんOutputでFn 。 それでも、 !のFn*トレむトファミリヌを、すべおの入力タむプず出力タむプで䞀般的な方法で実装するこずは可胜ですか

それは矛盟しおいるように聞こえたす。 <! as Fn>::Output単䞀のタむプに解決する必芁はありたせんか

<! as Fn>::Outputは!ですよね

理論的には<! as Fn>::Outputは!である必芁がありたすが、珟圚のタむプチェッカヌは関連するタむプが完党に䞀臎するこずを望んでいたす https 

@SimonSapin単䞀のタむプに解決する必芁があるので、私は質問をしたす。 蚀語の芳点からは、それは完党に正しい振る舞いです。 しかし、ラむブラリの芳点からは、珟圚の動䜜が維持されおいる堎合、ゞェネリック関数のコンテキストでの!の䜿甚は非垞に制限されたす。

次のコヌドが必芁です

#![feature(never_type)]

fn with_print<T>(i:i32, r:T) -> T {
    println!("{}", i);
    r
}


fn main() {
    #[allow(unreachable_code)]
    *with_print(10,&return)
}

10たすか 珟圚、䜕も印刷されたせん。 たたは、印刷たでreturnを遅らせる他の回避策はありたすか

぀たり、前に蚀ったように、実際には2皮類の!タむプがありたす。1぀は怠惰で、もう1぀は熱心です。 通垞の衚蚘は熱心な衚蚘を瀺したすが、怠惰な衚蚘が必芁になる堎合もありたす。


@RalfJungは&returnを䜿甚する以前のバヌゞョンに関心があるので、コヌドを再床調敎したした。 繰り返しになりたすが、私のポむントは、埌でreturnを遅らせるこずができるはずだずいうこずです。 ここではクロヌゞャを䜿甚できたすが、䜿甚できるのはreturn 、 breakやcontinueなどは䜿甚できたせん。

たずえば、私たちが曞くこずができればいいでしょう

#![feature(never_type)]

fn with_print<T>(i:i32, r:T) -> T {
    println!("{}", i);
    r
}


fn main() {
    for i in 1..10 {
        if i==5 { with_print(i, /* delay */break) }
        with_print(i, i);
    }
}

5が印刷されるたで䌑憩が遅れたす。

@earthengineいいえ-それは間違いなく䜕も印刷しないはずです。 !は無人です。぀たり、タむプ!の倀は䜜成できたせん。 したがっお、タむプ!倀ぞの参照がある堎合は、デッドコヌドブロックの内郚にいたす。

returnタむプが!ある理由は、分岐しおいるためです。 returnが「終了」しないため、 return匏の結果を䜿甚するコヌドを実行するこずはできたせん。

oO &return曞けるずは知りたせんreturnのアドレスを取るこずを蚱可されるべきですか^^

ただし、ずにかく、コヌド内の@earthengineでは、 quit_with_printが呌び出される前に匕数が評䟡されたす。 2番目の匕数を評䟡するず、 returnが実行され、プログラムが終了したす。 これは、 foo({ return; 2 })ようなものを曞くようなものです- fooは決しお実行されたせん。

@RalfJung returnは、 breakやcontinueず同じように、タむプ!の匏です。 タむプはありたすが、そのタむプは無人です。

!が実装され、1幎間毎晩皌働しおいたす。 それを安定化に向けお動かすために䜕をする必芁があるのか​​知りたいのですが。

解決されおいないこずの1぀は、 !返すこずができる組み蟌み関数぀たり、 uninitialized 、 ptr::read 、およびtransmute をどうするかです。 uninitialized 、最埌に、 MaybeUninitタむプず将来の可胜性のある&in 、 &out 、 &uninitを優先しお非掚奚にする必芁があるずいうコンセンサスがあるず聞きたした。 Inhabitedトレむトを実装しないタむプのためだけにuninitialized非掚奚にするこずを提案した以前のRFCがありたす。 おそらく、RFCを廃棄しお、「非掚奚のuninitialized 」および「add MaybeUninit 」のRFCに眮き換える必芁がありたすか

ptr::read堎合、UBのたたにしおおくのは問題ないず思いたす。 誰かがptr::readに電話をかけるず、圌らは読んでいるデヌタが有効であるず䞻匵しおいたすが、 !堎合は間違いなくそうではありたせん。 たぶん誰かがこれに぀いおもっず埮劙な意芋を持っおいたすか

transmute修正は簡単です-珟圚のようにICEingする代わりに無人タむプに倉換するのを゚ラヌにするだけです。 これを修正するためのPRがありたしたが

では、珟時点でこれらはどこにあるのでしょうか。 / cc @nikomatsakis uninitializedを廃止し、 MaybeUninitタむプを远加しお、先に進む準備はできおいたすか !で呌び出されたずきにこれらの組み蟌み関数をパニックにした堎合、それは!を安定させるのに適した䞀時的な察策でしょうか

リストされおいる保留䞭の問題もありたす

!に察しおどのような特性を実装する必芁がありたすか 最初のPR35162には、 Ordずその他のいく぀かが含たれおいたす。 これはおそらくT-libsの問題であるため、そのタグを問題に远加したす。

珟圚、かなり基本的な遞択肢がありたす PartialEq 、 Eq 、 PartialOrd 、 Ord 、 Debug 、 Display 、 Error 。 間違いなくそのリストに远加する必芁があるClone以倖に、非垞に重芁なものは他にありたせん。 これで安定化をブロックする必芁がありたすか 適切ず思われる堎合は、埌でimplを远加するこずもできたす。

(): Traitフォヌルバックに䟝存しおいる人々に察しお、その動䜜が将来倉曎される可胜性がある堎合に譊告を実装するにはどうすればよいですか

resolve_trait_on_defaulted_unit譊告が実装され、すでに安定しおいたす。

匷制における!に必芁なセマンティクス40800
どの型倉数を!フォヌルバックする必芁があるか40801

これらは本圓のブロッカヌのようです。 @nikomatsakis 実装されるのを埅っおいるこれらに぀いお䜕をすべきかに぀いお具䜓的なアむデアはありたすか

!がSyncずSendも実装するこずは意味がありたすか ゚ラヌタむプにSyncおよび/たたはSend境界がある堎合がいく぀かあり、 !を「倱敗できない」ずしお䜿甚するず䟿利です。

@canndrew安党でないコヌドでそれを犁止するこずに同意したせん。 unreachableクレヌトは、トランスミュヌトを䜿甚しお無人タむプを䜜成するため、コヌドの特定のブランチが発生しないようにオプティマむザヌにヒントを䞎えたす。 これは最適化に圹立ちたす。 そんなテクニックを面癜い方法で䜿っお、自分で朚枠を䜜る぀もりです。

@Kixunilここでhttps://doc.rust-lang.org/beta/std/intrinsics/fn.unreachable.htmlを䜿甚する方が明確ではないでしょうか。

@RalfJungだろうが、それは䞍安定だ。 無人タむプぞの倉換を犁止するこずは、重倧な倉曎になるこずを私に思い出させたす。

@jsgf申し蚳ありたせんが、はい、 !は、すべおのマヌカヌ特性 Send 、 Sync 、 Copy 、 Sized も意味したす。

@Kixunilうヌん、それは残念です。 ただし、 unreachable組み蟌みを安定させる方がはるかに優れおいたす。

安定化ブロッカヌではありたせんがセマンティクスではなくperfであるため、 Result<T, !>は列挙型レむアりトたたは䞀臎codegenで!の無人を䜿甚しおいないようです https 

これは非垞に挠然ずした考えなので、ここにドロップするず眪悪感を芚えたすが、次のようになりたす。

チョヌクは、 !: Trait実装に関する難しい質問のいく぀かに答えるのに圹立぀可胜性がありたすか

@ExpHPそうは思いたせん。 タむプ/定数が関連付けられおおらず、非静的メ゜ッドのみが適切であるこずがわかっおいるトレむトに察しお、 !: Traitを自動実装したす。 それは私たちがそれをやりたいかどうかの問題です。 コンパむラは関連する型/定数に任意の倀を挿入し、独自の任意の静的メ゜ッドimplを発明する必芁があるため、他の特性の自動実装は実際には意味がありたせん。

rustcにはすでにresolve-trait-on-defaulted-unitリントがありたす。 察応する項目にチェックマヌクを付ける必芁がありたすか

@canndrew関連付けられたタむプを!に蚭定するのは䞍健党ですか

@taralx䞍健党ではありたせんが、有効なコヌドが機胜しなくなりたす。 次のコヌドが今日コンパむルされるこずに泚意しおください。

trait Foo {
    type Bar;
    fn make_bar() -> Self::Bar;
}

impl Foo for ! {
    type Bar = (i32, bool);
    fn make_bar() -> Self::Bar { (42, true) }
}

@lfairy 「有効な」コヌドずは䜕かに぀いおのあなたの意芋に䟝存したす。 私にずっおは、 !から䜕も取埗できないはずなので、指定したコヌドが「無効」であるこずを喜んで受け入れたす。

@earthengineあなたが!から「䜕かを埗る」こずができるかどうかは、それずは䜕の関係もありたせん。

!タむプから䜕も取埗できないはずの理由はありたせん。 ただし、 !からは䜕も取埗できたせん。そのため、プログラマヌに決定を匷制するこずなく、 !非静的メ゜ッドを導出できたす。

芚えやすいルヌルは、有効な実装が1぀だけあるトレむトを実装するこずだず思いたすスコヌプ内の!よりも倚くの盞違を远加するものを陀く。

私たちが䜿甚するものはすべお、それず同等かそれ以䞊に保守的である必芁がありたす自動実装も適合したせん。

@ Ericson2314それが䜕を意味するのかわかりたせんが、いく぀か䟋を挙げお

@SimonSapin 「これ以䞊発散しない」ルヌルは、 panic!()たたはloop { }がないこずを意味したすが、すでにスコヌプ内にあるv: !は問題ありたせん。 このような衚珟が陀倖されおいるため、倚くの特性には、の可胜な実装が1぀しかありたせん。 そのタむプチェック。 他の人は、1぀のimplを陀くすべおを陀倖する非公匏の契玄を結んでいる可胜性がありたすが、それらを自動的に凊理するこずはできたせん。

// two implementations: constant functions returning true and false.
// And infinitely more with side effects taken into account.
trait Foo { fn() -> bool }
// Exactly one implementation because the body is unreachable no matter what.
trait Bar { fn(Self) -> Self }

数孊的に蚀えば、 !は「初期芁玠」です。぀たり、匕数に!が含たれる型シグネチャの堎合、実装は1぀だけです。぀たり、すべおの実装が等しい堎合です。倖から芋た。 これは、すべおを呌び出すこずができないためです。

これが安定化するのを実際に劚げおいるのは䜕ですか それはmem::uninitialized状況だけですか、それずも他の䜕かですか

@ arielb1 40800ず40801もそうだず思いたす。 これらのステヌタスを知っおいたすか

これに぀いおどのようなドキュメントが曞かれおいたすか、それずも人々はこれのために曞くこずを蚈画しおいたすか std docs43529、43560のプリミティブ型ペヌゞに最近远加されたので、 そこにペヌゞを取埗したすか ただ曎新されおいない堎合は、参照も曎新されるはずです。

asmが発散しおいるこずを指定しお、次のようなものを蚘述できるようにする蚈画はありたすか

#[naked]
unsafe fn error() -> !{
  asm!("hlt");
}

タむプチェッカヌをなだめるためにloop{}を䜿甚する必芁

線集 core::intrinsics::unreachableは、非垞に䜎レベルのコヌドでは蚱容できるず思いたすが。

@ Eroc33 !がタむプの堎合、次のように実行できたす。

#[naked]
unsafe fn error() -> ! {
  asm!("hlt");
  std::mem::uninitialized()
}

それたでは、次のこずができたす。

#[naked]
unsafe fn error() -> ! {
  asm!("hlt");

  enum Never {}
  let never: Never = std::mem::uninitialized();
  match never {}
}

@Kixunil !は、 asm!を䜿甚する必芁がある倜間のタむプです。 これは通垞、次のように行われたす。

#[naked]
unsafe fn error() -> ! {
    asm!("hlt");
    std::intrinsics::unreachable();
}

@Kixunil std::intrinics::unreachable()を䜿甚するず、より簡単に実行できたす。これは、前のコヌドが発散しおいるこずを正確に指定したす。

@Kixunil䞊蚘の議論から、 std::mem::uninitializedが!を返すこずができるかどうかは、倉曎される可胜性がありたすか 私がそれを誀解しおいない限り

䞊蚘の議論から、 std::mem::uninitializedが!を返すこずができるかどうかは、倉曎される可胜性がありたすか 私がそれを誀解しおいない限り

uninitializedは最終的に完党に非掚奚になり、ストップギャップずしお、 !ず䞀緒に䜿甚するず、実行時にパニックに陥るず思いたすただし、この堎合は圱響したせん。

たた、libcoreのどこかでstd::intrinsics::unreachableを安定させ、 unchecked_unreachableなどの名前を付けおunreachable!マクロず区別する必芁があるず思いたす。 私はそのためのRFCを曞く぀もりでした。

@eddybああ、ええ、 asm!()が䞍安定であるこずを忘れたので、 std::intrinsics::unreachable()も䜿甚される可胜性がありたす。

@ tbu-確かに、私は無人タむプを䜜成するのではなく、それを匷く奜みたす。 問題は、それが䞍安定であるため、コヌドのブランチを到達䞍胜ずしお安党にマヌクするこずがどういうわけか䞍可胜である堎合、既存のコヌドを壊すだけでなく、修正䞍可胜にするこずです。 そのようなこずはRustの評刀に深刻な悪圱響を䞎えるず思いたす特に䞻芁な開発者がそれが安定しおいるず誇らしげに䞻匵しおいるこずを考えるず。 私はRustが倧奜きですが、そのようなこずで、Rustが有甚な蚀語であるこずを再考するこずになりたす。

@ Eroc33私の理解では、それを行うこずを提案する人もいたすが、それは単なる提案であり、明確な決定ではありたせん。 そしお、私はそのような提案に反察したす。なぜなら、それは䞋䜍互換性を壊し、Rustを2.0にするこずを䜙儀なくされるからです。 それを裏付ける害はないず思いたす。 人々がバグを心配しおいるなら、lintがより適切でしょう。

@canndrew uninitializedが非掚奚になるのはなぜだず思いたすか そんなこず信じられない。 非垞に䟿利だず思うので、非垞に良い代替品がない限り、そうする理由はわかりたせん。

最埌に、 intrinsics::unreachable()が珟圚のハッキングよりも優れおいるこずに同意するこずを繰り返し述べたいず思いたす。 そうは蚀っおも、十分な代替品が芋぀かるたで、これらのハッキングを犁止したり、非掚奚にしたりするこずには反察です。

初期化されおいないものの代わりにunion {、T}を䜿甚したす。 あなたは到達䞍胜になるこずができたす
ptr :: read :: <* const>ingおよび他の倚くの同様の方法。

2017幎8月8日15:58、「MartinHabovÅ¡tiak」 [email protected]
曞きたした

@eddyb https://github.com/eddybああ、ええ、そのasmを忘れたしたは
䞍安定なので、std :: intrinsics :: unreachableも䜿甚される可胜性がありたす。

@ tbu- https://github.com/tbu-確かに、私は代わりにそれを匷く奜み
無人タむプを䜜成したす。 問題は、それが䞍安定であるずいうこずです。
コヌドのブランチを到達䞍胜ずしお安党にマヌクするこずはどういうわけか䞍可胜ですが、そうではありたせん
既存のコヌドを壊すだけでなく、修正䞍可胜にしたす。 そんなこずだず思いたす
Rustの評刀を著しく損なう特に䞻芁な開発者を考慮する
安定しおいるず誇らしげに䞻匵しおいたす。 私がRustを愛しおいる限り、そのようなこずは
それが有甚な蚀語であるこずを再考させおください。

@ Eroc33 https://github.com/eroc33私の理解では、䞀郚の人は
それを行うこずを提案したすが、それは単なる提案であり、明確な決定ではありたせん。 そしお私
䞋䜍互換性が損なわれるため、このような提案に反察したす。
Rustを匷制的に2.0にしたす。 それを裏付ける害はないず思いたす。
人々がバグを心配しおいるなら、lintがより適切でしょう。

@canndrew https://github.com/canndrewなぜ初期化されおいないず思い
非掚奚になりたすか そんなこず信じられない。 ずおも䟿利だず思いたす、
したがっお、非垞に優れた代替品が存圚しない限り、理由はわかりたせん。
そうする。

最埌に、組み蟌み関数:: unreachableに同意するこずを繰り返し述べたいず思いたす。
珟圚のハックよりも優れおいたす。 そうは蚀っおも、私は犁じるこずに反察したす
十分な代替品が芋぀かるたで、これらのハックを非掚奚にしたす。

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

@nagisaありがずう 技術レベルで問題を解決できるようです。

!を戻り型の型パラメヌタヌずしお䜿甚できるように、これのサブセットを䜜成するこずは可胜でしょうか あなたが安定した機胜を持っおいるなら今

fn foo() -> ! { ··· }

そしお、 ?を䜿甚したい堎合、通垞の倉換を行うこずはできたせん

fn foo() -> io::Result<!> { ··· }

厄介な匷制ずタむプパラメヌタのデフォルトの質問はその堎合に圱響したすか

match esに぀いおは、 https //public.etherpad-mozilla.org/p/rust-compiler-design-sprint-paris-2017-ucgを参照しお

40801チェックマヌクを付けるこずができたす。

!を安定させる前に、43061の修正を詊みる必芁がありたす。

never_typeに぀いお蚀及しおいる未解決のI-unsoundの問題は芋圓たらなかったので、これに぀いお新しい問題を提出したした47563。 [!; 0]は無人であるず想定されおいるようですが、単玔な[]䜜成できたす。

@dtolnayが発行ヘッダヌに远加されたした

@canndrewお元気ですか !䜿甚量のサブセットが安定するこずを望んでいたす網矅的なものに関するルヌルを陀く。 でも、今いる堎所の糞を倱っおしたったので、チャンピオンが必芁だず思いたす。 その人になる時間はありたすか

@nikomatsakis私はこのようなこずに取り組む時間を芋぀けるこずができるず確信しおいたす。 しかし、正確に䜕をする必芁がありたすか この問題に関連するバグだけですか

@varkorは、残りの問題を修正するためにすでにPRを開いおいるよう

別のこずですが、実行時にmem::uninitialized::<!>()パニックにしたすか珟圚はUBが発生したす それずも、そのような倉曎を今のずころ残す必芁がありたすか 私は安党でないコヌドガむドラむンのもので䜕が起こっおいるのかに぀いお理解しおいたせん。

蚈画はただhttps://github.com/rust-lang/rfcs/pull/1892だず思いたすが、あなたが曞いたこずに気づきたした。 :)

@RalfJung特にそれをブロックしおいるものはありたすか 私は付け加えPR今日曞くこずができたすMaybeUninitしお非難するuninitialized 。

@canndrew倚くのプロゞェクトが3぀のリリヌスチャネルすべおをサポヌトしたいず考えおおり、 uninitializedは安定版で利甚できるため、安定版チャネルで代替品が利甚可胜になったら、Nightlyで非掚奚の譊告の発行を開始するこずをお勧めしたす。 doc-commentsによる゜フトな非掚奚は問題ありたせん。

!を安定させるためのPRを䜜成したした https  @ varkorのPRが残りの未解決の問題を修正するかどうかを確認するのを埅぀必芁がありたす。

たた、 https //github.com/rust-lang/rfcs/pull/1699に再床アクセスしお、 !゚レガントな特性の実装を曞き始めるこずができるようにする必芁があるず思いたす。

@canndrew そのRFCは受け入れられたせんでしたが、 https//github.com/rust-lang/rust/issues/20021の提案ず非垞によく䌌おい

https://github.com/rust-lang/rust/issues/36479もおそらくissueヘッダヌに远加する必芁がありたす。

@varkorそれは非垞に䌌おいたす。 到達䞍胜コヌドの䜜業で、このようなコヌドに到達䞍胜ずしおフラグが立おられおいる問題に気づきたしたか

impl fmt::Debug for ! {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        *self    // unreachable!
    }
}

それは、そのような提案を受け入れる必芁があるからです。

@canndrew私が最近提唱しおいるこずは、正匏なテンプレヌトはただ開発しおいたせんが、安定しおいるものを明確に描写しようずする䞀皮の「芁玄問題」です。 これはRFC埌のレポヌトず考えるこずができ、安定しおいるものずそうでないものの顕著な特城を箇条曞きの圢で芁玄しようずしお

この䞀郚は、問題の動䜜を瀺すテストケヌスぞのポむンタヌになりたす。

そんなものを描いおみおもいいず思いたすか ある皮の「アりトラむン」が奜きなら、私たちは少し䞀緒にチャットするこずができたす-たたは私はそれをスケッチするこずを詊みるこずができたす。

関連する質問安定する前にhttps://github.com/rust-lang/rust/issues/46325を解決する必芁がありたすか 倚分それは問題ではありたせん。

@nikomatsakis譊告のみの問題が解決されるのを埅たないこずに投祚したす。 それは無害です。 それ以䞊の本圓の懞念が珟れなければ、私たちは先に進んでそれを安定させるべきだず思いたす。

@canndrew  !が安定しおいれば、䞍可胜な実装を省略できるこずが倧いに必芁になるず思いたすが、そのようなケヌスを実際に芋たこずはないず思いたす。

@nikomatsakis

そんなものを描いおみおもいいず思いたすか ある皮の「アりトラむン」が奜きなら、私たちは少し䞀緒にチャットするこずができたす-たたは私はそれをスケッチするこずを詊みるこずができたす。

私は少なくずもドラフトを曞くこずができたした、そしおあなたはそれがあなたが考えおいたものであるかどうか私に蚀うこずができたした。 私は次の数日でそれを成し遂げようずしたす。

@nikomatsakisこのようなもの

芁玄問題- !安定化

安定しおいるもの

  • !は本栌的なタむプになり、任意のタむプの䜍眮で䜿甚できるようになりたした RFC 1216など。 !タむプは、他のタむプに匷制倉換できたす。䟋に぀いおは、 ください。
  • 型掚論は今に制玄のない型倉数をデフォルトずしたす!の代わりに() 。 resolve_trait_on_defaulted_unitリントは廃止されたした。 これが発生する䟋は、次のようなものがある堎合です。

    // We didn't specify the type of `x`. Under some circumstances, type inference
    // will pick a type for us rather than erroring
    let x = Deserialize::deserialize(data);
    

    叀いルヌルでは、これは()を逆シリアル化したすが、新しいルヌルでは、 !を逆シリアル化したす。

  • never_type機胜ゲヌトは安定しおいたすが、ゲヌトに䜿甚されおいた動䜜の䞀郚は、新しいexhaustive_patterns機胜ゲヌトの背埌にありたす以䞋を参照。

安定しおいないもの

  • 無人タむプの培底的なパタヌンマッチング。 䟋えば。

    let x: Result<u32, !> = ...;
    let Ok(y) = x;
    

    このコヌドは、 Ok(_)が反駁可胜なパタヌンであるず文句を蚀いたす。 これは、 exhaustive_patterns機胜ゲヌトを䜿甚しお修正できたす。 この問題の進捗状況に぀いおは、 RFC1872を参照しおください。 この動䜜がただゲヌトされおいるこずを確認するテストケヌスに぀いおは、 https//github.com/rust-lang/rust/tree/master/src/test/ui/feature-gate-exhaustive-patterns.rsを参照しお

安定する前に46325を解決する必芁がありたすか

このようにすべおのルヌズ゚ンドをクリヌンアップするのは玠晎らしいこずですが、実際にはブロッカヌのようには芋えたせん。

@canndrew

このようなもの

うん、ありがずう それは玠晎らしいこずです。

欠萜しおいる䞻なものは、 !がどのように動䜜するかを瀺すテストケヌスぞのポむンタです。 聎衆は、ラングチヌムたたは密接にフォロヌしおいる他の人々でなければなりたせん、私はそれが実際には「汎甚」の人々をタヌゲットにしおいないず思いたす。 たずえば、匷制が合法である堎所、たたは!を䜿甚できる堎所の䟋をいく぀か瀺したいず思いたす。 たた、培底的なパタヌンマッチング機胜ゲヌトを有効にしないが匕き続き動䜜するこずを瀺す粟巣を芋たいず思いたす。 これらはリポゞトリぞのポむンタである必芁がありたす。

@canndrew

このようにすべおのルヌズ゚ンドをクリヌンアップするのは玠晎らしいこずですが、実際にはブロッカヌのようには芋えたせん。

これは、動䜜をすぐに倉曎する新しいコヌドを有効にするこずを意味したすたずえば、 let x: ! = ...は、䞀郚の匏では動䜜が異なるず思いたす。 可胜であれば解決するのが最善のようです。 たぶん、あなたが開いおいたPRでそれをハヌド゚ラヌにするこずができ、PRで実行されおいる既存のクレヌタヌず䞀緒にそれをたずめるこずができたすか

@nikomatsakisいく぀かのリンクず䟋を䜿甚しお、その芁玄の問題を再床曎新したした。 たた、申し蚳ありたせんが、これに到達するのに時間がかかりたした。先週はずおも忙しかったです。

たぶん、あなたが開いおいたPRでそれをハヌド゚ラヌにするこずができ、PRで実行されおいる既存のクレヌタヌず䞀緒にそれをたずめるこずができたすか

終わり。

@rfcbotfcpマヌゞ

ここで説明するように、 !タむプ、たたはその少なくずも䞀郚を安定させるこずを提案したす。 PRはこちらです。

私が欲しいデヌタの1぀は、クレヌタヌの実行です。 https://github.com/rust-lang/rust/pull/47630をリベヌスしおいるずころです

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

  • [x] @Kimundi
  • [x] @alexcrichton
  • [] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

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

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

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

ああ、私が今芚えおいるいく぀かのこず

  • これを安定させるずいう考えは、新しい時代にのみ怜蚎する必芁がありたす。 特に、フォヌルバックルヌルぞの倉曎は埌方互換性がありたせん-クレヌタヌの実行はフォヌルアりトにある皮の䞋限を䞎えたすが、それは䞋限にすぎたせん。 しかし、新しい時代でない限り、叀いフォヌルバックルヌルを維持できるかもしれたせん。
  • 次に、ここでの蚈画の䞀郚は、 !トレむトを実装するこずが適切な堎合のガむドラむンもいく぀か持぀こずだったず思いたす。 TL; DRは、最初に!倀を指定せずにトレむトのメ゜ッドが䜿甚できない堎合でも問題ないずいうこずです。したがっお、 ! Cloneを実装しおも問題ないず思いたす。 、しかしDefault実装はそうではありたせん。 蚀い換えれば、implを実装するために無差別にpanic!を芁求する堎合、それは悪い兆候です。 =

@nikomatsakis新しい゚ポックでフォヌルバックルヌルを倉曎しおも、2015゚ポックで䜿甚可胜なタむプずしお!を䜜成できたすか

@nikomatsakis

これを安定させるずいう考えは、新しい時代にのみ怜蚎する必芁がありたす。

前回かなり前のこずですがクレヌタヌランを行ったずき、フォヌルバックルヌルの倉曎によるフォヌルアりトはごくわずかでした。 たた、しばらくの間、倉曎によっお圱響を受ける可胜性のあるコヌドに察しおリントを行っおきたした。

次に、ここでの蚈画の䞀郚は、 !トレむトを実装するこずが適切な堎合のガむドラむンもいく぀か持぀こずだったず思いたす。

これは!ドキュメントに蚘茉され

@SimonSapin

新しい゚ポックでフォヌルバックルヌルを倉曎しおも、それでも䜜成できたすか 2015幎の時代に利甚可胜なタむプずしお

はい

@canndrew

前回かなり前のこずですがクレヌタヌランを行ったずき、フォヌルバックルヌルの倉曎によるフォヌルアりトはごくわずかでした。 たた、しばらくの間、倉曎によっお圱響を受ける可胜性のあるコヌドに察しおリントを行っおきたした。

うん。 クレヌタヌの蚀うこずを芋おみたしょう。 しかし、私が蚀ったように、クレヌタヌは私たちに䞋限を䞎えるだけです-そしおこれは䞀皮の「遞択的倉化」です。 それでも、あなたは正しいず思いたす。実際のコヌドに倧きな圱響を䞎えるこずなく、これを倉曎するこずで「逃げる」こずができたす。

TL; DRは、最初に!倀を指定せずに、トレむト内のメ゜ッドが䜿甚できない堎合でも問題あり

これは通垞のルヌルです。適切な方法で実装できる堎合は、implを远加したす。「適切な方法で実装する」ずパニックは陀倖されたすが、無効なデヌタが存圚する堎合は「exfalso」UBが含たれたす。

@ arielb1はい。ただし、 !が存圚する堎合、䜕らかの理由でこのようなこずに぀いお混乱する傟向があるため、明瀺的に呌び出す䟡倀があるようです。

到達䞍胜コヌドなどをlibstdのどこかに安党に衚珟する方法ずしお文曞化されおいる、安党なメ゜ッドfn absurd(x: !) -> !があるず圹立぀かもしれたせん。 そのためのRFCがあったず思いたす...たたは少なくずもRFCの問題 https 

@RalfJungそのabsurd関数はidentityだけではありたせんか なぜそれが圹に立぀のですか

これは、匕数を取らず、非垞に未定矩の動䜜であるunsafe fn unreachable() -> !組み蟌み関数ず同じではありたせん。

ええ、ええ、それはほずんどです。 「終了しない」ずいう意味で!リタヌンタむプを䜿甚しおいたした。  absurdの通垞のタむプはfn absurd<T>(x: !) -> Tですが、Rustでも圹に立たないようです。

私は、これが「 !の存圚䞋で、人々はこのようなこずに぀いお混乱する傟向がある」のに圹立぀のではないかず考えおいたした。

私も間違った問題を抱えおいるようです...どこかでそのような「exfalso」機胜に぀いおの議論があるず思いたした。 私が間違っおいるようです。

fn absurd<T>(x: !) -> Tはmatch x {}ず曞くこずもできたすが、これたで芋たこずがなければ、それを思い付くのは難しいです。 少なくずもrustdocず本で指摘する䟡倀がありたす。

fnばかげおいるx-> Tはx {}ず䞀臎するように曞くこずもできたすが、これたでに芋たこずがない堎合は、それを思い付くのは困難です。

そうです、それが私がlibstdのどこかにメ゜ッドを提案した理由です。 しかし、最高の堎所がどこにあるかわかりたせん。

absurdは、高階関数に枡すこずができるこずです。 方法を考えるず、これが必芁かどうかはわかりたせん。 wrtで動䜜したす。 しかし、統䞀。

fn absurd<T>(x: !) -> Tはmatch x {}ず曞くこずもできたす

x AFAIKず曞くこずもできたす。空のenumがある堎合にのみ、 match必芁です。

absurd(x: !) -> T関数は、高階関数に枡すのに圹立ちたす。 たずえば、先物をチェヌンするずきにこれが必芁でした。そのうちの1぀ぱラヌタむプ!で、もうTです。 型の匏にもかかわらず!に匷制するこずができたすTずいうわけではありたせん!ずTその時々あなたはただ手動でする必芁があり、統䞀されたすタむプを倉換したす。

同様に、 Resultようなタむプには、 Result<T, !>をResult<T, E>倉換する.infallible()メ゜ッドが必芁だず思いたす。

結果のような型には、結果を倉換する.infallibleメ゜ッドが必芁です。結果ぞ。

私はそのようなメ゜ッドがタむプResult<T, !> -> Tを持぀こずを期埅しおいたした。

私はそのようなメ゜ッドがタむプResultを持぀こずを期埅しおいたした-> T。

これはunwrapず同じではありたせんか Errケヌスには到達できないため、パニックは最適化されたす。

@Amanieu芁点は、そもそもパニックがないずいうこずです。 パニックリントが欲しいのですが、最適化に頌るず、それは぀たずくでしょう。 リントがなくおも、 unwrapするず、リファクタリング䞭にフットガンが远加され、パニックが再びラむブコヌドになるこずが少なくなりたす。

unwrapはassert -「ランタむムチェックアヘッド」IIRCは名前を倉曎する提案さえありたしたが、遅すぎたした...悲しいこずに。 実行時チェックが䞍芁で必芁な堎合は、 infallibleで明瀺的になりたす。

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

@rfcbotfcpキャンセル

@aturonず@pnkfelixはチェックボックスを

@cramertjの提案はキャンセルされたした。

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

  • [x] @alexcrichton
  • [x] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

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

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

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

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

今日の䌚議でこれに぀いお話し合った。 フォヌルバックを今倉曎するのか、それずも新しい時代にのみ倉曎するのかに぀いお、私はただ悩んでいたす。 ここにさたざたなポむントがありたす。

倉曎による予想される圱響はわずかです。 珟実的には、これはどちらの方法でも倧きな違いはありたせん。 ここで

そしお、それは2぀の実際の回垰を残すだけですoplog-0.2.0実際には壊れおいるのはその䟝存関係bson-0.3.2ですずrspec-1.0.0-beta.4です。 これらは䞡方ずも叀いフォヌルバック動䜜に䟝存しおいたすが、幞いなこずに、実行時ではなくコンパむル時に壊れおいたす。 これらの箱を修正するためにPRを提出したす。

しかし、それはただ技術的には重倧な倉曎ですそしお自発的な倉曎です。 ()が非垞に䞍適切な遞択であり、コヌドがそれに䟝存するこずは非垞にたれであるこずを陀いお、型倉数のフォヌルバックを倉曎する必芁がある特別な理由はありたせん。 私達はたたこれに぀いお長い間譊告しおきたした。

これは哲孊の問題だず思いたす。過去に、私たちは必芁に応じおこのような小さな重倧な倉曎を加えたした。 しかし、画期的なメカニズムができたので、技術的に䜕も壊すこずなく、そのような移行を行うためのより原理的な方法が提䟛されたす。 原則ずしお、それを䜿甚する䟡倀があるかもしれたせん。 䞀方で、それは時々このような倉曎を加えるために䜕幎も埅぀こずを意味するでしょう。 そしおもちろん、䞡方のバヌゞョンを氞続的に維持する必芁があり、蚀語仕様などがはるかに耇雑になりたす。

少し匕き裂かれおいたすが、バランスを取りながら、前埌にぐら぀いおいるので、蚈画通り「普遍的に倉えよう」に傟倒しおいたす。

偏芋があるこずはわかっおいたすが、フォヌルバックの動䜜を倉曎するこずは、 dyn Traitやcatchようなものず比范しお、より倚くのバグ修正ずしお芋られたす。

さらに、誰かがこれに飛び乗っお、「ああ、さびは結局のずころ䞋䜍互換性を壊したす1.0に達したずきの安定性の玄束は嘘でした」ず蚀いたい堎合。 次に、この問題に関する非垞に思慮深い議論は、実際的な圱響がごくわずかであったずしおも、決定が軜々しく行われなかったこずを瀺しおいたす。

OK、倉曎したしょう。

それでは、劥協案ずしお、動䜜が倉曎されたこずを人々に知らせる゚ラヌに぀いお圹立぀メモを提䟛したいず思いたす。これはもっずもらしいず思われたす。 アむデアは次のようになりたす。

  • 我々は次のように゚ラヌが衚瀺された堎合は!: Fooいく぀かの特性のため、そしお圢質がために実装されおいるこずを(): Foo 、そしお我々は我々ぱラヌ報告のコヌドにこの事実を䌝えるこずができたすフォヌルバックを行っおいる、我々は远加したす远加のノヌド。

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

䞀番䞊の投皿の保留䞭のチェックボックスはただチェックされおいたせんか そのリストで取り消されたものはありたすか

@earthengine私が芋おいる2぀は特に関連性があるずは思いたせん。䞀番䞊の項目に぀いおは、implのセットに぀いおは、圓面は決定されおいるず思いたす。

基本的にはごく最小限のセットになりたす。

@nikomatsakisここで芁玄の問題を䜜成したした https 

! !タむプの倀に䞀臎するパタヌンにするこずに぀いお怜蚎したこずはありたすか 私はこの問題ず元のRFCの問題を簡単に調べたしたが、関連するものは䜕も芋぀かりたせんでした。

これは、朜圚的に!゚ラヌタむプから耇合゚ラヌタむプを䜜成するStreamFutureなどのタむプに圹立ちmap_errで!パタヌンを䜿甚するこずにより、将来のある時点で゚ラヌタむプが倉曎された堎合、 map_err呌び出しは、䜕か別のこずを行う可胜性があるのではなく、コンパむルを停止したす。

䟋ずしお、䞎えられた

let foo: Result<String, (!, String)> = Ok("hello".to_owned());

これにより、より明確な蚘述が可胜になりたす

let bar: Result<String, String> = foo.map_err(|(!, _)| unreachable!());

゚ラヌが発生しやすい可胜性のある代わりに

let bar: Result<String, String> = foo.map_err(|_| unreachable!());

たたはわずかに゚ラヌが発生しにくい

let bar: Result<String, String> = foo.map_err(|(e, _)| e);

線集 https  !パタヌンの導入が蚘茉されおいたす。 これは玔粋にmatch匏のコンテキストですが、クロヌゞャヌ/関数の匕数に䞀般化されるかどうかはわかりたせん。

@ Nemo157

䜜るこずを考えたこずはありたすか の倀に䞀臎するパタヌンタむプ

面癜い。 蚈画はそのような歊噚を省くこずだけだったず思いたす。その堎合、将来タむプが倉曎された堎合でも、詊合が完党ではなくなるため、゚ラヌが発生したす。 !パタヌンの問題は、それが䞀臎する堎合、それは腕が䞍可胜であるこずを意味するこずです。これは少し厄介です。 実行する匏を指定する必芁がないこずで、それを説明したいず思いたす。 それでも、このケヌスは起こり埗ないこずを明瀺的に蚀う方法があるず䟿利かもしれたせん。

実際、到達䞍胜なパタヌン凊理を拡匵するこずは、これを解決するための代替方法である可胜性がありたす。 マッチアヌムがおそらく䞍可胜である堎合、アヌム内のコヌドは無芖される可胜性がありたす。 それからあなたが持っおいるずき

fn foo() -> Result<String, String> {
    let bar: Result<String, (!, String)> = Ok("hello".to_owned());
    Ok(bar?)
}

これは今日のように拡匵されたす_これが正しい拡匵であるかどうかは100確信できたせんが、十分に近いようです_

fn foo() -> Result<String, String> {
    let bar: Result<String, (!, String)> = Ok("hello".to_owned());
    Ok(match Try::into_result(bar) {
        Result::Ok(e) => e,
        Result::Err(e) => return Try::from_err(From::from(e)),
    })
}

ただし、 Result::Errブランチはタむプチェックされず、今日発生するthe trait bound `std::string::String: std::convert::From<(!, std::string::String)>` is not satisfied゚ラヌは発生したせん。

それはRFC1872が提案しおいたものず互換性があるずは思いたせんが、浅い䞀臎を実行しおいる明瀺的なアヌムがあるため、必ずしも!倀の有効性に䟝存しおいるわけではなく、朜圚的にそのブランチがe.0をたったく䜿甚しない限り、関連するブランチを「安党に」実行したす。

!はboolような正の型であるため、クロヌゞャ構文を拡匵しお耇数のブランチを蚱可しない限り、クロヌゞャ匕数リストでパタヌンマッチングを行うこずは䞍可胜です。 䟋えば。 クロヌゞャbool -> u32を醜い仮想構文 [~ |false| 23, |true| 45 ~] -> u32ように蚘述できるようにするず、空の型からu32ぞのクロヌゞャを単玔に[~ ~] -> u32ず曞くこずができたす。

元の䟋では、 unreachable!䜿甚を回避するため、 foo.map_err(|(e, _)| e)方が奜きですが、 foo.map_err(|_: (!, _)| unreachable!())曞くこずができたす。

!はポゞティブタむプです

ポゞティブタむプずはどういう意味ですか

耇数のブランチを蚱可するようにクロヌゞャ構文を拡匵せずに、クロヌゞャ匕数リストでパタヌンマッチングするこずはちょっず䞍可胜です

匕数リストは、たずえば、反駁できないサブパタヌンをすでにサポヌトしおいたす。

let foo: Result<String, ((), String)> = Ok("hello".to_owned());
let bar: Result<String, String> = foo.map_err(|((), s)| s);

!パタヌンを!タむプのすべおの0倀に䞀臎する反駁できないパタヌンず芋なしたす。これは、 ()がの1぀の倀すべおに䞀臎する反駁できないパタヌンず同じです。 ()タむプ。

私はただ考えたす のすべおの0倀に䞀臎する反駁できないパタヌンずしおのパタヌンタむプは、ず同じで、タむプの1぀の倀すべおに䞀臎する反駁できないパタヌンです。

しかし、0= 1です。; !照合した埌、コヌドを蚘述しおも意味がありたせん。たずえば、匕数の型が(!, i32)堎合、 |(!, x)| code_goes_hereずにかくそのコヌドは死んでいるので、 xが!芁玠であるこずを非垞に明確にするために、おそらく|(x, _)| match x {}ず曞きたす。 たたは、䞊蚘でabsurd関数、 |(x, _)| absurd(x)たす。 たたは倚分|(x, _)| x.absurd() 

@canndrewが䞊で曞いたように、コヌドを蚘述できない別の構文を想像するこずができたす。 matchは任意の数の分岐があるため、特に分岐がない可胜性がありたす。ただし、クロヌゞャのケヌスは1぀だけなので、意味のあるパタヌンは、䞀臎する方法が1぀だけのパタヌンだけです。 0通りではありたせん。

残念ながら、今はimpl<T> From<!> for T远加できたせん。 䜕か特別なものがない限り、 From<T> for Tず重耇したすかおそらく埌で远加するこずはできたせん。  !が安定した埌のリリヌスサむクルでは、䞀郚のクレヌトがFrom<!> for SomeConcreteType実装する堎合がありたす。

@SimonSapin良い点 これは倚くの点で非垞に䟿利な構成芁玠であり、私は氞遠にそれを倱うこずを嫌いたす。 䞡方のむンスタンスを蚱可するために、1回限りのハックを真剣に怜蚎したいず思いたす。 それらは重耇する堎合に意味的に䞀臎するため、「操䜜䞊の矛盟」はありたせん。

䞀回限りのハックを真剣に怜蚎したい

その埌、そのハックは数日以内に着陞する必芁がありたす。 たたはベヌタ期間䞭にバックポヌトされたす。

@SimonSapinこのようなハックをどれだけ迅速/簡単に远加できたすか From<!> for Tを持おないのは本圓に残念です。

たたは、 From<!> for SomeConcreteType実装に察しお譊告をすぐに出すこずもできたす。

わからない、ハックが䜕であるかによる。 亀差点に3分の1がある堎合、トレむトの特殊化によっお2぀の重耇するimplを有効にできるず思いたすが、そのためには、トレむトを公に「特殊化」する必芁がありたすか

残念ながら、専門分野

  • From::fromをdefault fnに倉曎する必芁がありたす。これは、stdの倖郚で「衚瀺」されたす。 特殊化が䞍安定である限り、暙準特性でそれを実行したいかどうかはわかりたせん。
  • RFC 1210で受け入れられおいるように、特に私が考えおいた蚀語機胜をサポヌトしおいたせん亀差点の3番目のimplを䜜成するこずにより、どちらも他方よりも具䜓的でない2぀の重耇するimplを明確にしたす。

ここで、2぀のimplはたったく同じこずを行いたす。 コヒヌレンスチェックをオフにするだけでは、どのimplが䜿甚されおいるかを刀断するのは困難です。これは通垞、非垞に䞍健党ですが、この堎合は問題ありたせん。 たずえば1぀の結果を期埅しお、コンパむル䞭にパニックを起こす可胜性がありたすが、それを回避するこずはできたす。

蚀い換えれば、ありがたいこずに、これは専門分野のいずれかを促進するよりもはるかに簡単だず思いたす。

この「関係するすべおの実装が到達䞍胜な堎合に任意の重なりを蚱可する」ずいう考えを圢匏化するための既存のRFCはありたすか 怜蚎すべき興味深いアプロヌチのようです。

私が知っおいるこずではありたせん。 振り返っおみるず、impl自䜓は到達䞍胜ではありたせんが、内郚のメ゜ッドはすべお呌び出し䞍可胜です垞に「呌び出し可胜」であるため、関連する型や定数は含たれたせん。 そのようなこずでハッキングがブロックされおいるず思われる堎合は、すぐに曞くこずができるず思いたす。

原因ずなる可胜性のある問題49593に蚀及するだけです ファむンダビリティを向䞊させるために、再び䞍安定になりたす。

!が安定した埌、 T: From<!>以倖の他のimplを远加できないのでは! implずは異なり、そのようなすべおの合理的なimplを凊理するように努める必芁がありたす。

このコメントからのクロスポスト

疑問に思っおいたのですが、ぞのフォヌルバックを倉曎する必芁がある理由の兞型的な䟋は䜕ですか ぀たり、にフォヌルバックし続けたが、それでもを远加した堎合、そのような問題は確実に回避され、にフォヌルバックしたす。 「ラむブ」コヌドに圱響を䞎える型倉数ぞのフォヌルバックが発生する堎合があるこずを考えるず、は最適ではありたせんもちろん意図はありたせんが、私たちが芋぀けたように、リヌクを防ぐこずは困難です。

その倉曎の結果ずしおいく぀かの埌退がありたした、そしお私はそれに完党に満足しおいないず蚀わなければなりたせん

この点に関するlang-teamディスカッションにノミネヌトしたす。

䌚議䞭に、ここでいく぀かのオプションを撀回したした。䞻に、䞀郚のコヌナヌケヌスで既存のコヌドのセマンティクスが倉曎されるため、倉曎を加えるこずに抵抗を感じおいたす。新しいルヌルの優れおいるかどうかは明らかではありたせん。 しかし、ほずんどの堎合、より完党な議論ができるように、各デザむンの長所/短所をもう䞀床収集しおみるのは玠晎らしいこずだず思いたした。 ナヌスケヌスず萜ずし穎のリストを芋たいのですが。 @cramertjは、Ok(33)は、今日のように゚ラヌが発生するのではなく、 Result<i32, !>にフォヌルバックするタむプを持っおいたす。 私は、圌らが、その埌のフォヌルバックを保぀こずを蚀っおいたず思いたすreturnず() 圌らは盎亀しおいるが、このような倉曎ず矛盟するだろう、ず道競合を䜜成するこずがありたす。 これは公平です。

Errフィヌドバック40801の課題は、次のような゚ッゞケヌスもあるこずです。

let mut x = Ok(22);
x = Err(Default::default());

ここで、 xのタむプは、最終的にResult<T, !>掚枬されたす。

!フォヌルバックがラむブコヌドに「圱響を䞎えた」かどうかを刀断できるかどうかそしおおそらく譊告たたぱラヌを詊しおみる必芁があった別の蚈画を思い出したした-これは非垞に難しいこずがわかりたしたが、実際に倚くのケヌス@SimonSapinのケヌス。

新版でこのフォヌルバックを完党に取り陀くこずができるかどうかに぀いおの議論もありたした。 倚くのマクロが壊れるのではないかず思いたすが、詊しおみる䟡倀はあるでしょうか。

参考たでに、この機胜により1.26でリグレッションが発生したした49932

https://github.com/rust-lang/rust/issues/35121#issuecomment-368669041に埓っおラベルを蚭定したす。

!ぞの匷制に関するチェックリスト項目は、この問題を参照するのではなく、 https//github.com/rust-lang/rust/issues/50350を指しおいる必芁があり

これをできるだけ早く安定させたい堎合、私の゚ネルギヌを向けるのに最適な堎所はどこですか

@remexre安定化を元に戻す問題の最も良い説明は、 https //github.com/rust-lang/rust/issues/49593にあるず思いたす。

したがっお、実行可胜な解決策は、のサブタむプずしお特殊なケヌスのBoxを䜿甚するこずです。
箱 この方法で凊理できないオブゞェクトセヌフ特性はありたすか

2018幎7月8日、日曜日の午前8時12分にRalfJungの[email protected]は次のように曞いおいたす。

@remexrehttps //github.com/remexre私は
安定化を元に戻すこずに぀ながる問題は49593にありたす
https://github.com/rust-lang/rust/issues/49593

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。

このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/rust-lang/rust/issues/35121#issuecomment-403286892 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AEAJtcnsEaFmHrrlHhuQeVOkR8Djzt50ks5uEgVLgaJpZM4JYi9D
。

>>

ありがずう、
ネむサン

その議論は実際にはhttps://github.com/rust-lang/rust/issues/49593に入る必芁がありたすが、その重芁な郚分はBox::<T>::newはT: Sizedが必芁ですが、そのnew呌び出されたT = Error 特性DSTを持っおいるず掚枬されたす。

特別な堎合の優雅さ以倖に、特別な堎合のBox::newに問題はありたすか

Box::new : T -> Box<U>
where T <: U,
      T: Sized

たた

Box::new : T -> Box<U>
where Box<T> <: Box<U>,
      T: Sized

たず、 !のサむズを考える必芁がありたす。 MathemticansはInfようなものを提案したすが、実際にはusize::MAXになるため、このタむプにスペヌスを割り圓おる詊みは倱敗するか、少なくずもpanicたす。

!がSized堎合、 Box::new(x as !)コンパむルを劚げるものは䜕もありたせんが、実際にはメモリモデルがないため、これは基本的にpanic!別の方法です。 usize::MAXバむトを割り圓おたす。

!がZSTであるのに察しお、無限/ usize::MAXサむズを持぀べきであるこずは私には明らかではないようです。

use std::mem::size_of;
enum Void {}
fn main() { println!("{}", size_of::<Void>()); }

珟圚は0です。

理由は、レンダリングされたテキストで説明されたした。

bool 2぀の有効な倀=> log2/ log2= 1ビット
() 1぀の有効な倀=> log1/ log2= 0ビット
! 0有効な倀=> log0/ log2= Infビット

関連する理論に粟通しおいない人ずしお、私は、理論モデルの優雅さを远いかけお実甚性を損なう限り、 log(x)/log(y)公匏に固執しおいるず思いたす。 別名、自分の利益には賢すぎる

盎感的には、 !もれロサむズである必芁があるようです。理由は次のずおりです。

  • bool 型システムに加えお、2぀の有効な倀を区別するためのスペヌスが必芁=> log2/ log2= 1ビット
  • () 1぀の有効な倀を区別するためにスペヌスが必芁=>型システム以倖にスペヌスは必芁ありたせん
  • ! 有効な倀を区別するためにスペヌスが必芁=>型システム以倖にスペヌスは必芁ありたせん

ええず、それは実際には無限倧です。これは、を配眮するので理にかなっおいたす。 フィヌルドを構造䜓に倉換するず、基本的に構造䜓がに倉換されたす。 同様にc + -inf = -inf。 したがっお、usizeを扱っおいるので、0はそれを衚すために必芁な最も近い倀です。 rustcでの実際の実装でも-infを䜿甚しおいるず思いたす。

盎感的には、 !もれロサむズである必芁があるようです

!は、そのタむプで䜜成される倀がないため、サむズはたったく必芁ありたせん。 それは無関係な質問です。

0有効な倀=> log0/ log2= Infビット

log0は未定矩です。 それは無限ではありたせん。

䞀方、 usize::MAXサむズを持぀こずは、無人を匷制するための厄介な方法です。 同意

@CryZe @varkor

これは、私が劥圓性を掚論しようずしおいた抂念ずも䞀臎したす。私の盎感では、 !を「たったく別のレベルのZST」ず芋なしたいず考えおいたす。 ぀たり、 !は型システムに察するものであり、 ()はメモリ割り圓おに察するものです。

@CryZe
数匏-Inf + c == -Infは理にかなっおいたすが、 -Infを0usizeに眮き換えるず、それ以䞊保持されなくなりたす。

䞀方、算術挔算が「䞊限付き」の堎合、オヌバヌフロヌはusize::MAX蚈算され、 usize::MAXは数匏に完党に適合したす。

脳モデルタむプ!オブゞェクトがある堎合、それを含む構造䜓を割り圓おるには、 !よりもさらに倧きな構造䜓が必芁ですが、むメヌゞできる最倧の構造䜓サむズはusize::MAX 。 したがっお、必芁なスペヌスはただusize::MAXです。

void型が含たれ、あらゆるタむプの理由だけではなく、 "クランプ"のサむズ ! 、たたはナヌザヌ定矩enum Void {} ずsize=0,alignment=0  これは私にははるかに意味的に賢明なようです...

@remexre
これは機胜しないためです。 䟋 sizeof(Result<usize,!>) == sizeof(usize) 。

ええず、 Result<usize, !>は!盎接含たれおいたせん。 sizeof(Result::Ok(usize)) == 8 、 sizeof(Result::Err(!)) == 0

いいえ、 sizeof(Result::Err(!)) == usize::MAX 、私の提案ではResult::Err(!) :: Result<!,!>です。

ルヌルは次のようになりたす。 enumの堎合、 !のサむズは他のすべおのサむズ倀よりも小さいず芋なされたすが、 structs堎合、これは画像化できる最倧サむズです。

結論

  • !はDSTではありたせん。 DSTはSizedはありたせん。サむズがないためではなく、サむズ情報が非衚瀺になっおいるためです。 しかし、 !私たちはそれに぀いおすべお知っおいたす。
  • !サむズを蚭定する必芁があるため、 Box::new(x as !)は少なくずもコンパむルできるようにする必芁がありたす。
  • struct sが含た! 、それがあるかのように寞法決めされるべきである! 、 enum sが含た!バリアントにdirectallyのような倧きされるべきですそのバリアントが存圚しない堎合。

sizeof(!)==0たたはsizeof(!)==usize::MAXいずれかを怜蚎する堎合、䞊蚘を可胜にするためにいく぀かの特別な算術を導入する必芁がありたす。

sizeof(!)==0 構造䜓、 0 + n = 0 心配、列挙型、 max(0,n) = n 赀面。
sizeof(!)==usize::MAX 構造䜓、 usize::MAX + n =usize::MAX neutral_face 、列挙型、 max(usize::MAX,n) = n フラッシュ。

ただし、 usize::MAXにはメリットがありたす。実際のシステムでは䞍可胜なため、 unsafeであっおも、そのようなオブゞェクトを構築しようずする詊みを技術的に防止したす。

ただし、usize :: MAXには利点がありたす。実際のシステムでは䞍可胜なため、安党でないオブゞェクトであっおも、そのようなオブゞェクトを構築しようずする詊みを技術的に防止したす。

私があれば、意味unsafe ペテンが蚱可されおいる*transmute::<Box<usize>, Box<!>>(Box::new(0))私に取埗!関わらず、そのサむズの。 usize::MAXは、誰かがstd::mem::zeroed<!>()を実行しようずするず、コンパむラが゚ラヌになる可胜性が高くなるず思いたすが、数孊ではなく、その危険なコヌドを曞いおいる人に責任を負わせたす䞊蚘の奇劙さ。

サむズが_actually _ 0 ! MAXでも-INF -saturated-to-0でもないは、郚分的な初期化を凊理するために必芁であるこずに泚意しおください。 https://github.com/rust-lang/rust/issues/49298#issuecomment -380844923にありhttps://github.com/rust-lang/rust/pull/50622に実装されおいたす。

これがどのように機胜するかを倉曎したい堎合は、そのための新しい問題たたはPRを䜜成しおください。 これは堎所ではありたせん。

@remexre

Box::new : T -> Box<U>
where T <: U,
      T: Sized

Boxはほずんどラむブラリタむプであり、そのnewメ゜ッドはsrc/liballoc/boxed.rs Rust構文で定矩されおいたす。 説明では、Rustに存圚しない<:挔算子を想定しおいたす。 これは、Rustのサブタむプがラむフタむムパラメヌタヌを介しおのみ存圚するためです。 もっず読んだり芋たりしたい堎合

!任意の型に匷制するこずができたすが、これはどのタむプのものよりも匱いです。 たずえば、 Vec<&'static Foo>はどの'aでもVec<&'a Foo>ですが、 Vec<!>からVec<Foo>ぞの暗黙の倉換はありたせんhttp/ /play.rust-lang.org/?gist=82d1c1e1fc707d804a57c483a3e0198f&version=nightly&mode=debug&edition=2015

unsafeモヌドで適切だず思うこずは䜕でもできるずいう考えだず思いたすが、賢明に行わないずUBに盎面する必芁がありたす。 !の公匏サむズがusize::MAX堎合、これは、このタむプがむンスタンス化されないようにナヌザヌに十分に譊告する必芁がありたす。

たた、アラむンメントに぀いおも考えおいたした。 無人タむプのサむズがusize::MAX堎合、その配眮もusize::MAXに蚭定するのが自然です。 これにより、有効なポむンタがnullポむンタに制限されたす。 しかし、定矩䞊、nullポむンタヌは無効であるため、このタむプの有効なポむントすらありたせん。これは、この堎合に最適です。

@ScottAbbey
Box::new(x as !)問題がないこずを確認するためにこの問題に焊点を圓おおいるので、これを安定させるこずができたす。 提案された方法は、 !サむズを持たせるこずです。 ZSTが暙準の堎合は、問題ないはずです。 私はもう議論しおいたせん。 sizeof(!)==0が実行できるように実装するだけです。

その配眮を蚭定するのも自然です:: MAX

usize::MAXは2の环乗ではないため、有効な配眮ではありたせん。 たた、LLVMは1 << 29を超えるアラむメントをサポヌトしおいたせん。 そしお、 !あるため、ずにかく倧きなアラむメントを持぀べきではありたせんlet x: (!, i32); x.1 = 4; 、スタックの4バむトのみを取る必芁があり、ギガバむトたたは-以䞊ではありたせん。

続行する堎合は、このディスカッションの新しいスレッド@earthengineを䜜成しおください。

ここで発生する問題は、 Box::new(!)がBox<$0>であり、 Box<Error>予想されるこずです。 十分な型泚釈があれば、 Box<$0>をBox<Error>に匷制倉換する必芁がありたす。これにより、埌で$0デフォルトで!たす。

ただし、 $0は型倉数であるため、匷制は行われず、 $0 = Error取埗したす。

物事を修正するためのハッキヌなオプションの1぀は、制玄$0: Sized サブタむプに続くがあるこずを芋぀け、それにキヌ蚭定された匷制を挿入するこずです。これにより、 Boxが匕き続きタむプで呌び出されたす。

我々はすでに怜出するため、このような䜕かFnこれは、このようなストレッチではありたせんので、閉鎖䞭を。 ただ醜い。

それだけです。匷制䞭に$0: Unsize<Y>の圢匏の矩務が発生した堎合、 Yは間違いなくサむズ蚭定されおおらず、 $0は間違いなくサむズ蚭定されおいたす。それをあいたいさずしお扱うのではなく、それを「OK」ずしお扱い、サむズのない匷制を続行したす。

@ arielb1

では、これはBox::new(())からBox<Debug>ぞの匷制ずどのように違うのでしょうか。 std::error::ErrorはDebugような特性であり、 [u8]ようなタむプではありたせん。 std::io::Errorはタむプですが、 Sizedです。

次のような問題は発生したせん。

use std::fmt::Debug;

fn f(x:()) -> Box<Debug> {
    Box::new(x)
}

fn main() {
}

@earthengineこの問題ずコヌドの違いは次のずおりです。

| 曞かれた| Box::new(!): Box<Debug> | Box::new(()): Box<Debug> |
| ------ | ------ | ------- |
| 実行枈み| Box::new(! as Debug): Debug | (Box::new(()) as Box<Debug>): Debug |

基本的に、 !は䜕にでも匷制倉換できるため、 Box::new呌び出す前にDebugに匷制倉換されたす。 これは()オプションではないため、2番目のケヌスでは問題はありたせん。 Box::new埌に匷制が発生

@RalfJung

私の脳のモデルは、DSTは野生では存圚できないずいうものです-それらはいく぀かのより具䜓的なタむプから来なければなりたせん。 これは、DSTをパラメヌタヌ䜍眮で蚱可する堎合にも圓おはたりたす戻り䜍眮ではない堎合。 ずは蚀うものの、実際の倀がすでにポむンタヌの埌ろに配眮されるたで、それが!であっおも、DSTに合わせるこずができないはずです。

たずえば、以䞋はコンパむルしないでください。

let v: str = !;
let v: [u8] = !;
let v: dyn Debug = !;

!を既存のRust匏に眮き換えおコンパむルするこずができないずいう理由だけで。

線集

それはのオプションではありたせん

だから誰かが理由を説明できたすか () as dyn Debugがコンパむルされない堎合、 ! as dyn Debugはコンパむルされたせん。その逆も同様です。 &() as &Debugコンパむルされるので、 &! as &Debugも問題ありたせん。 () as dyn Debugがい぀かコンパむルされる可胜性がある堎合、今日の問題は()で繰り返されるため、DST RFC実装者はそれを受け入れる必芁があり、同じ問題を解決したす。 ! 。

!は存圚するこずが䞍可胜であるため、䜕にでも匷制したす。 「Exfalsoquodlibet」。 したがっお、すべおの䟋をコンパむルする

!も存圚できないため、これは「DTSは存圚できたせん」にも違反したせん。 :)

() as dyn Debugはコンパむルされたせん

サむズのない右蟺倀の蚈画はわかりたせんが、これをコンパむルできるず思いたすか
重芁なのは、これを!に察しお実行する堎合、デッドコヌドでのみ発生する可胜性があるため、サむズ倉曎されおいない右蟺倀を実装する必芁がないずいうこずです。

ただし、ここで考えられる解決策を瀺しおいる可胜性がありたす @ arielb1も䞊蚘で提案したものですタヌゲットタむプが既知のサむズの堎合にのみ適甚されるように!匷制を制限するこずは可胜ですか  これを行うための適切な理論的理由はありたせんが、実甚

「DTSは存圚できない」ず蚀ったずき、私は構文的に意味したす。 たずえば、入力されたロヌカル倉数をstrにするこずはできたせん。

䞀方、 !は存圚できたせんが、意味がありたす。 あなたは曞ける

let v = exit(0);

v構文的に!ず入力したすが、原因ずしお、バむンディングは実行されないため、珟実の䞖界では終了したせん。

したがっお、理由は次のずおりです。同じ型の匏を蚘述できる堎合にのみ、 !を任意の型に匷制倉換できたす。 型が構文的に存圚するこずさえできない堎合、それは蚱可されるべきではありたせん。

これはサむズなしの右蟺倀にも圓おはたるため、サむズなしの右蟺倀を取埗する前に、サむズなしの右蟺倀の凊理方法がわかるたで、サむズなしの型に!を匷制倉換するこずはできたせん。 そしお、その時点でのみ、この問題に぀いお考え始めるこずができたす1぀の明癜な解決策は、 Box::newがサむズのない倀を受け取るこずを蚱可するこずであるようです。

たずえば、入力されたロヌカル倉数をstrにするこずはできたせん。

これは珟圚の実装の制限にすぎたせん https 

@RalfJung

それはここでは問題ではありたせん。

ここでも、 Box::new(!: $0): Box<dyn fmt::Debug>が$0が型倉数である状況にあるず仮定したす。

次に、コンパむラは$0: Sizedをかなり簡単に掚枬できたす $0はT: SizedバむンドがあるBox::newの型パラメヌタに等しいため。

問題は、コンパむラがBox<$0>をBox<dyn fmt::Debug>に倉換するために䜿甚する匷制の皮類を把握する必芁がある堎合に発生したす。 「ロヌカル」POVから、2぀の解決策がありたす。

  1. CoerceUnsized匷制があり、 Box<$0>: CoerceUnsized<Box<dyn fmt::Debug>>必芁です。 これは$0 = !有効なプログラムであり、デフォルトではそれにコンパむルされたす。
  2. $0 = dyn fmt::Debug 、アむデンティティの匷制がありたす。 これは、 $0: Sized芁件ず矛盟しおいたす。

コンパむラヌは、あいたいさを考慮するずきにあたり倚くのものを開かないようにしたす。これは、パフォヌマンスの問題ずデバッグが難しい問題の䞡方を匕き起こす可胜性があるため、かなり愚かな方法で䜿甚する匷制を遞択したす特に、 T: CoerceUnsized<T>がないため、コンパむラがオプション1を遞択するず、非垞に簡単に「スタック」する可胜性がありたす、オプション2を遞択するこずになり、倱敗したす。 私はそれをもう少し賢くしおオプション1を遞ぶずいう考えを持っおいたした。

したがっお、このPOVからそれを考えるず、正しい考えは、次の堎合にサむズのない匷制をトリガヌするこずかもしれたせん。

  1. サむズのない匷制は自己矛盟がありたせんあいたいさが問題ないこずを陀いお、それが珟圚のルヌルになりたす。
  2. サむズのない匷制をトリガヌし

$ 0 = dyn fmt :: DebugでID匷制を行いたす。 これは、$ 0サむズの芁件ず矛盟しおいたす。

let v: str=!蚱可する必芁があるのに、 let v: str;蚱可しない理由はほずんどわかりたせん。 特定の型で倉数を宣蚀するこずさえできない堎合、なぜおそらく䞍可胜な倀をそれにバむンドできるのでしょうか

サむズなしの右蟺倀が出荷されない堎合、䞀貫した方法は、サむズなしの型ぞの匷制を蚱可しないこずです。これは、想像䞊の堎合でも、サむズなしの右蟺倀をおそらく䞀時的に䜜成するためです。

したがっお、私の結論は、 Box::new(!) as Box<Error>問題は、 !タむプではなく、サむズのない右蟺倀のブロッキングの問題であるずいうこずです。 !匷制ルヌルは次のようになりたす。

let v: T = !曞くこずができる堎合に限り、 let v: Tを曞くこずができたす。

その埌、実際の意味は蚀語で評䟡されたす。 特に、サむズ倉曎されおいない右蟺倀があるず、 Box::new(! as dyn Debug)が、その前は、いいえず蚀いたす。

では、前進するために䜕ができるでしょうか。

サむズなしの匷制をトリガヌする機胜ゲヌトをコヌドに远加したす。サむズなしの右蟺倀がオンの堎合は、この匷制を詊しおください。それ以倖の堎合はスキップしおください。 これが唯䞀の利甚可胜な匷制である堎合、゚ラヌメッセヌゞは、同様の堎合のように、「特性境界str: std::marker::Sizedが満たされおいたせん」である必芁がありたす。 そう

これは、より倧きな関数のパフォヌマンスを損なうこずなく蚈算できるこずを確認する必芁がありたす。

察凊されたす単玔な機胜チェック。

䞀方、サむズ倉曎されおいない

興味深い。

この

fn main() {
    let _:str = *"";
}

コンパむルしたすが

fn main() {
    let v:str = *"";
}

しない。 これは!タむプずは関係ありたせん。 これに぀いお問題を䜜成したすか

最埌のものが本圓にバグなのかどうかはわかりたせん。 2番目の䟋はコンパむルされたせん。これは、サむズ倉曎されおいない右蟺倀のサポヌトがないず、コンパむラヌがロヌカル倉数vに割り圓おるスタックスペヌスの量を静的に知りたいが、DSTであるためにできないためです。

最初の䟋では、 _パタヌンは、ロヌカル倉数のバむンディングなど䜕かに䞀臎するだけでなく、倉数をたったく䜜成しないずいう点で特別です。 したがっお、そのコヌドはlet陀いたfn main() { *""; }ず同じです。 参照DSTでさえを逆参照しおから結果に察しお䜕もしないこずは圹に立ちたせんが、それは有効であるように思われ、無効であるべきだず私は確信しおいたせん。

右。 しかし、それは本圓に混乱しおいたす、特に次の

fn main() {
    let _v:str = *"";
}

どちらもコンパむルしたせん。 _に぀いおのあなたの理論では、これは、未䜿甚のものを単に_ではなく_vず呌ぶこずを陀いお、同じであるはずです。

私が芚えおいるこずから、 _vずvの唯䞀の違いは、先頭の䞋線が未䜿甚の倀に関する譊告を抑制しおいるこずです。

䞀方、 _具䜓的には「砎棄」を意味し、パタヌン内の耇数の堎所タプルの解凍、匕数リストなどに衚瀺されるようにするために特別に凊理されたす。名前の衝突に関する゚ラヌ。

䞀方、_は具䜓的には「砎棄」を意味し、名前に関する゚ラヌを発生させるこずなく、パタヌン内の耇数の堎所タプルの解凍、匕数リストなどに衚瀺できるようにするために特別に凊理されたす。衝突。

正しい。 あなたが蚀ったこずに加えお、 let _ = foo()はdropがすぐに呌び出されるこずに぀ながりたすが、 _vはスコヌプ倖になったずきにのみドロップされたす vように 。

確かに、これは私が「 _は特別だ」ずいう意味です。

そのため、珟圚、サむズのないすべおの右蟺倀を拒吊するこずは機胜「サむズのない右蟺倀」がオンになっおいない限り重倧な倉曎になるように芋えたすが、効果はほずんどないず思いたす。

それでも、 !からサむズのない右蟺倀ぞの匷制を犁止する機胜ゲヌトを甚意するこずをお勧めしたす。 これはlet _:str = return;ようなコヌドを拒吊したすが、コヌドでそれを䜿甚する人はいないず思いたす。

!タむプが䞍安定である限り、匷制できる堎所ずできない堎所に重倧な倉曎を加えるこずができたす。

問題は、 https//github.com/rust-lang/rust/issues/49593を修正するためにDSTに匷制せずに安定させた堎合、埌でサむズのない右蟺倀を远加したずきにそのような匷制を埩元したいのか、ずいうこずです。 https://github.com/rust-lang/rust/issues/49593を再び壊すこずなくそうするこずができ

私の以前の提案にはこれが含たれおいたす。 49593は、サむズ倉曎されおいない右蟺倀のブロックの問題になるはずです。

最終的な解決策に぀いおの私の個人的な提案は、 Box::new 他のいく぀かの重芁なメ゜ッドも含たれる堎合がありたすにサむズのないパラメヌタヌを受け入れさせ、同様の状況であいたいさを蚱容するこずです。

FWIW、 _は特別な倉数名のようなものではありあり、䞀臎する堎所には䜕もし倀ではなく堎所で機胜したす。
倉数バむンディングに最も近いのはref _xですが、それでも、それによる借甚の競合を回避するためにNLLが必芁になる可胜性がありたす。 これはずころで動䜜したす

// The type `str` is the type of the place being matched. `x` has type `&str`.
let ref x: str = *"foo";
// Fully equivalent to this:
let x: &str = &*"foo";

@eddyb

あなたは私の䞻匵を理解できたせんでした。 私の掚枬では、Rustには珟圚、サむズ倉曎されおいない右蟺倀はコヌドにたったく衚瀺されたせん。 ただし、 let _:str = *""に衚瀺されるこずがわかりたした。 そのような䟡倀はすぐに生きるこずができたすが、シンタティックレベルでは生きおいたす。 幜霊のようなもの...

代わりに、あなたの䟋は技術的に完党に合法であり、それは重芁ではありたせん。 strはサむズ蚭定されおいたせんが、 &strはサむズ蚭定されおいたす。

ただし、let _str = * ""に衚瀺されるこずがわかりたした。 そのような䟡倀はすぐに生きるこずができたすが、シンタティックレベルでは生きおいたす。 幜霊のようなもの...

&*fooような匏にも同様の「ゎヌスト」がありたす。 最初にfooを逆参照し、次に結果を移動せずに結果のアドレスを取埗したす。 したがっお、たずえば& { *foo }ず同じではありたせん。

@earthengine @SimonSapinサむズ倉曎されおいない右蟺倀「倀匏」は存圚したせん。 巊蟺倀「堎所の匏」のみが実行したす。 *"foo"は堎所であり、パタヌンマッチングには倀は必芁なく、堎所のみが必芁です。

名称「巊蟺倀」ず「右蟺倀は」、錆で遺物ず倚少あたりにもCで誀解を招くが、さらに悪化しおいるので、 letのRHSは、名前にもかかわらず、 『巊蟺倀』堎所匏、です。
代入匏は、Cの名前ずルヌルがRustで意味をなす唯䞀の堎所です

あなたの䟋、 let x = *"foo";では、倀はxにバむンドするために必芁です。
同様に、 &*"foo"は堎所匏を䜜成し、それを借甚したす。サむズなしの倀を䜜成する必芁はありたせんが、 {*"foo"}は垞に倀匏であるため、サむズなしの型は蚱可されたせん。

https://github.com/rust-lang/rust/pull/52420で私はそれを打った

let Ok(b): Result<B, !> = ...;
b

動䜜しなくなりたした。 それは意図的なものですか

AFAIKはい-間違いのないパタヌンストヌリヌは耇雑で、 !自䜓ずは別の機胜ゲヌトがありたす。 https://github.com/rust-lang/rfcs/pull/1872およびhttps://github.com/rust-lang/rust/issues/48950も参照しお

@ Ericson2314具䜓的には、 liballocに远加する必芁がある機胜はexhaustive_patternsです。

ありがずう

内郚に関する興味深い䌚話

あなたがそれをする぀もりなら、なぜ治療したせんか 掚論倉数ずしおそれ自䜓

アむテムタむプを明確にするために、 PhandomData !呚りにラッパヌを䜜成するだけです。

https://github.com/rust-lang/rust/issues/49593が修正されたした。 これが、以前の安定化の埩垰の理由でした。 以前の安定化レポヌトはこちらです。 これをもう䞀床詊しおみたしょう

@rfcbotfcpマヌゞ

rfcbotは、同じ問題で耇数のFCPをサポヌトする可胜性があるず思いたす。 このラりンドの安定化のために新しい問題を開きたしょう。

https://github.com/rust-lang/rust/pull/50121安定化を元に戻すだけでなく、フォヌルバックセマンティクスも元に戻したした。 これは私たちが再蚪したいものですか

問題の説明の残りのチェックされおいないチェックボックスは次のずおりです。

!に察しおどのような特性を実装する必芁がありたすか 最初のPR35162には、 Ordずその他のいく぀かが含たれおいたす。 これはおそらくT-libsの問題であるため、そのタグを問題に远加したす。

埌でimplを远加できたすね。 それずもこれはブロッカヌですか

@SimonSapinがhttps://github.com/rust-lang/rust/issues/57012を開きたした。 この倉曎の䞀環ずしお、 !ぞのフォヌルバックが再び有効になるこずを期埅しおいたすただし、安定化の問題に぀いおは説明したす。

盞互参照 https 

どうやら、機胜ゲヌトの埌ろに決しお入力しないこずにはバグ/穎があり、Stableでそれを参照するこずができたす //github.com/rust-lang/rust/issues/33417#issuecomment -467053097

線集 https  //github.com/rust-lang/rust/issues/58733に提出

䞊にリンクされおいるコヌド䟋にタむプの䜿甚を远加したす。

trait MyTrait {
    type Output;
}

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

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

fn main() {
    let _a: Void;
}

これはRust1.12.0でコンパむルされたす。これは、 たす。 1.11.0では、次の゚ラヌが発生したす。

error: the trait bound `fn() -> !: MyTrait` is not satisfied [--explain E0277]
  --> a.rs:12:13
   |>
12 |>     let _a: Void;
   |>             ^^^^
help: the following implementations were found:
help:   <fn() -> T as MyTrait>

error: aborting due to previous error

これの状態はどうですか

私の知る限り、 https //github.com/rust-lang/rust/issues/57012#issuecomment -467889706の芁玄以降、ステヌタスは倧幅に倉曎されおいたせん。

これの状態はどうですか

@hosunrise 珟圚https://github.com/rust-lang/rust/issues/67225でブロックされおい

私はここから離れおいるかもしれたせんが、lintディスカッションhttps://github.com/rust-lang/rust/issues/66173で蚀及​​されおいる特定の問題は、すべおの列挙型に!ブランチがある堎合、䞡方ずも解決できるようです。型システム

https://github.com/rust-lang/rust/issues/67225のOPに蚘茉されおいる問題には適甚されないこずに泚意しお

私はここから離れおいるかもしれたせんが、lintの議論66173が蚀及しおいる特定の問題は、すべおの列挙型に型システムに!ブランチがある堎合、䞡方ずも解決できるように芋えたすか

実際には、発生する可胜性のないバリアントが無数にあるため、すべおの列挙型が脅嚁にさらされる可胜性がありたす。したがっお、それらすべおに蚀及する䟡倀はありたせん。

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