@@ -552,6 +552,12 @@ pub fn swap<T>(x: &mut T, y: &mut T) {
552
552
/// mem::take(&mut self.buf)
553
553
/// }
554
554
/// }
555
+ ///
556
+ /// let mut buffer = Buffer { buf: vec![0, 1] };
557
+ /// assert_eq!(buffer.buf.len(), 2);
558
+ ///
559
+ /// assert_eq!(buffer.get_and_reset(), vec![0, 1]);
560
+ /// assert_eq!(buffer.buf.len(), 0);
555
561
/// ```
556
562
///
557
563
/// [`Clone`]: ../../std/clone/trait.Clone.html
@@ -586,17 +592,17 @@ pub fn take<T: Default>(dest: &mut T) -> T {
586
592
/// struct Buffer<T> { buf: Vec<T> }
587
593
///
588
594
/// impl<T> Buffer<T> {
589
- /// fn get_and_reset (&mut self) -> Vec<T> {
595
+ /// fn replace_index (&mut self, i: usize, v: T ) -> T {
590
596
/// // error: cannot move out of dereference of `&mut`-pointer
591
- /// let buf = self.buf;
592
- /// self.buf = Vec::new() ;
593
- /// buf
597
+ /// let t = self.buf[i] ;
598
+ /// self.buf[i] = v ;
599
+ /// t
594
600
/// }
595
601
/// }
596
602
/// ```
597
603
///
598
- /// Note that `T` does not necessarily implement [`Clone`], so it can't even clone and reset
599
- /// `self.buf`. But `replace` can be used to disassociate the original value of `self.buf` from
604
+ /// Note that `T` does not necessarily implement [`Clone`], so we can't even clone `self.buf[i]` to
605
+ /// avoid the move. But `replace` can be used to disassociate the original value at that index from
600
606
/// `self`, allowing it to be returned:
601
607
///
602
608
/// ```
@@ -605,10 +611,16 @@ pub fn take<T: Default>(dest: &mut T) -> T {
605
611
///
606
612
/// # struct Buffer<T> { buf: Vec<T> }
607
613
/// impl<T> Buffer<T> {
608
- /// fn get_and_reset (&mut self) -> Vec<T> {
609
- /// mem::replace(&mut self.buf, Vec::new() )
614
+ /// fn replace_index (&mut self, i: usize, v: T ) -> T {
615
+ /// mem::replace(&mut self.buf[i], v )
610
616
/// }
611
617
/// }
618
+ ///
619
+ /// let mut buffer = Buffer { buf: vec![0, 1] };
620
+ /// assert_eq!(buffer.buf[0], 0);
621
+ ///
622
+ /// assert_eq!(buffer.replace_index(0, 2), 0);
623
+ /// assert_eq!(buffer.buf[0], 2);
612
624
/// ```
613
625
///
614
626
/// [`Clone`]: ../../std/clone/trait.Clone.html
0 commit comments