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 ! 잊얎버늬고 엎거형만 볎섞요.

두 가지 변형읎 있는 엎거형읎 있는 겜우 두 가지 겜우와 음치시킬 수 있습니닀.

enum Foo {
    Flim,
    Flam,
}

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

읎것은 2개가 아닌 몚든 n에 대핮 작동합니닀. 따띌서 변형읎 없는 엎거형읎 있는 겜우 쌀읎슀가 없는 엎거형곌 음치시킬 수 있습니닀.

enum Void {
}

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

여태까지는 귞런대로 잘됐닀. 하지만 쀑첩된 팚턎에 대핮 음치시킀렀고 하멎 ì–Žë–€ 음읎 발생하는지 볎십시였. 닀음은 Result 낎부의 두 가지 변형 엎거형에 대한 음치입니닀.

enum Foo {
    Flim,
    Flam,
}

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

왞부 팹턮 낎부에 낎부 팚턎을 확장할 수 있습니닀. 두 개의 Foo 변형읎 있윌므로 Err 대한 두 가지 겜우가 있습니닀. Result 및 Foo 에서 음치시킀Ʞ 위핎 별도의 음치 묞읎 필요하지 않습니닀. 읎것은 여러 변형읎 있는 엎거형에 대핮 작동합니닀... _0 제왞_.

enum Void {
}

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

왜 읎것읎 작동하지 ì•Šì•„ì•Œ 합니까? 나는 읎것을 수정읎띌고 부륎지 않고 묎읞 유형에 대한 "특별 지원"을 추가하는 것을 불음치 수정읎띌고 부늅니닀.

몚든 259 댓Ꞁ

후자!

여Ʞ에 대한 WIP 구현읎 있습니닀. https://github.com/canndrew/rust/tree/bang_type_coerced

현재 상태는 old-trans로 빌드되고 사용 가능하지만 몇 가지 테슀튞에 싀팚했습니닀. 음부 테슀튞는 if (return) {} 와 같은 윔드가 튞랜잭션 쀑에 충돌을 음윌킀는 버귞로 읞핎 싀팚합니닀. 닀륞 테슀튞는 링크 시간 최적화와 ꎀ렚읎 있윌며 항상 버귞가 있얎서 변겜 사항곌 ꎀ렚읎 있는지 몚륎겠습니닀.

현재 로드맵은 닀음곌 같습니닀.

  • MIR곌 핚께 작동시킀십시였. 읎것읎 ë‚Žê°€ 구현을 시작한 방법읎므로 너묎 얎렵지는 않지만 컎파음하는 동안 MIR읎 segfault륌 빌드하는 묞제가 있었습니닀.
  • 컎파음러( FnOutput , FnDiverging 및 ꎀ렚 항목)에서 사용되지 않는 분Ʞ 항목을 제거합니닀.
  • Ʞ능 게읎튞 뒀에 새 유형을 숚깁니닀. 읎는 Ʞ능읎 비활성화된 겜우 닀음을 의믞합니닀.

    • ! 는 반환 위치에서 유형윌로만 구묞 분석될 수 있습니닀.

    • 분Ʞ형 변수의 Ʞ볞값은 () 입니닀.

  • Ʞ볞 () 가 튞레잇을 핎결하는 데 사용되었을 때 혞환성 겜고륌 발생시킀는 방법을 알아볎섞요. 읎륌 수행하는 한 가지 방법은 DefaultedUnit 띌는 새 유형을 AST에 추가하는 것입니닀. 읎 유형은 () 처럌 작동하며 ì–Žë–€ 상황에서는 () 로 바뀌지만 특성을 í•Žê²°í•  때 겜고륌 발생시킵니닀( () ). 읎 ì ‘ê·Œ 방식의 묞제는 구현 시 몚든 버귞륌 포착하고 수정하는 것읎 얎렀욞 것읎띌고 생각합니닀. 윔드가 깚지는 것을 방지하Ʞ 위핎 사람듀의 윔드륌 깚뜚늬게 될 것입니닀.

읎 목록에 추가핎알 할 사항읎 있습니까? 저만 읎 음을 하고 있는 걎가요? 귞늬고 읎 람랜치륌 메읞 늬포지토늬로 옮겚알 합니까?

Ʞ볞 () 가 튞레잇을 핎결하는 데 사용될 때 혞환성 겜고륌 발생시킀는 방법을 알아볎섞요. 읎륌 수행하는 한 가지 방법은 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://github.com/rust-lang/rfcs/pull/1637

묞제는 ! 가 Trait 륌 구현하는 겜우 !Trait 도 구현핎알 한닀는 것입니닀.

묞제는 만앜 ! Trait을 구현합니닀. !Trait도 구현핎알 합니닀.

귞런 닀음 특성 요구 사항을 묎시하도록 특수 쌀읎슀 ! ?

@tomaka ! 은 특성읎 정적 메서드 및 ꎀ렚 유형/상수륌 가질 수 있Ʞ 때묞에 _all_ 특성을 자동윌로 구현할 수 없습니닀. 비정적 메서드(예: Self 을 사용하는 메서드)만 있는 특성을 자동윌로 구현할 수 있습니닀.

!Trait ꎀ핎서는 누군가 ! 가 Trait _and_ !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 )읎며 아마도 하나 또는 두 개 더 있을 것입니닀. 읎것읎 요구되는 데에는 대부분 합당한 읎유가 있습니닀. 음반적윌로 말하자멎, 진행핎알 할 여러 가지 방법읎 있윌며 ì–Žë–€ 방법을 택할지 몚륎멎 진행할 수 없습니닀. (잠재적윌로 윔드륌 늬팩토링하여 읎러한 요구가 음종의 "볎류 의묎"로 등록될 수 있지만 귞렇게 하는 것은 복잡합니닀.)

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 ë„€, 위에 나엎된 버귞 쀑 하나입니닀.

@lfairy 웁슀 , 상닚 첎크박슀에 나엎되지 않아서 못

From<!> for T 및 Add<T> for ! ( ! 의 출력 유형 사용)을 구현할 계획읎 있습니까? 정말 읎상하게 구첎적읞 요청읎띌는 것을 압니닀. 읎 PR 에서 둘 ë‹€ 사용하렀고 합니닀.

From<!> for T 확싀히. Add<T> for ! 는 아마도 libs 팀읎 결정할 음읎지만 개읞적윌로 ! 는 녌늬적읎고 표쀀적읞 구현읎 있는 몚든 특성을 구현핎알 한닀고 생각합니닀.

@canndrew 감사합니닀! 나는 몚든 유형의 하위 유형읞 슀칌띌의 Nothing 특성에 익숙하므로 값읎 나타날 수 있는 거의 몚든 곳에서 사용할 수 있습니닀. 귞러나 impl All for ! 또는 읎와 유사한 것읎 특히 부정적읞 특성 겜계와 ꎀ렚하여 Rust의 유형 시슀템에 믞치는 영향을 읎핎하렀는 엎망에는 확싀히 공감합니닀.

https://github.com/rust-lang/rfcs/issues/1723#issuecomment -241595070 From<!> for T 에 음ꎀ성 묞제가 있습니닀.

아 맞닀. 읎에 대핮 조치륌 ì·ší•Žì•Œ 합니닀.

특성 impls가 닀륞 특성 impls에 의핎 재정의됚을 명시적윌로 명시할 수 있닀멎 좋을 것입니닀. 닀음곌 같은 것:

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

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

읎거 전묞화 안되나요? 펞집 : 읎것읎 격자 impl 규칙읎띌고 생각합니닀.

묎읞도에 대한 특별지원을 최대한 플하는 것읎 가능한 대안읞가?

읎 몚든 match (res: Res<A, !>) { Ok(a) /* No Err */ } , Result 대한 특수 메서드 는 Ʞ능을 위한 Ʞ능처럌 맀우 고안된 것처럌 볎읎며 녞력곌 복잡성에 대한 가치가 없는 것 같습니닀.
! 가 @canndrew 의 애완용 Ʞ능읎띌는 것을 읎핎하고 귞는 더 개발하Ʞ륌 원하지만 처음부터 잘못된 방향윌로 가고 #12609는 버귞도 아닙니닀.

@petrochenkov #12609는 Never 유형의 특수 Ʞ능읎 아닙니닀. 분명히 도달할 수 없는 음부 윔드륌 감지하Ʞ 위한 버귞 수정입니닀.

@petrochenkov ! 잊얎버늬고 엎거형만 볎섞요.

두 가지 변형읎 있는 엎거형읎 있는 겜우 두 가지 겜우와 음치시킬 수 있습니닀.

enum Foo {
    Flim,
    Flam,
}

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

읎것은 2개가 아닌 몚든 n에 대핮 작동합니닀. 따띌서 변형읎 없는 엎거형읎 있는 겜우 쌀읎슀가 없는 엎거형곌 음치시킬 수 있습니닀.

enum Void {
}

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

여태까지는 귞런대로 잘됐닀. 하지만 쀑첩된 팚턎에 대핮 음치시킀렀고 하멎 ì–Žë–€ 음읎 발생하는지 볎십시였. 닀음은 Result 낎부의 두 가지 변형 엎거형에 대한 음치입니닀.

enum Foo {
    Flim,
    Flam,
}

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

왞부 팹턮 낎부에 낎부 팚턎을 확장할 수 있습니닀. 두 개의 Foo 변형읎 있윌므로 Err 대한 두 가지 겜우가 있습니닀. Result 및 Foo 에서 음치시킀Ʞ 위핎 별도의 음치 묞읎 필요하지 않습니닀. 읎것은 여러 변형읎 있는 엎거형에 대핮 작동합니닀... _0 제왞_.

enum Void {
}

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

왜 읎것읎 작동하지 ì•Šì•„ì•Œ 합니까? 나는 읎것을 수정읎띌고 부륎지 않고 묎읞 유형에 대한 "특별 지원"을 추가하는 것을 불음치 수정읎띌고 부늅니닀.

@petrochenkov 아마도 당신읎 말한 것을 였핎했을 것입니닀. #12609 슀레드에서 녌의된 두 가지 질묞읎 있습니닀.

(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), 슉, 도달할 수 없는 팚턎을 볎푞띌Ʞ(lint)로 만드는 것읎 합늬적음 수 있윌며, 거죌하지 않는 유형에 ꎀ계없읎 하드 였류가 아닙니닀. RFC 1445 에는 읎것읎 왜 유용할 수 있는지에 대한 더 많은 예가 포핚되얎 있습니닀.

(0)에 ꎀ핎서 나는 당신의 섀명에 닀소 확신읎 있습니닀. 읎 첎계가 컎파음러의 팹턮 검사 구현에 자연슀럜게 놓여 있고 추가하는 것볎닀 더 많은 특수 윔드륌 제거한닀멎 나는 완전히 Ʞ쁠 것입니닀.

귞걎 귞렇고, 나는 여Ʞ에서 (0)을 수정하Ʞ 위핎 PR을 했습니닀: https://github.com/rust-lang/rust/pull/36476

읎 첎계가 컎파음러의 팹턮 검사 구현에 자연슀럜게 놓여 있고 추가하는 것볎닀 더 많은 특수 윔드륌 제거한닀멎 나는 완전히 Ʞ쁠 것입니닀.

읎상하게도 귞렇지 않습니닀. 귞러나 귞것은 아마도 우아한 방법읎 없Ʞ볎닀는 êž°ì¡Ž 윔드에 핎킹한 방식의 읞공묌음 것입니닀.

맀크로의 겜우 (1)읎 얎렀욎 였류가 아닌 것읎 유용하닀고 생각합니닀.

(1) Ʞ볞적윌로 컎파음되얎알 하지만 닀음곌 같은 늰튞에서 겜고륌 제공핎알 한닀고 생각합니닀.

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 유형(또는 유형 읎론의 "0" 유형)곌 동음하닀고 생각하는 아읎디얎에 반대합니닀. 둘 ë‹€ 가치나 사례륌 가질 수는 없지만 서로 닀륞 생묌입니닀.

낮 생각에 맚 아래 유형은 반환 유형을 나타낮는 몚든 컚텍슀튞에서만 나타날 수 있습니닀. 예륌 듀얎,

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 두 종류의 거죌할 수 없는 유형 사읎에 읎러한 구분을 도입하는 것(낮 눈에는 완전히 읞공적읞)의 읎점은 묎엇입니까?

읎러한 구분읎 없는 많은 읎유가 제Ʞ되었습니닀. 예륌 듀얎 Result<!, E> 륌 작성할 수 있고, 읎것읎 분Ʞ 핚수와 원활하게 상혞 작용하멎서 Result 에 대한 몚나딕 연산을 계속 사용할 수 있습니닀 map 및 map_err .

핚수형 프로귞래밍에서 빈 유형( zero )은 핚수가 반환하지 않거나 값읎 졎재하지 않는닀는 사싀을 읞윔딩하는 데 자죌 사용됩니닀. bottom 유형읎띌고 하멎 유형 읎론의 ì–Žë–€ 개념을 말하는지 명확하지 않습니닀. 음반적윌로 bottom 는 몚든 유형의 하위 유형읞 유형의 읎늄입니닀. 귞러나 귞런 의믞에서 ! 아닌 bottom 가 아닙니닀. 귞러나 닀시 zero 가 bottom 유형읎 아닌 것은 유형 읎론에서 드묞 음읎 아닙니닀.

슉, ! 와 Empty 사읎에는 귌볞적읞 찚읎가 있습니닀. ! 유형의 변수륌 ì„ ì–ží•  수 없지만 Empty 대핎서는 귞렇게 할 수 있습니닀. .

읎것읎 읎 RFC가 수정하고 있는 것입니닀. ! 는 유형처럌 사용할 수 없닀멎 싀제로 "유형"읎 아닙니닀.

@RalfJung
읎러한 개념은 선형 녌늬 https://en.wikipedia.org/wiki/Linear_logic 에서 가젞옚 것입니닀.

읎 Ꞁ의 읎전 Ꞁ에 였타가 있얎 삭제했습니닀. ë‚Žê°€ 귞것을 얻윌멎 읎것을 업데읎튞 할 것입니닀.

top 는 가능한 몚든 방법윌로 사용할 수 있는 값입니닀.

서람타읎핑에서 읎것은 묎엇을 의믞합니까? 귞것은 ì–Žë–€ 유형읎 될 수 있습니까? 왜냐하멎 귞것은 bottom 읎Ʞ 때묞입니닀.

@eddyb 제가 싀수륌 했습니닀. 새로욎 업데읎튞륌 Ʞ닀렀죌섞요.

하룚 만에 병합된 읎 PR 은 한 달 넘게 검토 쀑읞 낮 팹턮 음치 PR 곌 맀우 심하게 충돌합니닀. 죄송합니닀 . 첫 번짞 팹턮 음치 PR 읎후로

ffs 녀석듀

@canndrew argh , 죄송합니닀. =(였늘도 당신의 PR을 r+할 계획읎었는데...

죄송합니닀. 징징거늬고 싶지는 않지만 읎 음읎 계속되고 있습니닀. 한 번에 여러 PR을 유지하는 것을 포Ʞ했고 지ꞈ은 9월부터 읎 한 가지 변겜 사항을 적용하렀고 녞력하고 있습니닀. 묞제의 음부는 시간대의 찚읎띌고 생각합니닀. 제가 칚대에 누워 있는 동안에는 몚두 옚띌읞 상태읎므로 읎 묞제에 대핮 읎알Ʞ하Ʞ가 얎렵습니닀.

예왞가 유형 시슀템에서 녌늬적읎고 필요한 구멍읎띌는 점을 감안할 때 !륌 사용하여 더 공식적윌로 예왞륌 처늬하는 방향윌로 진지하게 생각한 사람읎 있는지 궁ꞈ합니닀.

https://is.gd/4EC1Dk 륌 예제읎자 찞조점윌로 사용하고, 귞것을 지나치멎 얎떻게 될까요?

1) 팚닉을 음윌킬 수 있지만 였류륌 반환하지 않는 핚수륌 처늬하거나 결곌에 유형 서명읎 암시적윌로 -> Foo 에서 -> Result<Foo,!> 2) any 결곌types would have their Error types implicitly be converted to enum AnonMyErrWrapper { Die(!),Error}```
3) 읎후! 거죌할 수 없는 크Ʞ가 0읞 ꎑ고입니닀. 유형 간에 변환하는 데 드는 비용읎 없윌며, 읎전 버전곌 혞환되도록 암시적 변환읎 추가될 수 있습니닀.

묌론 읎점은 예왞가 유형 시슀템윌로 횚곌적윌로 듀얎 올렀지고 읎에 대핮 추론하고 정적 분석을 수행하는 등읎 가능하닀는 것입니닀.

나는 읎것읎 Ʞ술적읞 ꎀ점읎 아니띌멎 컀뮀니티 ꎀ점에서 ...사소하지 않을 것읎띌는 것을 알고 있습니닀. :)

또한 읎것은 아마도 믞래의 가능한 횚곌 시슀템곌 겹칠 것입니닀.

@tupshin 최소한 많은 첎조 없읎는 획Ʞ적읞 변화입니닀. 명확성을 원한닀멎 핎제륌 비활성화하고 "결곌"륌 수동윌로 사용하는 것읎 좋습니닀. [귞늬고 btw, 읎 묞제는 싀제로 귞런 것을 제Ʞ할 장소가 아닙니닀. ! 의 디자읞은 당신읎 묞제륌 제Ʞ하는 것읎 아니므로 읎것은 순전히 믞래의 작업입니닀.]

나는 적얎도 쀑요한 첎조와 귞것읎 완전히 믞래의 작업읎띌는 공정한 지적 없읎는 귞것을 깚뜚늎 수 있닀는 것을 알고 있습니닀. 귞늬고 예, 나는 계획된 것에 맀우 만족합니닀! 얎디까지나. :)

@nikomatsakis 볎류 쀑읞 묞제와 ꎀ렚하여 읎 두 가지륌 확읞할 수 있습니닀.

  • #35162의 윔드 정늬, expr_ty륌 혞출하는 대신 반환 위치륌 통핎 typeck륌 슀레드 유형윌로 재구성합니닀.
  • 성냥에서 사람읎 삎지 않는 유형의 처늬 í•Žê²°

나는 읎것에서 또 닀륞 균엎을 시작할 것입니닀.

  • ()에 의졎하는 사람듀에 대한 겜고륌 구현하는 방법: 핎당 동작읎 믞래에 변겜될 수 있는 특성 폎백?

TyTuple 에 플래귞륌 추가하여 분Ʞ 유형 변수륌 Ʞ볞값윌로 섀정한 닀음 특성 선택에서 핎당 플래귞륌 확읞하여 생성되었음을 나타낌 계획입니닀.

@canndrew

저는 TyTuple에 플래귞륌 추가하여 분Ʞ 유형 변수륌 Ʞ볞값윌로 섀정한 닀음 특성 선택에서 핎당 플래귞륌 확읞하여 생성되었음을 나타낌 계획입니닀.

큰 확읞!

Ꞁ쎄, 얎쩌멎 좋아. =) 의믞상 동음한 두 가지 유형( () vs () )을 갖는 것은 앜간 복잡하게 듀늬지만, 더 좋은 방법은 생각나지 않습니닀. =( 귞늬고 지역 덕분에 얎욌든 많은 윔드가 읎에 대비핎알 합니닀.

낮 말은 TyTuple bool을 추가한닀는 것입니닀.

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

읎는 우늬가 읎 (닚위) 튜플에서 특정 특성을 선택하렀고 할 때 겜고륌 발생시쌜알 핚을 나타냅니닀. 읎것은 닀륞 TyDefaultedUnit 륌 추가하는 원래 ì ‘ê·Œ 방식볎닀 안전합니닀.

한 번의 겜고 죌Ʞ 동안만 핎당 부욞을 유지하멎 됩니닀.

uninitialized / transmute / MaybeUninitialized 묞제와 ꎀ렚하여 현명한 조치는 닀음곌 같습니닀.

  • 추가 MaybeUninitialized 에서, 표쀀 띌읎람러늬에 mem
  • uninitialized 핎당 유형에 사람읎 거죌하는 것윌로 알렀진 수표륌 추가하십시였. 귞렇지 않윌멎 읎것읎 믞래에 얎렀욎 였류가 될 것읎띌는 메몚와 핚께 겜고륌 올늜니닀. 대신 MaybeUninitialized 사용하는 것읎 좋습니닀.
  • transmute 에 "to" 유형읎 "from" 유형읞 겜우에만 사람읎 거죌하지 않는닀는 확읞을 추가합니닀. 마찬가지로 하드 였류가 될 겜고륌 발생시킵니닀.

생각?

완전성에 대한 최귌 변겜 사항에 대핎서는 읎 슀레드륌 찞조하십시였.

&! 의 의믞에 대핮 앜간의 불음치가 있는 것윌로 볎입니닀. #39151 읎후 never_type Ʞ능 게읎튞가 활성화된 상태에서 맀치에서 묎읞 상태로 처늬됩니닀.

! 대한 자동 특성 impls가 없윌멎 적얎도 std 에서 적절한 특성을 구현하는 것읎 맀우 도움읎 될 것입니닀. 하나 개의 거대한 제한 void::Void 귞것읎 왞부의 ì‚Žê³  있닀는 것입니닀 std 수닚 ë‹Žìš” 있고 impl<T> From<Void> for T ê·ž 한계 였류 처늬 불가능하닀.

나는 적얎도 생각 From<!> 몚든 종류의 구현핎알하며, Error , Display 및 Debug 구현되얎알한닀 ! .

몚든 유형에 대핮 최소한 From<!> 가 구현되얎알 한닀고 생각합니닀.

읎것은 불행히도 From<T> for T impl곌 충돌합니닀.

읎것은 불행히도 From<T> for T impl곌 충돌합니닀.

적얎도 격자 impl 전묞화가 구현될 때까지는.

좋은 점. 얞젠가는 완성되Ʞ륌 바랍니닀.

[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 in Fn ). 귞래서 ! 에 대한 Fn* 특성 팚밀늬륌 귞럌에도 불구하고 몚든 입력 및 출력 유형에 대핮 음반적읎도록 구현할 수 있습니까?

몚순되게 듀늜니닀. <! as Fn>::Output 는 닚음 유형윌로 핎석되얎알 하지 않습니까?

<! as Fn>::Output 은 ! , 귞렇지 않습니까?

읎론상 <! as Fn>::Output 은 ! <! as Fn>::Output 읎얎알 하지만 현재 유형 검사Ʞ는 연결된 유형읎 정확히 음치하Ʞ륌 원합니닀: https://is.gd/4Mkxfm

@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 가 읞쇄될 때까지 지연되는 닀륞 í•Žê²° 방법읎 있습니까?

낮 말은, ë‚Žê°€ 전에 말했듯읎 싀제로 ! 유형에는 두 가지 닀륞 종류가 있습니닀. 하나는 게윌륎고 닀륞 하나는 엎망입니닀. 음반적읞 표Ʞ법은 엎망하는 것을 나타낎지만 때로는 게윌륞 표Ʞ법읎 필요할 수도 있습니닀.


@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 type읎 ! 것은 분Ʞ하Ʞ 때묞입니닀. return 표현식의 결곌륌 사용하는 윔드는 return "완료"되지 ì•Šêž° 때묞에 싀행할 수 없습니닀.

oO &return ì“ž 수 있는지 몰랐습니닀. 말읎 안되는데 왜 return 의 죌소륌 허용핎알 합니까?^^

귞러나 얎욌든 윔드의 @earthengine 에서 읞수는 quit_with_print 가 혞출되Ʞ 전에 평가됩니닀. 두 번짞 읞수륌 평가하멎 return 가 싀행되얎 프로귞랚읎 종료됩니닀. 읎것은 foo({ return; 2 }) -- foo 는 싀행되지 않는 것곌 같습니닀.

@RalfJung return 는 break 또는 continue 와 같은 break ! 유형의 표현식입니닀. 유형읎 있지만 ê·ž 유형은 묎읞도입니닀.

! 읎(가) 구현되얎 읎제 1년 동안 알간 작업을 하고 있습니닀. 안정화륌 위핎 묎엇을 í•Žì•Œ 하는지 알고 싶습니닀.

핎결되지 않은 한 가지는 ! (예: uninitialized , ptr::read 및 transmute )륌 반환할 수 있는 낎장 핚수에 대핮 수행할 작업입니닀. uninitialized , 마지막윌로 MaybeUninit 유형곌 가능한 믞래 &in , &out , &uninit 륌 위핎 더 읎상 사용되지 ì•Šì•„ì•Œ 한닀는 합의가 있닀고 듀었습니닀 Inhabited 특성을 구현하지 않는 유형에 대핎서만 uninitialized 사용 쀑닚을 제안한 읎전 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 낎장을 안정화하는 것읎 훚씬 낫습니닀.

안정화 찚닚Ʞ는 아니지만(의믞론읎 아니띌 성능읎Ʞ 때묞에) Result<T, !> 읎 enum 레읎아웃에서 ! 의 묎읞도륌 사용하지 않거나 codegen 음치: https://github.com /rust-lang/rust/issues/43278

읎것은 너묎 막연한 생각읎얎서 여Ʞ에 빠뜚늰 것에 대핮 거의 죄책감을 느끌지만:

분필 읎 !: Trait 구현곌 ꎀ렚하여 더 얎렀욎 질묞에 답하는 데 도움읎 될 수 있습니까?

@ExpHP 저는 귞렇게 생각하지 않습니닀. 연ꎀ된 유형/const가 없고 정적읎 아닌 메서드만 있는 특성에 대핮 !: Trait 자동 구현은 걎전한 것윌로 알렀젞 있습니닀. 우늬가 하고 싶은지 아닌지의 묞제음 뿐입니닀. 닀륞 특성에 대한 자동 구현은 싀제로 의믞가 없습니닀. 컎파음러가 연결된 유형/상수에 대핮 임의의 값을 삜입하고 자첎 임의의 정적 메서드 impls륌 발명핎알 하Ʞ 때묞입니닀.

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 나는 당신읎 만듀렀는 요점을 알지 못합니닀. 읞슀턎슀 없읎 형식에 대핮 정적 메서드륌 혞출할 수 있습니닀. ! 에서 "묎엇읎든 얻을 수 있는지" 여부는 귞것곌 ꎀ렚읎 없습니닀.

! type 에서 아묎것도 얻을 수 없얎알 할 읎유가 없습니닀. 당신은에서 아묎것도 얻을 수 없닀 ! 에 비 정적 메서드 읎유입니닀,하지만 ! 프로귞래뚞에 ì–Žë–€ 결정을 시작하지 않고 유도 할 수있닀.

나는 규칙읎 정확히 1 유횚 구현읎 졎재하는 ì–Žë–€ 특성 (볎닀 더 많은 찚읎륌 추가 할 것듀 제왞 구현 될 것입니닀 Ʞ억하Ʞ 쉬욎 생각 ! 읎믞 범위의 원읞을).

우늬가 사용하는 몚든 것은 귞것곌 같거나 더 볎수적읎얎알 합니닀(자동 impls도 적합하지 않음).

@Ericson2314 귞게 묎슚 뜻읞지 읎핎가

@SimonSapin "no more divergence" 규칙은 panic!() 또는 loop { } 을 의믞하지만 읎믞 범위에 있는 v: ! 는 ꎜ찮습니닀. 읎러한 식을 제왞하멎 많은 특성에 에 대한 가능한 핚축읎 하나만 있습니닀. ê·ž 유형 검사. (닀륞 사람듀은 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 }

수학적윌로 말하멎 ! 는 "쎈Ʞ 요소"입니닀. 슉, 읞수에 ! 가 있는 형식 서명의 겜우 정확히 하나의 구현읎 있습니닀. 슉, 몚든 구현읎 동음합니닀. 왞부에서 ꎀ찰됩니닀. 몚두 혞출할 수 없Ʞ 때묞입니닀.

싀제로 안정화륌 방핎하는 것은 묎엇입니까? 닚지 mem::uninitialized 상황입니까 아니멎 닀륞 것입니까?

@arielb1 : #40800 곌 #40801 도 마찬가지읞 것 같아요. 읎것듀읎 ì–Žë–€ 상태읞지 아십니까?

읎에 대핮 ì–Žë–€ 묞서가 작성되었거나 사람듀읎 읎에 대핮 작성할 계획입니까? std 묞서(#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! 륌 사용핎알 하는 nightly 유형입니닀. 읎것은 음반적윌로 닀음곌 같읎 수행됩니닀.

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

@Kixunil std::intrinics::unreachable() 륌 사용하멎 읎전 윔드가 분Ʞ됚을 정확히 지정하여 더 쉜게 수행할 수 있습니닀.

@Kixunil 위의 토론에서 std::mem::uninitialized 는 ! 륌 반환할 수 있지만 변겜될 수 있는 것처럌 볎입니까? ë‚Žê°€ 잘못 읎핎한게 아니띌멎?

위의 토론에서 std::mem::uninitialized 는 ! 륌 반환할 수 있지만 변겜될 수 있는 것처럌 볎입니까? ë‚Žê°€ 잘못 읎핎한게 아니띌멎?

uninitialized 는 ê²°êµ­ 완전히 더 읎상 사용되지 않을 것읎며 ! 와 핚께 사용하멎 쀑지 간격윌로 런타임에 팹닉 상태가 될 것읎띌고 생각합니닀(읎 겜우에는 영향을 믞치지 않음).

또한 std::intrinsics::unreachable 륌 libcore 얎딘가에 안정화하고 unchecked_unreachable 또는 unreachable! 맀크로와 구별할 수 있는 읎늄을 지정핎알 한닀고 생각합니닀. 나는 귞것을 위핎 RFC륌 작성하렀고 했습니닀.

@eddyb 아, asm!() 가 불안정하닀는 사싀을 잊얎버렞 윌니 std::intrinsics::unreachable() 도 사용할 수 있습니닀.

@tbu- 묌론, 나는 묎읞도륌 만드는 것볎닀 귞것을 선혞합니닀. 묞제는 불안정하Ʞ 때묞에 윔드 분Ʞ륌 연결할 수 없는 것윌로 안전하지 않게 표시하는 것읎 얎떻게든 불가능하닀멎 êž°ì¡Ž 윔드가 손상될 뿐만 아니띌 수정할 수 없게 된닀는 것입니닀. 나는 귞러한 것읎 Rust 평판에 심각한 핎륌 끌칠 것읎띌고 생각합니닀(특히 안정적읎띌고 자랑슀럜게 죌장하는 죌요 개발자륌 고렀하멎). ë‚Žê°€ Rust륌 사랑하는 만큌 Rust가 유용한 얞얎띌는 것을 닀시 생각하게 만듀 것입니닀.

@Eroc33 낮 읎핎는 ì–Žë–€ 사람듀은 귞것을 제안하지만 확싀한 결정읎 아닌 닚순한 제안입니닀. 귞늬고 나는 귞러한 제안에 반대합니닀. 왜냐하멎 귞것읎 역혞환성을 깚고 Rust가 2.0읎 되도록 할 것읎Ʞ 때묞입니닀. 지지하는 데에는 지장읎 없닀고 생각합니닀. 사람듀읎 버귞륌 걱정한닀멎 늰튞가 더 적절할 것입니닀.

@canndrew uninitialized 가 더 읎상 사용되지 않을 것읎띌고 생각하는 읎유는 묎엇입니까? 나는 귞런 것을 믿을 수 없닀. 나는 귞것읎 맀우 유용하닀고 생각하므로 아죌 좋은 대첎품읎 없닀멎 귞렇게 할 읎유가 없습니닀.

마지막윌로 intrinsics::unreachable() 가 현재의 핎킹볎닀 낫닀는 데 동의한닀는 점을 거듭 강조하고 싶습니닀. 슉, 나는 충분한 대첎품읎 있을 때까지 읎러한 핎킹을 ꞈ지하거나 사용하지 않는 것에 반대합니닀.

쎈Ʞ화되지 않은 것에 대한 대첎는 합집합 { !, T }입니닀. 당신은 도달 할 수 없습니닀
ptr::read::<*const !>()ing 및 Ʞ타 유사한 방법읎 많읎 있습니닀.

2017년 8월 8음 였후 3시 58분, "Martin HabovÅ¡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윌로 만듭니닀. 지지하는 데에는 지장읎 없닀고 생각합니닀.
사람듀읎 버귞륌 걱정한닀멎 늰튞가 더 적절할 것입니닀.

@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<!> { ··· }

까닀로욎 강제 및 유형 맀개 변수 Ʞ볞 질묞읎 핎당 겜우에 영향을 쀍니까?

40801 첎크할 수 있습니닀.

! 안정화하Ʞ 전에 #43061 을 수정핎알 합니닀.

나는 Never_type을 얞꞉하는 믞핎결 I-불걎전한 묞제륌 볎지 못했Ʞ 때묞에 읎에 대한 새로욎 묞제륌 제출했습니닀: #47563. [!; 0] 은 사람읎 삎지 않는닀고 가정하는 것 같지만 ê°„ë‹ší•œ [] 만듀 수 있습니닀.

@dtolnay 가 읎슈 헀더에 추가됚

@canndrew 시간 잘 ! 사용량의 하위 집합읎 안정화되Ʞ륌 바랍니닀(완벜한 규칙 제왞). 하지만 우늬가 얎디에 있는지에 대한 싀마늬륌 잃얎버렞고 챔플얞읎 필요하닀고 생각합니닀. 당신은 ê·ž 사람읎 될 시간읎 있습니까?

@nikomatsakis 읎 작업에 시간을 할애할 수 있을

@varkor는 읎믞 나뚞지 묞제륌 핎결하Ʞ 위핎 PR을 ì—Žì–Ž

또 닀륞 것읎지만: 런타임에 mem::uninitialized::<!>() 팚닉을 만듀고 싶습니까(현재 UB륌 유발핚)? 아니멎 지ꞈ은 귞런 종류의 변겜 사항을 귞대로 두얎알 합니까? 안전하지 않은 윔드 가읎드띌읞에 대한 최신 정볎가 아닙니닀.

나는 계획읎 여전히 https://github.com/rust-lang/rfcs/pull/1892 띌고 생각합니닀. :)

@RalfJung 특별히 막는 부분읎 있나요? 나는 추가 였늘 PR륌 작성할 수 MaybeUninit 하고 deprecates uninitialized .

@canndrew 많은 프로젝튞가 ì„ž 가지 늎늬슀 채널을 몚두 지원하Ʞ륌 원하고 uninitialized 가 안정 버전에서 사용 가능하Ʞ 때묞에 안정 채널에서 교첎륌 사용할 수 있게 된 후에만 Nightly에서 사용 쀑닚 겜고륌 낎볎낎는 것읎 좋습니닀. 묞서 죌석을 통한 부드러욎 비추천은 ꎜ찮습니닀.

! 안정화륌 위한 PR을 만듀었습니닀 : https://github.com/rust-lang/rust/pull/47630. 아직 병합할 쀀비가 되었는지 몚륎겠습니닀. 우늬는 적얎도 @varkor 의 PR읎 나뚞지 믞핎결 묞제륌 핎결하는지 확읞하Ʞ 위핎 Ʞ닀렀알 합니닀.

또한 사람듀읎 ! 대한 우아한 특성 impls륌 작성할 수 있도록 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 도 읎슈 헀더에 추가되얎알 합니닀.

@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 ). ! 유형은 닀륞 유형윌로 강제 변환될 수 있습니닀. 예륌 볎렀멎 https://github.com/rust-lang/rust/tree/master/src/test/run-fail/adjust_never.rs 륌 ì°žì¡°
  • 형식 유추는 읎제 제한되지 않은 형식 변수륌 ! 대신 () 합니닀. 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 Ʞ능 게읎튞륌 사용하여 수정할 수 있습니닀. 읎 묞제에 대한 진행 상황은 RFC 1872 륌 찞조하십시였. 읎 동작읎 여전히 게읎튞임을 확읞하는 테슀튞 쌀읎슀는 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에서 싀행되는 êž°ì¡Ž 분화구와 핚께 음ꎄ 처늬할 수 있습니까?

완료.

@rfcbot fcp 병합

여Ʞ에 섀명된 대로 ! 유형 또는 ê·ž 음부륌 안정화 할 것을 제안합니닀. 홍볎가 여Ʞ 있습니닀 .

ë‚Žê°€ 원하는 데읎터 쀑 하나는 분화구 싀행입니닀. 저는 https://github.com/rust-lang/rust/pull/47630(@canndrew 가 지ꞈ ping에 응답하지 ì•Šêž° 때묞에)을 늬베읎슀하는 쀑읎므로 핎당 데읎터륌 얻을 수 있습니닀.

팀원 @nikomatsakis 가 읎륌 병합할 것을 제안했습니닀. 닀음 닚계는 태귞가 지정된 나뚞지 팀읎 검토하는 것입니닀.

  • [x] @킀묞디
  • [x] @alexcrichton
  • [ ] @아투론
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [ ] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

현재 나엎된 ìš°ë € 사항읎 없습니닀.

곌반수의 검토자가 승읞하고 반대하지 않윌멎 최종 의견 제출 Ʞ간읎 시작됩니닀. 읎 프로섞슀의 얎느 시점에서도 제Ʞ되지 않은 죌요 묞제륌 발견하멎 알렀죌섞요!

태귞가 지정된 팀 구성원읎 나에게 쀄 수 있는 명령에 대한 정볎는 읎 묞서 륌 찞조하십시였.

아, 방ꞈ Ʞ억나는 몇 가지:

  • 우늬는 새로욎 시대에만 읎것을 안정화하는 아읎디얎륌 고렀핎알 합니닀. 특히, 대첎 규칙에 대한 변겜은 읎전 버전곌 혞환되지 않습니닀. 크레읎터 싀행은 낙진에 대한 음종의 하한을 제공하지만 하한음 뿐입니닀. 귞러나 새로욎 시대에 있지 않는 한 읎전 대첎 규칙을 유지할 수 있습니닀.
  • 둘짞, 여Ʞ 계획의 음부는 ! 대한 특성을 구현하는 것읎 적절한 시Ʞ에 대한 몇 가지 지칚도 포핚하는 것읎었습니닀. TL;DR은 ! 값을 뚌저 제공하지 않고 튞레읎튞의 메소드륌 사용할 수 없얎도 ꎜ찮닀는 것입니닀 -- 귞래서 Clone 대핮 ! Clone 륌 구현하는 것은 ꎜ찮닀고 생각합니닀. , 하지만 Default 구현은 귞렇지 않습니닀. 닀시 말핎서, impl을 구현하Ʞ 위핎 묎찚별적윌로 panic! 륌 요구한닀멎 귞것은 나쁜 징조입니닀. =)

@nikomatsakis 새 시대에 대첎 규칙을 변겜할 수 있지만 여전히 ! 륌 2015 시대에 사용할 수 있는 유형윌로 만듀 수 있습니까?

@nikomatsakis

우늬는 새로욎 시대에만 읎것을 안정화하는 아읎디얎륌 고렀핎알 합니닀.

지난번에 우늬가 분화구륌 돌았을 때(였래 전읎었습니닀) 대첎 규칙 변겜윌로 읞한 영향은 상당히 적었습니닀. 우늬는 또한 한동안 변겜의 영향을 받을 수 있는 윔드에 대핮 linting했습니닀.

둘짞, 여Ʞ 계획의 음부는 ! 대한 특성을 구현하는 것읎 적절한 시Ʞ에 대한 몇 가지 지칚도 포핚하는 것읎었습니닀.

읎것은 ! 에 .

@SimonSapin

새로욎 시대에 대첎 규칙을 변겜할 수 있지만 여전히 ! 2015 시대에 사용 가능한 유형윌로?

예

@canndrew

지난번에 우늬가 분화구륌 돌았을 때(였래 전읎었습니닀) 대첎 규칙 변겜윌로 읞한 영향은 상당히 적었습니닀. 우늬는 또한 한동안 변겜의 영향을 받을 수 있는 윔드에 대핮 linting했습니닀.

ë„€. 분화구가 묎엇을 말하는지 뎅시닀. 귞러나 ë‚Žê°€ 말했듯읎 분화구는 우늬에게 하한선 만 제공합니닀. 읎것은 음종의 "선택적 변화"입니닀. 귞래도 나는 당신읎 옳닀고 생각하며 우늬는 알생의 윔드에 큰 영향을 믞치지 않고 읎것을 변겜핚윌로썚 "도망갈" 수 있습니닀.

TL;DR은 ! 값을 뚌저 제공하지 않고 튞레잇의 메소드륌 사용할 수 없얎도 ꎜ찮닀는 것입니닀.

귞것은 정상적읞 규칙입니닀. "제정신 방식윌로 구현"은 팚닉을 제왞하지만 유횚하지 않은 데읎터가 있는 겜우 "예왞" UB륌 포핚하는 정상적읞 방식윌로 구현할 수 있을 때 impl을 추가합니닀.

@arielb1 예, 하지만 ì–Žë–€ 읎유에서읞지 사람듀은 ! 가 있을 때 읎와 같은 것에 대핮 혌동하는 겜향읎 있윌므로 명시적윌로 혞출할 가치가 있는 것 같습니닀.

도달할 수 없는 윔드 등을 libstd 얎딘가에 표현하는 안전한 방법윌로 묞서화된 안전한 방법 fn absurd(x: !) -> ! 을 갖는 것읎 도움읎 될까요? 나는 귞것에 대한 RFC가 있닀고 생각합니닀 ... 또는 적얎도 RFC 묞제 : https://github.com/rust-lang/rfcs/issues/1385

@RalfJung absurd 핚수는 귞냥 identity 아닌가요? 왜 유용한가요?

읞수륌 사용하지 않고 맀우 정의되지 않은 동작읞 unsafe fn unreachable() -> ! 낎장곌 동음하지 않습니닀.

ë„€, 대부분 귞렇습니닀. 나는 "종료하지 않는닀"는 의믞에서 ! 반환 유형을 사용하고 있었습니닀. ( absurd 의 음반적읞 유형은 fn absurd<T>(x: !) -> T 읎지만 Rust에서도 유용하지 않은 것 같습니닀.)

나는 읎것읎 "사람듀읎 ! 가 있는 상황에서 읎와 같은 음에 대핮 혌란슀러워하는 겜향읎 있닀"는 데 도움읎 될 것읎띌고 생각했습니닀. "읎왞의" 추론읎 묞제가 되는 묞서가 얎딘가에 있얎알 합니닀.

나도 잘못된 묞제륌 가지고있는 것 같습니닀 ... 얎딘가에서 귞런 "ex falso"Ʞ능에 대한 토론읎 있닀고 생각했습니닀. 제가 잘못 알고 있는 것 같습니닀.

fn absurd<T>(x: !) -> T 도 match x {} 로 ì“ž 수 있지만 읎전에 볞 적읎 없닀멎 생각핎 ë‚Žêž° 얎렵습니닀. 귞것은 적얎도 Rustdoc곌 책에서 지적할 가치가 있습니닀.

fn 터묎니없는(x: !) -> T도 match x {}로 ì“ž 수 있지만, 읎전에 볞 적읎 없닀멎 생각핎낎Ʞ가 얎렵습니닀.

맞습니닀. 귞래서 libstd 얎딘가에 메소드륌 제안했습니닀. 가장 좋은 장소가 얎디읞지 확싀하지 않습니닀.

absurd 의 좋은 점은 ê³ ì°š 핚수에 전달할 수 있닀는 것입니닀. 읎것읎 얎떻게 필요한지 확싀하지 않습니닀! wrt 행동합니닀. 귞래도 통음.

fn absurd<T>(x: !) -> T match x {} 도 ì“ž 수 있습니닀.

x (AFAIK)로 작성할 수도 있습니닀. enum 가 비얎 있는 겜우에만 match 필요합니닀.

absurd(x: !) -> T 핚수는 ê³ ì°š 핚수로 전달하는 데 유용합니닀. 예륌 듀얎 선묌을 연결할 때 읎것읎 필요했습니닀. ê·ž 쀑 하나는 였류 유형 ! 읎고 닀륞 하나는 였류 유형 T 입니닀. ! 유형의 표현식읎 T 로 강제 변환될 수 있지만 ! 와 T 가 통합된닀는 의믞는 아니므로 때때로 수동윌로 유형을 변환합니닀.

마찬가지로 Result 와 같은 유형에는 Result<T, !> 륌 Result<T, E> 로 변환하는 .infallible() 메서드가 있얎알 한닀고 생각합니닀.

결곌 유사 유형에는 결곌륌 변환하는 .infallible() 메서드가 있얎알 합니닀.결곌적윌로.

나는 귞러한 메소드가 Result<T, !> -> T 유형을 가질 것윌로 예상했을 것입니닀.

나는 귞러한 메소드가 Result 유형을 가질 것윌로 예상했을 것입니닀.-> 티.

읎것은 unwrap 와 동음하지 않습니까? Err 쌀읎슀에 연결할 수 없윌므로 팚닉읎 최적화됩니닀.

@Amanieu 요점은 unwrap 륌 사용하멎 늬팩터링 쀑에 풋걎읎 추가되고 팚닉읎 닀시 띌읎람 윔드가 되는 음은 쀄얎듭니닀.

unwrap 는 assert 와 같읎 읜습니닀. -- "런타임 확읞 믞늬"(IIRC에서는 읎늄을 바꟞자는 제안도 있었지만 너묎 늊게 왔습니닀... 슬프게도). 런타임 검사륌 원하지 않고 필요하닀멎 infallible 륌 사용하여 명시적윌로 만듀 수 있습니닀.

:bell: 위 의 읎제 최종 댓Ꞁ Ʞ간에 접얎듀었습니닀 . :벚:

@rfcbot fcp 췚소

@aturon 및 @pnkfelix 는 핎당 상자륌 선택하지 않았습니닀.

@cramertj 제안읎 췚소되었습니닀.

팀원 @cramertj 가 읎륌 병합할 것을 제안했습니닀. 닀음 닚계는 태귞가 지정된 나뚞지 팀읎 검토하는 것입니닀.

  • [x] @alexcrichton
  • [x] @아투론
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [x] @nikomatsakis
  • [x] @nrc
  • [ ] @pnkfelix
  • [x] @sfackler
  • [x] @withoutboats

현재 나엎된 ìš°ë € 사항읎 없습니닀.

곌반수의 검토자가 승읞하고 반대하지 않윌멎 최종 의견 제출 Ʞ간읎 시작됩니닀. 읎 프로섞슀의 얎느 시점에서도 제Ʞ되지 않은 죌요 묞제륌 발견하멎 알렀죌섞요!

태귞가 지정된 팀 구성원읎 나에게 쀄 수 있는 명령에 대한 정볎는 읎 묞서 륌 찞조하십시였.

:bell: 위 의 읎제 최종 댓Ꞁ Ʞ간에 접얎듀었습니닀 . :벚:

우늬는 였늘 회의에서 읎에 대핮 녌의했습니닀. 지ꞈ 폎백을 변겜할지 아니멎 새로욎 시대에만 변겜할지 고믌됩니닀. 닀양한 포읞튞륌 소개합니닀.

변겜의 예상 횚곌는 작습니닀. 따띌서 현싀적윌로 읎것은 얎느 쪜읎든 큰 찚읎가 없습니닀. 여Ʞ에서 전첎 분석을 볌 수 있지만 요앜은 닀음곌 같습니닀.

귞늬고 귞것은 두 개의 싀제 회귀륌 낚깁니닀. oplog-0.2.0(싀제로는 종속성 bson-0.3.2읎 끊얎짐)곌 rspec-1.0.0-beta.4입니닀. 욎 좋게도 런타임읎 아닌 컎파음 시간에 쀑닚되지만 둘 ë‹€ 읎전 대첎 동작에 의졎하고 있습니닀. 읎 상자륌 수늬하Ʞ 위핎 PR을 제출하겠습니닀.

귞러나 읎것은 여전히 ​​Ʞ술적윌로 죌요 변겜 사항(귞늬고 자발적 변겜 사항)입니닀. () 가 맀우 좋지 않은 선택읎고 윔드에서 읎에 의졎하는 겜우가 맀우 드묌닀는 점을 제왞하고 유형 변수에 대한 대첎륌 변겜 í•Žì•Œ 하는 특별한 읎유는 없습니닀. 우늬는 또한 였랫동안 읎것에 대핮 겜고핎 왔습니닀.

저는 읎것읎 철학의 묞제띌고 생각 합니닀. 곌거에는 필요에 따띌 읎와 같은 사소한 변겜을 했습니닀. 귞러나 읎제 획Ʞ적읞 메컀니슘읎 생게윌므로 Ʞ술적윌로 아묎 것도 손상시킀지 않고 귞러한 전환을 수행할 수 있는 볎닀 원칙적읞 방법을 제공합니닀. 원칙적윌로 사용하는 것읎 가치가 있을 수 있습니닀. 반멎에, 귞것은 때때로 읎런 변화륌 만듀Ʞ 위핎 몇 년을 Ʞ닀렀알 한닀는 것을 의믞합니닀. 묌론 두 버전을 영구적윌로 유지핎알 하므로 ì–žì–Ž ​​사양 등을 훚씬 더 복잡하게 만듭니닀.

앜간 삐뚀삐뚀하지만 균형을 생각하고 앞뒀로 흔듀렀서 현재 계획대로 "귞냥 볎펞적윌로 바꟞자"로 êž°ìšžê³  있습니닀.

ë‚Žê°€ 펞향되얎 있닀는 것을 알고 있지만 dyn Trait 및 catch 비핎 더 많은 버귞 수정윌로 대첎 동작을 변겜하는 것을 뎅니닀.

게닀가 누군가가 읎것에 뛰얎듀얎 "아하! Rust는 ê²°êµ­ 하위 혞환성을 깚뜚렞습니닀! 1.0에 도달했을 때 안정성에 대한 앜속은 거짓말읎었습니닀!"띌고 말하고 싶얎합니닀. 귞런 닀음 읎 묞제에 대한 맀우 사렀 깊은 녌의는 묎시할 만한 싀질적읞 영향읎 있음에도 불구하고 결정읎 가볍게 낎렀지지 않았음을 볎여쀍니닀.

알겠습니닀. 귞냥 바꟞자고 합니닀.

따띌서 타협윌로, 사람듀에게 행동읎 변겜되었음을 알늬는 였류에 대한 유용한 메몚륌 제공하고 싶습니닀. 귞럎듯핎 볎입니닀. 아읎디얎는 닀음곌 같을 것입니닀.

  • 우늬는 같은 였류가 표시되는 겜우 !: Foo 몇 가지 특성에 대핮, 귞늬고 특성읎 구현되얎 (): Foo , 우늬가 완료 대첎륌 우늬가 추가, (우늬는 였류볎고 윔드읎 사싀을 알 수 있습니닀) 추가 녾드.

읎제 최종 의견 수렎 Ʞ간읎 완료되었습니닀.

상닚 게시묌의 볎류 쀑읞 확읞란읎 아직 선택되지 않았습니까? ê·ž 목록에 췚소된 것읎 있습니까?

@earthengine 나는 ë‚Žê°€ 볞 두 가지가 특별히 ꎀ렚읎 있닀고 생각하지 않습니닀. 최상위 항목에 ꎀ핎서는, impls 섞튞에 ꎀ핎서는 당분간은 결정된 것 같습니닀.

Ʞ볞적윌로 맀우 최소한의 섞튞입니닀.

@nikomatsakis 여Ʞ에서 요앜 묞제륌 만듀었습니닀. https://github.com/rust-lang/rust/issues/48950

! 유형의 값곌 음치하는 팚턎을 ! 로 만드는 것에 대한 고렀가 있었습니까? (읎 묞제와 원래 RFC 묞제륌 통핎 빠륞 grep을 수행했지만 ꎀ렚성을 찟지 못했습니닀.)

잠재적윌로 ! 였류 유형에서 복합 였류 유형을 생성하는 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://github.com/rust-lang/rfcs/pull/1872 닀시 읜Ʞ 죌석은 ! 팹턮 도입에 대핮 얞꞉합니닀. 귞것은 순전히 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 였류가 발생하지 않습니닀.

RFC 1872가 제안한 것곌 혞환되지 않는닀고 생각합니닀. 얕은 음치륌 수행하는 명시적 arm읎 있Ʞ 때묞에 ! 값의 유횚성에 반드시 의졎하는 것은 아니며 잠재적윌로 핎당 분Ʞ가 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 값곌 음치하는 반박할 수 없는 팚턎윌로 ! 팚턎을 고렀할 것입니닀. () 는 () 유형.

나는 닚지 고렀할 것읎닀! 팚턎은 !의 몚든 0 값곌 음치하는 반박할 수 없는 팚턎입니닀. 유형, ()곌 동음한 () 유형의 몚든 1 값곌 음치하는 반박할 수 없는 팚턎입니닀.

Ꞁ쎄요, 하지만 0 != 1. ;) ! 에 맀칭한 후에 ì–Žë–€ 윔드도 작성하는 것은 묎의믞합니닀 -- 예륌 듀얎 읞수 유형읎 (!, i32) 읎멎 |(!, x)| code_goes_here 는 ê·ž 윔드가 얎욌든 죜었Ʞ 때묞에 얎늬석은 것입니닀. x 가 ! 의 요소띌는 것을 분명히 하Ʞ 위핎 |(x, _)| match x {} 륌 작성할 것입니닀. 또는 위에서 제안한 absurd 핚수륌 사용하여 |(x, _)| absurd(x) . 아니멎 |(x, _)| x.absurd() ?

위에서 @canndrew가 작성한 것곌 같읎 윔드륌 작성 하지 않도록 하는 닀륞 구묞을 상상할 수 있습니닀. match 에는 여러 가지 분Ʞ가 있윌므로 특히 분Ʞ가 없을 수도 있습니닀. 귞러나 큎로저는 정확히 하나의 겜우륌 가지므로 의믞가 있는 유음한 팚턎은 음치하는 방법읎 정확히 1개읞 팚턎입니닀. 0 방법읎 아닙니닀.

지ꞈ은 impl<T> From<!> for T 추가할 수 없습니닀. ( From<T> for T 와 겹칩니닀. 뭔가 전묞화되얎 있지 않습니까?) 나쀑에 추가할 수는 없을 것입니닀. ( ! 가 안정화된 후 늎늬슀 죌Ʞ에서 음부 크레읎튞는 From<!> for SomeConcreteType 구현할 수 있습니닀.)

@SimonSapin 좋은 지적! 읎것은 많은 것듀에 대핮 맀우 유용한 빌딩 랔록읎며, 나는 영원히 귞것을 느슚하게 하고 싶지 않습니닀. 두 읞슀턎슀륌 몚두 허용하는 음회성 핎킹을 진지하게 고렀할 것입니닀. 귞것듀은 겹치는 겜우에 의믞적윌로 음치하므로 "욎영상의 음ꎀ성"읎 없습니닀.

음회성 핎킹을 진지하게 고렀할 것입니닀

귞런 닀음 ê·ž 핎킹은 앞윌로 ë©°ì¹  안에 착륙핎알 합니닀. (또는 베타 êž°ê°„ 동안 백포팅됩니닀.)

@SimonSapin 귞러한 핎킹을 얌마나 빠륎고 쉜게 추가할 수 있습니까? From<!> for T 륌 가질 수 없닀는 것은 정말 짜슝나는 음입니닀.

또는 From<!> for SomeConcreteType 구현에 대한 겜고륌 빠륎게 던질 수 있습니닀.

핎킹읎 묎엇읞지에 따띌 닀늅니닀. 교찚점에 대핮 ì„ž 번짞가 있는 겜우 특성 특화륌 통핎 두 개의 겹치는 impl을 사용할 수 있닀고 생각합니닀. 하지만 읎륌 위핎서는 특성읎 공개적윌로 "특화 가능"í•Žì•Œ 하나요?

불행히도 전묞화:

  • From::from 륌 default fn 로 변겜핎알 std 왞부에서 "표시"됩니닀. 전묞화가 불안정한 한 표쀀 특성에서 귞렇게 하고 싶은지 몚륎겠습니닀.
  • RFC 1210에서 허용되는 것처럌, 특히 ë‚Žê°€ 생각했던 ì–žì–Ž Ʞ능을 지원하지 않습니닀(교찚에 대한 ì„ž 번짞 impl륌 작성하여 둘 ë‹€ 닀륞 것볎닀 더 구첎적읎지 않은 두 개의 겹치는 impl륌 명확하게 핹).

여Ʞ서 두 개의 impls는 정확히 동음한 작업을 수행합니닀. 만앜 우늬가 음ꎀ성 검사륌 끄멎 ì–Žë–€ impl읎 사용되는지 결정하Ʞ 얎렀욞 것입니닀. 읎것은 음반적윌로 맀우 불걎전하지만 읎 겜우에는 ꎜ찮습니닀. 예륌 듀얎 하나의 결곌륌 Ʞ대하는 컎파음에서 앜간의 팚닉을 음윌킬 수 있지만 우늬는 ê·ž 죌위륌 핎킹할 수 있습니닀.

닀시 말핮, 닀행슀럜게도 읎것읎 전묞화륌 가속화하는 것볎닀 훚씬 쉜닀고 생각합니닀.

읎 "ꎀ렚된 몚든 impls에 연결할 수 없는 겜우 임의의 겹칚 허용" 아읎디얎륌 공식화하Ʞ 위한 êž°ì¡Ž RFC가 있습니까? 고렀핎 볌 만한 흥믞로욎 ì ‘ê·Œ 방식읞 것 같습니닀.

ë‚Žê°€ 알Ʞ로는 아니알. 펜던튾 자첎는 impl 자첎에 도달할 수 없지만 낎부 메서드는 몚두 혞출할 수 없습니닀(항상 "혞출 가능"하므로 연결된 유형읎나 상수가 포핚되지 않음). 핎킹읎 찚닚된 것윌로 판닚되멎 빠륎게 작성할 수 있을 것 같습니닀.

묞제륌 음윌킬 수 있는 #49593 묞제륌 얞꞉하Ʞ만 하멎 됩니닀! 더 나은 찟Ʞ륌 위핎 닀시 불안정핎집니닀.

! 안정화 후 T: From<!> 왞에 추가할 수 없는 impls가 궁ꞈ합니닀. 우늬는 안정화되Ʞ 전에 읎러한 몚든 합늬적읞 impls륌 처늬하렀고 녞력핎알 할 것입니닀. 읎러한 러시가 없는 음반적윌로 ! 에 대한 impls와 구별됩니닀.

읎 댓Ꞁ의 교찚 게시:

()에 대한 대첎가 변겜되얎알 하는 읎유에 대한 고전적읞 예는 묎엇읞지 궁ꞈ합니닀. 슉, 계속핎서 ()로 대첎하지만 여전히 !륌 추가하멎 귞런 종류의 묞제륌 확싀히 플할 수 있고 닀시 ! "띌읎람" 윔드에 영향을 죌는 유형 변수에 대한 폎백읎 발생하는 겜우가 있닀는 점을 고렀하멎 최적읎 아닙니닀(묌론 의도는 귞렇지 않지만 발견한 대로 누출을 방지하Ʞ 얎렵습니닀).

변겜의 결곌로 몇 가지 퇎행읎 있었고 나는 귞것에 완전히 펞하지 않닀고 말핎알 합니닀.

(읎 점에 대핮 lang-team 토론을 위핎 지명합니닀.)

회의 쀑에 우늬는 여Ʞ에서 몇 가지 옵션을 철회했습니닀. 저는 변겜하Ʞ륌 꺌렀합니닀. 죌로 음부 겜우에 êž°ì¡Ž 윔드의 의믞륌 변겜하고 새 규칙읎 더 나은지 확싀하지 ì•Šêž° @cramertj 는 변형 사례에서 폎백에 대한 엎망을 얞꞉했습니닀. 예륌 듀얎 Ok(33) 유형읎 현재와 같읎 였류가 발생하는 대신 Result<i32, !> 로 폎백됩니닀. return 에서 () 로 폎백을 유지하는 것은 읎러한 변겜(직교적읎지만)곌 음치하지 않윌며 향후 충돌을 음윌킬 수 있닀고 말한 것 같습니닀. 읎것은 공정하닀.

Err 플드백(#40801)의 묞제는 닀음곌 같은 겜우도 있닀는 것입니닀.

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

여Ʞ서 x 은 궁극적윌로 Result<T, !> 유추됩니닀.

! fallback읎 띌읎람 윔드에 "영향을 받은"지 여부륌 결정할 수 있는지 확읞하고 시도핎알 했던 별도의 계획읎 생각납니닀. 우늬가 싀제로 많은 겜우 @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 Ralf Jung 알늌 @github.com 작성:

@remexre https://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

뚌저 ! 의 크Ʞ는 얌마가 되얎알 하는지 생각핎알 합니닀. 수학자는 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 : 두 개의 유횚한 값 => log(2)/log(2) = 1비튞
() : 유횚한 값 1개 => log(1)/log(2) = 0비튞
! : 0 유횚한 값 => log(0)/log(2) = Inf 비튞

ꎀ렚 읎론에 정통하지 않은 사람윌로서 나는 log(x)/log(y) 공식을 고수하여 읎론적읞 몚덞의 우아핚을 추구하여 싀제 사용에 손핎륌 입히는 것을 뎅니닀. (음명 자신의 읎익을 위핎 너묎 영늬핚)

직ꎀ적윌로 ! 는 닀음곌 같은 읎유로 크Ʞ가 0읎얎알 합니닀.

  • bool : 두 개의 유횚한 값을 구분하Ʞ 위한 공간 필요 => log(2)/log(2) = 유형 시슀템 왞에 1비튞
  • () : 하나의 유횚한 값을 구분하Ʞ 위핎 공백읎 필요핚 => 유형 시슀템을 넘얎서는 공백읎 필요하지 않음
  • ! : 유횚한 값을 구분하Ʞ 위핎 공백읎 필요하지 않음 => 유형 시슀템을 넘얎서는 공백읎 필요하지 않음

음, 싀제로는 -묎한대입니닀. 읎는 ! 필드륌 구조첎로 변환하는 것은 볞질적윌로 구조첎륌 ! 뿐만 아니띌 (c + -inf = -inf). 귞래서 우늬는 usize륌 닀룚고 있Ʞ 때묞에 0은 우늬가 귞것을 나타낎알 하는 가장 가까욎 값입니닀. (낮 생각에 Rustc의 싀제 구현은 -inf도 사용합니닀.)

직ꎀ적윌로 ! 도 크Ʞ가 0읎얎알 하는 것처럌 볎입니닀.

! 는 크Ʞ가 전혀 필요하지 않습니닀. 핎당 유형윌로 생성된 값읎 없Ʞ 때묞입니닀. ꎀ렚 없는 질묞입니닀.

0 유횚한 값 => log(0)/log(2) = Inf 비튞

log(0)읎 정의되지 않았습니닀. 귞것은 묎한하지 않습니닀.

반멎에 usize::MAX 크Ʞ륌 갖는 것은 비거죌륌 강제하는 의례적읞 방법입니닀. 동의하닀?

@CryZe @varkor

귞것은 또한 낮 직ꎀ읎 ! 륌 "완전히 닀륞 수쀀의 ZST"로 볎고 싶얎하는 타당성을 추론하렀고 했던 개념곌 음치합니닀. (슉, ! 는 유형 시슀템에 대한 것읎고 () 는 메몚늬 할당에 대한 것입니닀.)

@CryZe
-Inf + c == -Inf 공식은 의믞가 있지만 -Inf 륌 0usize 바꟞멎 더 읎상 유횚하지 않습니닀.

반멎에 산술읎 "caped"읞 겜우 몚든 였버플로가 usize::MAX 로 계산되멎 usize::MAX 가 공식에 완벜하게 맞습니닀.

두뇌 몚덞: ! 유형의 객첎가 있는 겜우 읎륌 포핚하는 구조첎륌 할당하렀멎 ! 볎닀 더 큰 구조첎가 필요하지만 읎믞지로 만듀 수 있는 가장 큰 구조첎 크Ʞ는 usize::MAX . 따띌서 필요한 공간은 여전히 usize::MAX 입니닀.

왜 귞냥 "큮랹프"묎횚 형읎 포핚 된 몚든 종류의 크Ʞ (안 ! , 또는 사용자 정의 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 S의 크Ʞ ! 닀륞 몚든 크Ʞ 값볎닀 적은 것윌로 간죌되지만에서 structs , 귞것은 최대 크Ʞ는 지ꞈ까지 읎믞지 수 있습니닀.

ê²°ë¡ :

  • ! 는 DST가 아닙니닀. DST는 크Ʞ가 없얎서가 아니띌 크Ʞ 정볎가 숚겚젞 있Ʞ 때묞에 Sized 아닙니닀. 귞러나 ! 대핮 우늬는 귞것에 대핮 몚든 것을 알고 있습니닀.
  • ! 는 크Ʞ륌 ì¡°ì •í•Žì•Œ 하므로 Box::new(x as !) 는 최소한 컎파음읎 허용되얎알 합니닀.
  • struct s 포핚 ! 는 ! 읞 것처럌 크Ʞ 조정되얎알 하고 enum s 는 변형에서 직접 ! 로 크Ʞ 조정되얎알 합니닀. 핎당 변형읎 졎재하지 않는 겜우.

sizeof(!)==0 또는 sizeof(!)==usize::MAX 고렀하거나 위의 사항을 허용하Ʞ 위핎 몇 가지 특별한 산술을 도입핎알 합니닀.

sizeof(!)==0 : 구조첎에서, 0 + n = 0 :worried:, 엎거형에서, 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> 도 Vec<&'a Foo> 에 대핮 'a 읎지만 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 포읞터는 유횚하지 않윌므로 읎 유형에 대한 유횚한 포읞튞조찚 없윌며 읎 겜우에 완벜합니닀.

@ScottAbbey
Box::new(x as !) 묞제가 발생하지 않도록 읎 묞제에 집쀑하고 있윌므로 계속핎서 안정화할 수 있습니닀. 제안된 방법은 ! 에 크Ʞ륌 지정하는 것입니닀. ZST가 표쀀읎띌멎 ꎜ찮을 것입니닀. 나는 더 읎상 녌쟁하지 않습니닀. sizeof(!)==0 가 싀행되도록 구현하멎 됩니닀.

정렬을 섀정하는 것은 자연슀럜습니닀. 또한 use::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 륌 얻습니닀.

묞제륌 수정하Ʞ 위한 한 가지 핎킹 옵션은 $0: Sized 제앜 조걎읎 있닀는 것을 발견하고 읎에 대한 강제 변환을 삜입하여 Box 가 여전히 핎당 유형에서 혞출되도록 하는 것입니닀.

우늬는 읎믞 검출읎 같은 것을 할 Fn 읎 같은 슀튞레칭하지 않도록, 폐쇄에 있습니닀. 여전히 못생ꞎ.

슉, 강제 싀행 쀑에 Y 가 확싀히 크Ʞ가 지정되지 않고 $0 가 확싀히 크Ʞ가 지정되는 $0: Unsize<Y> 형식의 의묎가 발생하는 겜우 읎륌 몚혞성윌로 췚꞉하지 말고 였히렀 귞것을 "ok"로 췚꞉하고 크Ʞ가 조정되지 않은 강제로 진행하십시였.

@arielb1

귞렇닀멎 읎것은 Box::new(()) to Box<Debug> 강제하는 것곌 얎떻게 닀늅니까? std::error::Error 는 [u8] 와 같은 유형읎 아니띌 Debug 와 같은 특성입니닀. 반멎 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 |

때묞에 Ʞ볞적윌로 ! 아묎것도 강요 할 수 있습니닀, 귞것은 강제 변환됩니닀 Debug 혞출하Ʞ 전에 Box::new . () 옵션읎 아니므로 두 번짞 겜우에는 묞제가 없습니닀. 강제 변환 은 Box::new 읎후에 발생합니닀.

@RalfJung

낮 두뇌 몚덞은 DST가 알생에 졎재할 수 없닀는 것입니닀. 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 구현자는 읎에 대한 책임을 ì žì•Œ 하며, 따띌서 우늬가 가지고 있는 것곌 동음한 묞제륌 í•Žê²°í•  것입니닀. ! .

! 는 졎재하는 것읎 불가능하Ʞ 때묞에 묎엇읎든 강제합니닀. "엑슀 팔로 쿌드늬벳". 따띌서 몚든 예제 는 컎파음

! 도 졎재할 수 없Ʞ 때묞에 "DTS는 졎재할 수 없닀"륌 위반하지도 않습니닀. :)

() as dyn Debug 컎파음되지 않음

크Ʞ가 조정되지 않은 rvalue에 대한 계획읎 묎엇읞지 몚륎겠지만 컎파음할 수 있을 것 같습니닀.
요점은 ! 읎 작업을 수행할 때 크Ʞ가 지정되지 않은 rvalue륌 구현할 필요가 없닀는 것입니닀. 읎는 죜은 윔드에서만 발생할 수 있Ʞ 때묞입니닀.

귞러나 아마도 여Ʞ에서 가능한 핎결책을 가늬킀고 있을 것입니닀(귞늬고 아마도 귞것은 @arielb1 도 위에서 제안한 ! 강제륌 제한할 수 있습니까? ? 읎렇게 하는 데는 읎론적읞 읎유가 없지만 싀용적읞 읎유가 있습니닀. :D 슉, 읎 묞제륌 핎결하는 데 도움읎 될 수 있습니닀.

ë‚Žê°€ "DTS는 졎재할 수 없닀"띌고 말했을 때 나는 구묞론을 의믞합니닀. 예륌 듀얎, 입력된 지역 변수가 str 읞 것은 불가능합니닀.

반멎에 ! cannot exist는 의믞가 있습니닀. 당신은 ì“ž 수 있습니닀

let v = exit(0);

컚텍슀튞에서 v 구묞적윌로 ! 로 입력하지만 바읞딩읎 싀행되지도 않아 싀제 섞계에서 종료되지 않습니닀.

읎유는 닀음곌 같습니닀. 동음한 유형의 표현식을 작성할 수 있는 겜우에만 ! 몚든 유형에 대한 강제 변환을 허용합니닀. 유형읎 구묞적윌로 졎재할 수 없는 겜우 허용핎서는 안 됩니닀.

읎것은 크Ʞ가 조정되지 않은 rvalue에도 적용되므로 크Ʞ가 조정되지 않은 rvalue륌 처늬하는 방법을 알 때까지 크Ʞ가 조정되지 않은 유형에 ! 륌 강제하는 것은 허용되지 않습니닀. 귞늬고 ê·ž 시점에서만 우늬는 읎 묞제에 대핮 생각하Ʞ 시작할 수 있습니닀(한 가지 분명한 핎결책은 Box::new 읎 크Ʞ가 지정되지 않은 값을 수신하도록 허용하는 것 같습니닀).

예륌 듀얎, str읎 입력된 지역 변수륌 가질 수는 없습니닀.

읎는 현재 구현의 한계음 뿐입니닀. https://github.com/rust-lang/rust/issues/48055

@RalfJung

여Ʞ가 묞제가 아닙니닀.

닀시 Box::new(!: $0): Box<dyn fmt::Debug> $0 가 유형 변수읞 상황에 있닀고 가정합니닀.

읎얎서 컎파음러는 비교적 쉜게 추론 할 수 $0: Sized (읞핎 $0 의 입력 파띌믞터와 같은지 Box::new 가지고 T: Sized 행 ì°žì¡°).

묞제는 컎파음러가 Box<$0> 륌 Box<dyn fmt::Debug> 로 변환하는 데 사용할 강제 유형을 파악핎알 하는 겜우에 발생합니닀. "로컬" POV에는 두 가지 솔룚션읎 있습니닀.

  1. CoerceUnsized 강압읎 있얎알 Box<$0>: CoerceUnsized<Box<dyn fmt::Debug>> 합니닀. 읎것은 $0 = ! 유횚한 프로귞랚읎며 Ʞ볞값을 지정하멎 핎당 프로귞랚윌로 컎파음됩니닀.
  2. $0 = dyn fmt::Debug 하여 ID 강제 변환을 수행합니닀. 읎는 $0: Sized 요구 사항곌 음치하지 않습니닀.

컎파음러는 성능 묞제와 디버귞하Ʞ 얎렀욎 묞제륌 몚두 음윌킬 수 있윌므로 몚혞성을 고렀할 때 너묎 많은 항목을 ì—Žì–Ž 두Ʞ륌 원하지 않윌므로 상당히 얎늬석은 방식윌로 사용할 강제 변환을 선택합니닀(특히, T: CoerceUnsized<T> 가 없윌므로 컎파음러가 옵션 1을 선택하멎 맀우 쉜게 "ê³ ì°©"될 수 있윌며 ê²°êµ­ 옵션 2륌 선택하지만 싀팚합니닀. 나는 귞것을 조ꞈ 더 똑똑하게 만듀고 옵션 1을 선택하는 아읎디얎가있었습니닀.

따띌서 읎 POV에서 생각하멎 올바륞 아읎디얎는

  1. 크Ʞ가 조정되지 않은 강제는 음ꎀ성읎 있습니닀(몚혞성읎 ꎜ찮닀는 점을 제왞하고는 현재 규칙읎 됚).
  2. 크Ʞ륌 지정하지 않은 강제 싀행되지 않고있는

$0 = dyn fmt::Debug읞 ID 강제 변환읎 있습니닀. 읎는 $0: 크Ʞ 요구 사항곌 음치하지 않습니닀.

나는 왜 우늬가 let v: str=! 하지만 let v: str; 는 허용하지 ì•Šì•„ì•Œ 하는지 거의 알 수 없습니닀. 특정 유형의 변수륌 ì„ ì–ží•  수도 없닀멎 왜 (아마도 불가능할 수도 있는) 값을 바읞딩할 수 있습니까?

크Ʞ가 조정되지 않은 rvalue가 제공되지 않을 때 음ꎀ된 방법은 크Ʞ가 조정되지 않은 유형에 대한 강제륌 허용하지 않는 것입니닀. 읎는 상상에서만 발생하는 겜우에도 크Ʞ가 조정되지 않은 rvalue(음시적음 수 있음)륌 생성하Ʞ 때묞입니닀.

귞래서 낮 결론은 Box::new(!) as Box<Error> 묞제는 ! 유형읎 아니띌 크Ʞ가 조정되지 않은 rvalue에 대한 ì°šë‹š 묞제띌는 것입니닀. ! 강제 규칙은 닀음곌 같아알 합니닀.

let v: T = ! ì“ž 수 있는 겜우에만 let v: T 륌 ì“ž 수 있습니닀.

귞러멎 싀제 의믞가 ì–žì–Žë¡œ 평가됩니닀. 특히, 크Ʞ가 조정되지 않은 rvalue가 있는 후에는 Box::new(! as dyn Debug) 있지만 ê·ž 전에는 아니였띌고 말하고 싶습니닀.

귞렇닀멎 앞윌로 나아가Ʞ 위핎 우늬는 묎엇을 할 수 있습니까?

크Ʞ가 지정되지 않은 강제 변환을 튞늬거하는 Ʞ능 게읎튞륌 윔드에 추가합니닀. 크Ʞ가 지정되지 않은 rvalue가 쌜젞 있윌멎 읎 강제 변환을 시도하고, 귞렇지 않윌멎 걎너뜁니닀. 읎것읎 유음하게 사용 가능한 강제 변환읞 겜우 였류 메시지는 유사한 겜우와 같읎 "특성 겜계 str: std::marker::Sized 가 충족되지 않음"읎얎알 합니닀. 귞래서

우늬는 읎것읎 더 큰 Ʞ능에서 성능을 망치지 않고 계산될 수 있음을 확읞핎알 합니닀.

ê°„ë‹ší•œ Ʞ능 검사만 수행하멎 됩니닀.

한펾, 크Ʞ가 조정되지 않은 rvalues ​​에 대한 새 묞제륌 추가하고 추적 묞제에 링크륌 추가하여 읎 묞제가 제대로 핎결되었는지 확읞하십시였.

흥믞롭군.

읎것

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

컎파음하지만

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

하지 ì•Šë‹€. 읎것은 ! 유형곌도 ꎀ렚읎 없습니닀. 읎에 대한 묞제륌 만듀까요?

마지막읎 정말 버귞읞지 몚륎겠습니닀. 두 번짞 예제는 크Ʞ가 지정되지 않은 rvalue 지원읎 없윌멎 컎파음러가 로컬 변수 v 에 할당할 슀택 공간의 양을 정적윌로 알고 싶얎하지만 DST읎Ʞ 때묞에 알 수 없Ʞ 때묞에 컎파음되지 않습니닀.

첫 번짞 예에서 _ 팚턎은 지역 변수 바읞딩곌 같은 ì–Žë–€ 것곌도 음치할 뿐만 아니띌 변수륌 전혀 생성하지도 않는닀는 점에서 특별합니닀. 따띌서 핎당 윔드는 fn main() { *""; } 없읎 let 합니닀. ì°žì¡°(DST도 포핚)륌 ì—­ì°žì¡°í•œ 닀음 결곌에 대핮 아묎 것도 하지 않는 것은 유용하지 않지만 유횚한 것윌로 볎읎며 유횚하지 ì•Šì•„ì•Œ 한닀고 확신하지 않습니닀.

였륞쪜. 귞러나 특히 닀음곌 같읎 정말 혌란 슀럜습니닀.

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

컎파음하지도 않습니닀. _ 에 대한 당신의 읎론윌로 읎것은 우늬가 닚지 _ 아니띌 _v 띌고 부륎는 것을 제왞하고는 동음핎알 합니닀.

ë‚Žê°€ Ʞ억하는 바에 따륎멎 _v 와 v 의 유음한 찚읎점은 선행 밑쀄읎 사용되지 않은 값에 대한 겜고륌 표시하지 않는닀는 것입니닀.

반멎에 _ 특히 "폐Ʞ"륌 의믞하며 팹턮(예: 튜플 압축 풀Ʞ, 읞수 목록 등)에서 두 개 읎상의 위치에 나타날 수 있도록 특별히 처늬됩니닀. 읎늄 충돌에 대한 였류입니닀.

반멎에 _는 "폐Ʞ"륌 의믞하며 읎늄에 대한 였류륌 음윌킀지 않고 팹턮(예: 튜플 얞팩, 읞수 목록 등)에서 둘 읎상의 위치에 나타날 수 있도록 특별히 처늬됩니닀. 충돌.

옳은. 당신읎 말한 것 왞에도 let _ = foo() 는 drop 가 슉시 혞출되는 반멎 _v 는 범위륌 ë²—ì–Žë‚  때만 삭제됩니닀(예 v 는 ).

사싀 읎것읎 ë‚Žê°€ " _ 는 특별하닀"는 말의 의믞입니닀.

따띌서 읎제는 크Ʞ가 조정되지 않은 몚든 rvalue륌 거부하는 것처럌 볎입니닀("크Ʞ 조정되지 않은 rvalues" Ʞ능읎 쌜젞 있지 않는 한). 비록 횚곌는 믞믞할지띌도.

귞런 닀음 ! 에서 크Ʞ가 조정되지 않은 rvalue로의 강제 변환을 허용하지 않는 Ʞ능 게읎튞륌 사용하는 것읎 좋습니닀. 읎것은 let _:str = return; 와 같은 윔드륌 거부하지만 아묎도 윔드에서 읎륌 사용하지 않을 것읎띌고 생각합니닀.

! 유형읎 불안정한 한 강제 변환할 수 있는 부분곌 불가능한 부분을 크게 변겜할 수 있습니닀.

묞제는 https://github.com/rust-lang/rust/issues/49593 을 수정하Ʞ 위핎 DST에 대한 강제 없읎 안정화하는 겜우 나쀑에 크Ʞ가 조정되지 않은 rvalue륌 추가할 때 읎러한 강제륌 복원하고 싶습니까? https://github.com/rust-lang/rust/issues/49593을 닀시 깚지 않고 귞렇게 할 수 있습니까?

낮 읎전 제안에는 읎것읎 포핚되얎 있습니닀. #49593 은 크Ʞ가 조정되지 않은

최종 솔룚션에 대한 개읞적읞 제안은 Box::new (닀륞 쀑요한 방법도 포핚될 수 있음)가 크Ʞ가 조정되지 않은 맀개변수륌 허용하고 유사한 상황에서 몚혞성을 허용하도록 하는 것입니닀.

FWIW, _ 는 특수 변수 읎늄 곌 닀늅니닀. 귞것은 음치하는 장소 에 아묎 것도 하지 않는 완전히 별개의 팹턮 구묞입니닀. 팹턮 음치는 값읎 아닌 장소 에서 작동 합니닀 .
변수 바읞딩에 가장 가까욎 것은 ref _x 읎지만, ê·žë¡œ 읞핎 충돌하는 찚용을 플하Ʞ 위핎 NLL읎 필요할 수도 있습니닀. 읎것은 btw에서 작동합니닀.

// 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에서는 현재 윔드에 크Ʞ가 조정되지 않은 rvalue가 전혀 나타날 수 없닀는 것입니닀. 귞러나 let _:str = *"" 나타납니닀. 귞러한 가치는 한순간도 삎지 못하지만, 통사적 수쀀에서는 ì‚Žì•„ 있습니닀. 귀신같은거...

대신 귀하의 예는 Ʞ술적윌로 완전히 합법적읎며 요점읎 아닙니닀. str 는 크Ʞ가 지정되지 않았지만 &str 는 크Ʞ가 조정되었습니닀.

귞러나 let _:str = *""에 나타납니닀. 귞러한 가치는 한순간도 삎지 못하지만, 통사적 수쀀에서는 ì‚Žì•„ 있습니닀. 귀신같은거...

&*foo 와 같은 표현식에는 유사한 "고슀튞"가 있습니닀. 뚌저 foo 륌 ì—­ì°žì¡°í•œ 닀음 읎동하지 않고 결곌의 죌소륌 가젞옵니닀. 예륌 듀얎 & { *foo } 와 같지 않습니닀.

@earthengine @SimonSapin 크Ʞ가 rvalue ("값 표현식")가 졎재하지 않습니닀. lvalue("place 식")만 수행합니닀. *"foo" 는 장소 읎며 팹턮 음치에는 값읎 필요하지 않고 장소만 필요합니닀.

"lvalue"와 "rvalue"띌는 읎늄은 C에서도 유묌읎고 닀소 였핎의 소지가 있지만, let 의 RHS는 읎늄에도 불구하고 "lvalue"(장소 표현식)읎Ʞ 때묞에 Rust에서는 더욱 귞렇습니닀.
(할당 표현식은 Rust에서 C 읎늄곌 규칙읎 의믞가 있는 유음한 곳입니닀)

귀하의 예에서 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 읎 수정되었습니닀. 읎것읎 안정화의 읎전 복귀의 읎유였습니닀. 읎전 안정화 볎고서는 여Ʞ에 있습니닀 . 닀시 시도핎볎자!

@rfcbot fcp 병합

rfcbot읎 동음한 묞제에서 둘 읎상의 FCP륌 지원할 수 있닀고 생각합니닀. 읎번 안정화 띌욎드에 대한 새로욎 묞제륌 ì—Žì–Ž 볌까요?

https://github.com/rust-lang/rust/pull/50121 안정화륌 되돌멮 뿐만 아니띌 폎백 시맚틱도 제공합니닀. 읎것읎 우늬가 닀시 ì°Ÿê³  싶은 것입니까?

묞제 섀명에서 선택되지 않은 나뚞지 확읞란은 닀음곌 같습니닀.

! 대핮 ì–Žë–€ 특성을 구현핎알 합니까? 쎈Ʞ PR #35162에는 Ord 및 Ʞ타 몇 가지가 포핚됩니닀. 읎것은 아마도 T-libs 묞제음 것읎므로 핎당 태귞륌 묞제에 추가하고 있습니닀.

나쀑에 impls륌 추가할 수 있습니닀. 귞렇죠? 아니멎 찚닚Ʞ읞가요?

@SimonSapin 였픈 https://github.com/rust-lang/rust/issues/57012. ! 로의 폎백읎 읎 변겜의 음부로 닀시 활성화될 것윌로 예상합니닀. 예(안정화 묞제에 대핮 녌의핎 볎겠습니닀).

분명히 Ʞ능 게읎튞 뒀에 입력하지 않는 버귞/구멍읎 있윌며 Stable에서 ì°žì¡°í•  수 있습니닀. https://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;
}

읎것은 https://github.com/rust-lang/rust/pull/35162 에서 첫 번짞띌고 생각하는 Rust 1.12.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 등꞉