2016-02-08 6 views
5

मैंने देखा है कि ?Sized, कुछ कार्यों (borrow, borrow_state, और borrow_mut) के लिए प्रकार पैरामीटर T पर एक बाध्य है, हालांकि, यह है नहींnew या into_inner के लिए एक समयबद्ध। यदि मैं RefCell नहीं बना सकता जो गतिशील रूप से आकार (RefCell<T : ?Sized>) है, तो ऐसे कार्यों में कितना अच्छा काम हो सकता है?क्यों है? कुछ रेफसेल कार्यों के लिए बाध्य आकार, लेकिन सभी नहीं?

उत्तर

4

वह समर्थन added in a commit that also added tests था। हम यह देखने के लिए कि यह कैसे उपयोग होने की उम्मीद थी उन परीक्षण देख सकते हैं:

use std::cell::RefCell; 

#[test] 
fn refcell_unsized() { 
    let cell: &RefCell<[i32]> = &RefCell::new([1, 2, 3]); 
    { 
     let b = &mut *cell.borrow_mut(); 
     b[0] = 4; 
     b[2] = 5; 
    } 
    let comp: &mut [i32] = &mut [4, 2, 5]; 
    assert_eq!(&*cell.borrow(), comp); 
} 

तुम हमेशा के रूप में संकलक स्थान की मात्रा ढेर पर आवंटित करने के लिए पता करने की जरूरत है एक Sized बाध्य के साथ एक निर्माता की आवश्यकता है। एक बार आपके पास हो जाने के बाद, आप गतिशील रूप से आकार के लिए मजबूर कर सकते हैं।

+0

क्या यह 'रेफसेल ' बनाना संभव है? मैंने 'RefCell :: new (x) को RefCell ' के रूप में आजमाया है, हालांकि, मुझे एक त्रुटि मिल रही है कि 'आकार' 'किसी भी 'के लिए लागू नहीं किया गया है। दूसरी ओर, 'बॉक्स :: नया (एक्स) बॉक्स ' ठीक काम करता है। ऐसा लगता है कि समान 'आकार' प्रतिबंध हैं। मैं क्या खो रहा हूँ? https://play.rust-lang.org/?gist=5af8c51ac91d162d999f&version=stable – Matt

+0

@ मैट एक दिलचस्प सवाल है। मुझे जवाब नहीं पता, लेकिन अगर आप सोचते हैं कि यह उपयोगी संदर्भ प्रदान करता है, तो मैं आपको इस सवाल पर वापस लिंक करने के लिए एक नया प्रश्न पूछने के लिए प्रोत्साहित करता हूं। – Shepmaster

संबंधित मुद्दे