# Trait std::clone::Clone 1.0.0 [−] [src]

    #[lang = "clone"]
    pub trait Clone {
        fn clone(&self) -> Self;

        fn clone_from(&mut self, source: &Self) { ... }
    }

A common trait for the ability to explicitly duplicate an object.

Differs from `Copy` in that `Copy` is implicit and extremely inexpensive, while `Clone` is always explicit and may or may not be expensive. In order to enforce these characteristics, Rust does not allow you to reimplement `Copy`, but you may reimplement `Clone` and run arbitrary code.

Since `Clone` is more general than `Copy`, you can automatically make anything `Copy` be `Clone` as well.

## Derivable

This trait can be used with `#[derive]` if all fields are `Clone`. The `derive`d implementation of `clone` calls `clone` on each field.

## How can I implement `Clone`?

Types that are `Copy` should have a trivial implementation of `Clone`. More formally: if `T: Copy`, `x: T`, and `y: &T`, then `let x = y.clone();` is equivalent to `let x = *y;`. Manual implementations should be careful to uphold this invariant; however, unsafe code must not rely on it to ensure memory safety.

An example is an array holding more than 32 elements of a type that is `Clone`; the standard library only implements `Clone` up until arrays of size 32. In this case, the implementation of `Clone` cannot be `derive`d, but can be implemented as:

    #[derive(Copy)]
    struct Stats {
       frequencies: [i32; 100],
    }

    impl Clone for Stats {
        fn clone(&self) -> Stats { *self }
    }Run

## Required Methods

### `fn clone(&self) -> Self`

Returns a copy of the value.

# Examples

    let hello = "Hello"; // &str implements Clone

    assert_eq!("Hello", hello.clone());Run

## Provided Methods

### `fn clone_from(&mut self, source: &Self)`

Performs copy-assignment from `source`.

`a.clone_from(&b)` is equivalent to `a = b.clone()` in functionality, but can be overridden to reuse the resources of `a` to avoid unnecessary allocations.

## Implementors

- `impl<I> Clone for Utf16Encoder<I> where
  I: Clone,`
- `impl Clone for DecodeUtf16Error`
- `impl<I> Clone for DecodeUtf16<I> where
  I: Clone + Iterator<Item = u16>,`
- `impl<'a> Clone for SplitWhitespace<'a>`
- `impl<'a, T> Clone for std::collections::linked_list::Iter<'a, T>`
- `impl Clone for ExchangeHeapSingleton`
- `impl<'a, T> Clone for std::collections::vec_deque::Iter<'a, T>`
- `impl<T> Clone for Box<[T]> where
  T: Clone,`
- `impl<T> Clone for Bound<T> where
  T: Clone,`
- `impl<T> Clone for std::sync::Weak<T> where
  T: ?Sized,`
- `impl<T> Clone for VecDeque<T> where
  T: Clone,`
- `impl<'a> Clone for EncodeUtf16<'a>`
- `impl<'a, T> Clone for std::collections::btree_set::SymmetricDifference<'a, T>`
- `impl<T> Clone for std::collections::vec_deque::IntoIter<T> where
  T: Clone,`
- `impl<T> Clone for std::vec::IntoIter<T> where
  T: Clone,`
- `impl<'a, B> Clone for Cow<'a, B> where
  B: ToOwned + ?Sized,`
- `impl<'a, K, V> Clone for std::collections::btree_map::Range<'a, K, V>`
- `impl<'a, K, V> Clone for std::collections::btree_map::Keys<'a, K, V>`
- `impl<'a, T> Clone for std::collections::btree_set::Union<'a, T>`
- `impl<K, V> Clone for BTreeMap<K, V> where
  K: Clone,
  V: Clone,`
- `impl<T> Clone for std::collections::linked_list::IntoIter<T> where
  T: Clone,`
- `impl<T> Clone for std::collections::binary_heap::IntoIter<T> where
  T: Clone,`
- `impl<T> Clone for Arc<T> where
  T: ?Sized,`
- `impl Clone for CannotReallocInPlace`
- `impl Clone for AllocErr`
- `impl<T> Clone for Box<T> where
  T: Clone,`
- `impl<T> Clone for Vec<T> where
  T: Clone,`
- `impl Clone for Box<str>`
- `impl<'a, T> Clone for std::collections::btree_set::Iter<'a, T>`
- `impl<'a, T> Clone for std::collections::btree_set::Difference<'a, T>`
- `impl Clone for Layout`
- `impl<T> Clone for Rc<T> where
  T: ?Sized,`
- `impl<T> Clone for BinaryHeap<T> where
  T: Clone,`
- `impl<T> Clone for BTreeSet<T> where
  T: Clone,`
- `impl<'a, K, V> Clone for std::collections::btree_map::Values<'a, K, V>`
- `impl Clone for String`
- `impl<'a, K, V> Clone for std::collections::btree_map::Iter<'a, K, V>`
- `impl<'a, T> Clone for std::collections::btree_set::Intersection<'a, T>`
- `impl<T> Clone for std::rc::Weak<T> where
  T: ?Sized,`
- `impl<'a, T> Clone for std::collections::btree_set::Range<'a, T>`
- `impl Clone for Heap`
- `impl<T> Clone for LinkedList<T> where
  T: Clone,`
- `impl Clone for ParseError`
- `impl<'a, T> Clone for std::collections::binary_heap::Iter<'a, T>`
- `impl Clone for _Unwind_Action`
- `impl Clone for _Unwind_Reason_Code`
- `impl Clone for XorShiftRng`
- `impl Clone for StandardNormal`
- `impl Clone for Exp1`
- `impl Clone for Exp`
- `impl Clone for Isaac64Rng`
- `impl Clone for Normal`
- `impl Clone for ReseedWithDefault`
- `impl Clone for IsaacRng`
- `impl Clone for LogNormal`
- `impl Clone for ChaChaRng`
- `impl Clone for sockaddr_storage`
- `impl Clone for sigevent`
- `impl Clone for spwd`
- `impl Clone for ff_condition_effect`
- `impl Clone for pthread_rwlockattr_t`
- `impl Clone for user`
- `impl Clone for pthread_rwlock_t`
- `impl Clone for sigset_t`
- `impl Clone for _libc_fpreg`
- `impl Clone for __timeval`
- `impl Clone for Dl_info`
- `impl Clone for tm`
- `impl Clone for termios`
- `impl Clone for mmsghdr`
- `impl Clone for msginfo`
- `impl Clone for cmsghdr`
- `impl Clone for linger`
- `impl Clone for group`
- `impl Clone for hostent`
- `impl Clone for msghdr`
- `impl Clone for input_absinfo`
- `impl Clone for ucred`
- `impl Clone for user_fpxregs_struct`
- `impl Clone for pollfd`
- `impl Clone for statfs`
- `impl Clone for sysinfo`
- `impl Clone for signalfd_siginfo`
- `impl Clone for libc::unix::notbsd::linux::other::b32::stat`
- `impl Clone for input_keymap_entry`
- `impl Clone for mq_attr`
- `impl Clone for ff_periodic_effect`
- `impl Clone for dirent`
- `impl Clone for rlimit64`
- `impl Clone for sockaddr_un`
- `impl Clone for sockaddr_ll`
- `impl Clone for passwd`
- `impl Clone for input_id`
- `impl Clone for ff_replay`
- `impl Clone for sockaddr`
- `impl Clone for tms`
- `impl Clone for in6_addr`
- `impl Clone for timeval`
- `impl Clone for pthread_mutex_t`
- `impl Clone for itimerval`
- `impl Clone for ip_mreq`
- `impl Clone for statfs64`
- `impl Clone for fsid_t`
- `impl Clone for sembuf`
- `impl Clone for stack_t`
- `impl Clone for stat64`
- `impl Clone for sockaddr_in`
- `impl Clone for utsname`
- `impl Clone for user_fpregs_struct`
- `impl Clone for cpu_set_t`
- `impl Clone for utimbuf`
- `impl Clone for sched_param`
- `impl Clone for in_addr`
- `impl Clone for flock`
- `impl Clone for sigaction`
- `impl Clone for ff_trigger`
- `impl Clone for statvfs`
- `impl Clone for ff_effect`
- `impl Clone for input_mask`
- `impl Clone for addrinfo`
- `impl Clone for utmpx`
- `impl Clone for dirent64`
- `impl Clone for __exit_status`
- `impl Clone for fd_set`
- `impl Clone for if_nameindex`
- `impl Clone for mcontext_t`
- `impl Clone for ucontext_t`
- `impl Clone for pthread_condattr_t`
- `impl Clone for sockaddr_nl`
- `impl Clone for itimerspec`
- `impl Clone for glob_t`
- `impl Clone for ipv6_mreq`
- `impl Clone for lconv`
- `impl Clone for ifaddrs`
- `impl Clone for iovec`
- `impl Clone for statvfs64`
- `impl Clone for ff_constant_effect`
- `impl Clone for sem_t`
- `impl Clone for pthread_attr_t`
- `impl Clone for rusage`
- `impl Clone for winsize`
- `impl Clone for ff_envelope`
- `impl Clone for sigval`
- `impl Clone for siginfo_t`
- `impl Clone for _libc_fpstate`
- `impl Clone for ff_rumble_effect`
- `impl Clone for dqblk`
- `impl Clone for input_event`
- `impl Clone for sockaddr_in6`
- `impl Clone for user_regs_struct`
- `impl Clone for rlimit`
- `impl Clone for aiocb`
- `impl Clone for glob64_t`
- `impl Clone for pthread_mutexattr_t`
- `impl Clone for ipc_perm`
- `impl Clone for timespec`
- `impl Clone for pthread_cond_t`
- `impl Clone for shmid_ds`
- `impl Clone for msqid_ds`
- `impl Clone for ff_ramp_effect`
- `impl Clone for epoll_event`
- `impl<Idx> Clone for RangeToInclusive<Idx> where
  Idx: Clone,`
- `impl Clone for SipHasher24`
- `impl<'a, P> Clone for RSplitN<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<'a, P> Clone for SplitN<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<T> Clone for Cell<T> where
  T: Copy,`
- `impl<I, U, F> Clone for FlatMap<I, U, F> where
  F: Clone,
  I: Clone,
  U: Clone + IntoIterator,
  <U as IntoIterator>::IntoIter: Clone,
  <U as IntoIterator>::IntoIter: Clone,`
- `impl<I> Clone for DecodeUtf8<I> where
  I: Clone + Iterator<Item = u8>,`
- `impl Clone for ParseCharError`
- `impl<I> Clone for Cycle<I> where
  I: Clone,`
- `impl<T> Clone for Option<T> where
  T: Clone,`
- `impl<I, F> Clone for Inspect<I, F> where
  F: Clone,
  I: Clone,`
- `impl<T> Clone for NonZero<T> where
  T: Zeroable + Clone,`
- `impl<'a, 'b> Clone for CharSliceSearcher<'a, 'b>`
- `impl<T, E> Clone for Result<T, E> where
  E: Clone,
  T: Clone,`
- `impl<A> Clone for std::option::IntoIter<A> where
  A: Clone,`
- `impl<T> Clone for Once<T> where
  T: Clone,`
- `impl<'a> Clone for CharIndices<'a>`
- `impl Clone for RangeFull`
- `impl Clone for std::cmp::Ordering`
- `impl<I, P> Clone for SkipWhile<I, P> where
  I: Clone,
  P: Clone,`
- `impl<I, St, F> Clone for Scan<I, St, F> where
  F: Clone,
  I: Clone,
  St: Clone,`
- `impl Clone for EscapeDefault`
- `impl<T> Clone for RefCell<T> where
  T: Clone,`
- `impl<A, B> Clone for Zip<A, B> where
  A: Clone,
  B: Clone,`
- `impl<'a> Clone for Bytes<'a>`
- `impl<Idx> Clone for RangeTo<Idx> where
  Idx: Clone,`
- `impl<I> Clone for Take<I> where
  I: Clone,`
- `impl Clone for TryFromIntError`
- `impl Clone for SipHasher`
- `impl<'a, F> Clone for CharPredicateSearcher<'a, F> where
  F: Clone + FnMut(char) -> bool,`
- `impl<'a, T> Clone for Chunks<'a, T>`
- `impl<T> Clone for Wrapping<T> where
  T: Clone,`
- `impl<'a, P> Clone for Matches<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl Clone for SearchStep`
- `impl<'a, P> Clone for RMatches<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<'a, 'b> Clone for StrSearcher<'a, 'b>`
- `impl<'a, T, P> Clone for std::slice::RSplit<'a, T, P> where
  P: Clone + FnMut(&T) -> bool,
  T: 'a + Clone,`
- `impl<T> Clone for Shared<T> where
  T: ?Sized,`
- `impl<'a, P> Clone for RSplitTerminator<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl Clone for Error`
- `impl<Idx> Clone for std::ops::Range<Idx> where
  Idx: Clone,`
- `impl Clone for ParseBoolError`
- `impl<'a> Clone for Chars<'a>`
- `impl<I, F> Clone for FilterMap<I, F> where
  F: Clone,
  I: Clone,`
- `impl<'a, A> Clone for std::option::Iter<'a, A>`
- `impl Clone for FpCategory`
- `impl<H> Clone for BuildHasherDefault<H>`
- `impl<'a, T> Clone for std::slice::Iter<'a, T>`
- `impl<'a, P> Clone for MatchIndices<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<I> Clone for Skip<I> where
  I: Clone,`
- `impl<I> Clone for Fuse<I> where
  I: Clone,`
- `impl<T> Clone for Discriminant<T>`
- `impl<T> Clone for PhantomData<T> where
  T: ?Sized,`
- `impl<'a, P> Clone for SplitTerminator<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<T> Clone for Empty<T>`
- `impl<I> Clone for Peekable<I> where
  I: Clone + Iterator,
  <I as Iterator>::Item: Clone,`
- `impl<'a, P> Clone for RMatchIndices<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<I> Clone for Cloned<I> where
  I: Clone,`
- `impl<Idx> Clone for RangeFrom<Idx> where
  Idx: Clone,`
- `impl Clone for SipHasher13`
- `impl<'a, T> Clone for Windows<'a, T>`
- `impl<A, B> Clone for Chain<A, B> where
  A: Clone,
  B: Clone,`
- `impl Clone for TraitObject`
- `impl Clone for TypeId`
- `impl<I> Clone for Enumerate<I> where
  I: Clone,`
- `impl<'a> Clone for Lines<'a>`
- `impl<A> Clone for Repeat<A> where
  A: Clone,`
- `impl<T> Clone for Rev<T> where
  T: Clone,`
- `impl<I, P> Clone for TakeWhile<I, P> where
  I: Clone,
  P: Clone,`
- `impl Clone for ParseFloatError`
- `impl Clone for EscapeDebug`
- `impl<'a, P> Clone for std::str::RSplit<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl<I> Clone for StepBy<I> where
  I: Clone,`
- `impl Clone for EscapeUnicode`
- `impl<Idx> Clone for RangeInclusive<Idx> where
  Idx: Clone,`
- `impl<I, F> Clone for Map<I, F> where
  F: Clone,
  I: Clone,`
- `impl Clone for Utf8Error`
- `impl Clone for ParseIntError`
- `impl<'a> Clone for CharSearcher<'a>`
- `impl Clone for CharTryFromError`
- `impl<'a, P> Clone for std::str::Split<'a, P> where
  P: Pattern<'a>,
  <P as Pattern<'a>>::Searcher: Clone,`
- `impl Clone for std::sync::atomic::Ordering`
- `impl<'a> Clone for LinesAny<'a>`
- `impl<T> Clone for Unique<T> where
  T: ?Sized,`
- `impl<'a> Clone for Arguments<'a>`
- `impl<'a, T, P> Clone for std::slice::Split<'a, T, P> where
  P: Clone + FnMut(&T) -> bool,`
- `impl<'a, T> Clone for std::result::Iter<'a, T>`
- `impl<I, P> Clone for Filter<I, P> where
  I: Clone,
  P: Clone,`
- `impl Clone for LocalKeyState`
- `impl Clone for ThreadId`
- `impl Clone for Thread`
- `impl<K: Clone, V: Clone, S: Clone> Clone for HashMap<K, V, S>`
- `impl<'a, K, V> Clone for std::collections::hash_map::Iter<'a, K, V>`
- `impl<'a, K, V> Clone for std::collections::hash_map::Keys<'a, K, V>`
- `impl<'a, K, V> Clone for std::collections::hash_map::Values<'a, K, V>`
- `impl Clone for RandomState`
- `impl Clone for DefaultHasher`
- `impl<T: Clone, S: Clone> Clone for HashSet<T, S>`
- `impl<'a, K> Clone for std::collections::hash_set::Iter<'a, K>`
- `impl<'a, T, S> Clone for std::collections::hash_set::Intersection<'a, T, S>`
- `impl<'a, T, S> Clone for std::collections::hash_set::Difference<'a, T, S>`
- `impl<'a, T, S> Clone for std::collections::hash_set::SymmetricDifference<'a, T, S>`
- `impl<'a, T, S> Clone for std::collections::hash_set::Union<'a, T, S>`
- `impl Clone for VarError`
- `impl Clone for CString`
- `impl Clone for NulError`
- `impl Clone for FromBytesWithNulError`
- `impl Clone for IntoStringError`
- `impl Clone for OsString`
- `impl Clone for Metadata`
- `impl Clone for OpenOptions`
- `impl Clone for Permissions`
- `impl Clone for FileType`
- `impl<T: Clone> Clone for Cursor<T>`
- `impl Clone for ErrorKind`
- `impl Clone for SeekFrom`
- `impl Clone for IpAddr`
- `impl Clone for Ipv6MulticastScope`
- `impl Clone for Ipv4Addr`
- `impl Clone for Ipv6Addr`
- `impl Clone for std::net::SocketAddr`
- `impl Clone for SocketAddrV4`
- `impl Clone for SocketAddrV6`
- `impl Clone for AddrParseError`
- `impl Clone for Shutdown`
- `impl Clone for std::os::linux::raw::stat`
- `impl<'a> Clone for Prefix<'a>`
- `impl<'a> Clone for PrefixComponent<'a>`
- `impl<'a> Clone for Component<'a>`
- `impl<'a> Clone for Components<'a>`
- `impl<'a> Clone for std::path::Iter<'a>`
- `impl Clone for PathBuf`
- `impl Clone for StripPrefixError`
- `impl Clone for Output`
- `impl Clone for ExitStatus`
- `impl<T: Clone> Clone for SendError<T>`
- `impl Clone for RecvError`
- `impl Clone for TryRecvError`
- `impl Clone for RecvTimeoutError`
- `impl<T: Clone> Clone for TrySendError<T>`
- `impl<T> Clone for Sender<T>`
- `impl<T> Clone for SyncSender<T>`
- `impl Clone for WaitTimeoutResult`
- `impl Clone for Duration`
- `impl Clone for Instant`
- `impl Clone for SystemTime`
- `impl Clone for SystemTimeError`
- `impl<'a> Clone for EncodeWide<'a>`
- `impl Clone for std::os::unix::net::SocketAddr`

# Help

## Keyboard Shortcuts

?
  Show this help dialog
S
  Focus the search field
⇤
  Move up in search results
⇥
  Move down in search results
⏎
  Go to active search result
+
  Collapse/expand all sections

## Search Tricks

Prefix searches with a type followed by a colon (e.g. `fn:`) to restrict the search to a given type.

Accepted types are: `fn`, `mod`, `struct`, `enum`, `trait`, `type`, `macro`, and `const`.

Search functions by type signature (e.g. `vec -> usize` or `* -> vec`)