क्या यह सच है कि सभी प्रकारों के लिए `टी`,` यू` यदि `टी` को` यू` के लिए मजबूर किया जाता है तो `एंड टी` को` और यू` के लिए मजबूर किया जाता है?

Aug 17 2020

यह अच्छी तरह से प्रलेखित है जो [T; n]करने के लिए मजबूर कर सकता है [T]। निम्नलिखित कोड भी अच्छी तरह से गठित है :

fn test(){
    let _a: &[i32] = &[1, 2, 3];
}

यहाँ हमारे पास वह करने के &[T; n]लिए मजबूर है &[T]

यह सही है कि सभी प्रकार के लिए T, Uअगर Tकरने के लिए मजबूर किया जाता है Uतो &Tकरने के लिए मजबूर कर रहा है &U?

यह संदर्भ में प्रलेखित नहीं है (कम से कम स्पष्ट रूप से)।

जवाब

5 trentcl Aug 17 2020 at 19:54

नहीं, क्योंकि &इसके विफल होने की एक और परत को जोड़ना :

fn oops() {
    let a: &[i32; 3] = &[1, 2, 3];
    let _b: &&[i32] = &a;
}
error[E0308]: mismatched types
 --> src/lib.rs:8:23
  |
8 |     let _b: &&[i32] = &a;
  |             -------   ^^ expected slice `[i32]`, found array `[i32; 3]`
  |             |
  |             expected due to this
  |
  = note: expected reference `&&[i32]`
             found reference `&&[i32; 3]`

इसके अलावा, यह ऐसा नहीं है कि जो समान अर्थ में [T; n] सहवास करता [T] है, वैसा ही &[T; n] हो &[T] । आपके द्वारा लिंक किए गए दस्तावेज़ में अनियंत्रित ज़बरदस्ती से संबंधित दो लक्षण वर्णित हैं: Unsizeऔर CoerceUnsized[T; n]औजार Unsize<[T]>, और इसलिए &[T; n] औजार CoerceUnsized<&[T]>; यह अनिवार्य रूप से एक ही बात है, और आपका कोड प्रभावी रूप से दोनों को प्रदर्शित करता है। यह एक समारोह है कि coerces लिखने के लिए संभव नहीं होगा [T; n]करने के लिए [T] बिना संदर्भों का उपयोग (या किसी प्रकार की संकेत) क्योंकि unsizing coercions केवल जगह सूचक किसी तरह पीछे ले।