क्या यह सच है कि सभी प्रकारों के लिए `टी`,` यू` यदि `टी` को` यू` के लिए मजबूर किया जाता है तो `एंड टी` को` और यू` के लिए मजबूर किया जाता है?
यह अच्छी तरह से प्रलेखित है जो [T; n]
करने के लिए मजबूर कर सकता है [T]
। निम्नलिखित कोड भी अच्छी तरह से गठित है :
fn test(){
let _a: &[i32] = &[1, 2, 3];
}
यहाँ हमारे पास वह करने के &[T; n]
लिए मजबूर है &[T]
।
यह सही है कि सभी प्रकार के लिए T
, U
अगर T
करने के लिए मजबूर किया जाता है U
तो &T
करने के लिए मजबूर कर रहा है &U
?
यह संदर्भ में प्रलेखित नहीं है (कम से कम स्पष्ट रूप से)।
जवाब
नहीं, क्योंकि &
इसके विफल होने की एक और परत को जोड़ना :
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 केवल जगह सूचक किसी तरह पीछे ले।