Trait nom::lib::std::prelude::v1::v1::Copy 1.0.0
[−]
[src]
#[lang = "copy"]pub trait Copy: Clone { }
Types whose values can be duplicated simply by copying bits.
By default, variable bindings have 'move semantics.' In other words:
#[derive(Debug)] struct Foo; let x = Foo; let y = x; // `x` has moved into `y`, and so cannot be used // println!("{:?}", x); // error: use of moved value
However, if a type implements Copy
, it instead has 'copy semantics':
// We can derive a `Copy` implementation. `Clone` is also required, as it's // a supertrait of `Copy`. #[derive(Debug, Copy, Clone)] struct Foo; let x = Foo; let y = x; // `y` is a copy of `x` println!("{:?}", x); // A-OK!
It's important to note that in these two examples, the only difference is whether you
are allowed to access x
after the assignment. Under the hood, both a copy and a move
can result in bits being copied in memory, although this is sometimes optimized away.
How can I implement Copy
?
There are two ways to implement Copy
on your type. The simplest is to use derive
:
#[derive(Copy, Clone)] struct MyStruct;
You can also implement Copy
and Clone
manually:
struct MyStruct; impl Copy for MyStruct { } impl Clone for MyStruct { fn clone(&self) -> MyStruct { *self } }
There is a small difference between the two: the derive
strategy will also place a Copy
bound on type parameters, which isn't always desired.
What's the difference between Copy
and Clone
?
Copies happen implicitly, for example as part of an assignment y = x
. The behavior of
Copy
is not overloadable; it is always a simple bit-wise copy.
Cloning is an explicit action, x.clone()
. The implementation of Clone
can
provide any type-specific behavior necessary to duplicate values safely. For example,
the implementation of Clone
for String
needs to copy the pointed-to string
buffer in the heap. A simple bitwise copy of String
values would merely copy the
pointer, leading to a double free down the line. For this reason, String
is Clone
but not Copy
.
Clone
is a supertrait of Copy
, so everything which is Copy
must also implement
Clone
. If a type is Copy
then its Clone
implementation only needs to return *self
(see the example above).
When can my type be Copy
?
A type can implement Copy
if all of its components implement Copy
. For example, this
struct can be Copy
:
struct Point { x: i32, y: i32, }
A struct can be Copy
, and i32
is Copy
, therefore Point
is eligible to be Copy
.
By contrast, consider
struct PointList { points: Vec<Point>, }
The struct PointList
cannot implement Copy
, because Vec<T>
is not Copy
. If we
attempt to derive a Copy
implementation, we'll get an error:
the trait `Copy` may not be implemented for this type; field `points` does not implement `Copy`
When can't my type be Copy
?
Some types can't be copied safely. For example, copying &mut T
would create an aliased
mutable reference. Copying String
would duplicate responsibility for managing the
String
's buffer, leading to a double free.
Generalizing the latter case, any type implementing Drop
can't be Copy
, because it's
managing some resource besides its own size_of::<T>
bytes.
If you try to implement Copy
on a struct or enum containing non-Copy
data, you will get
the error E0204.
When should my type be Copy
?
Generally speaking, if your type can implement Copy
, it should. Keep in mind, though,
that implementing Copy
is part of the public API of your type. If the type might become
non-Copy
in the future, it could be prudent to omit the Copy
implementation now, to
avoid a breaking API change.
Implementations on Foreign Types
impl Copy for RecvTimeoutError
[src]
impl Copy for ExitStatus
[src]
impl Copy for FileType
[src]
impl Copy for ExitCode
[src]
impl<'a> Copy for Ancestors<'a>
[src]
impl Copy for ErrorKind
[src]
impl Copy for TryRecvError
[src]
impl<'a> Copy for Prefix<'a>
[src]
impl Copy for SeekFrom
[src]
impl Copy for Ipv6Addr
[src]
impl<'a> Copy for Component<'a>
[src]
impl<'a> Copy for PrefixComponent<'a>
[src]
impl Copy for IpAddr
[src]
impl Copy for RecvError
[src]
impl Copy for ThreadId
[src]
impl<T> Copy for TrySendError<T> where
T: Copy,
[src]
T: Copy,
impl<T> Copy for SendError<T> where
T: Copy,
[src]
T: Copy,
impl Copy for SocketAddrV6
[src]
impl Copy for SocketAddrV4
[src]
impl Copy for SocketAddr
[src]
impl Copy for Shutdown
[src]
impl Copy for Ipv6MulticastScope
[src]
impl Copy for WaitTimeoutResult
[src]
impl Copy for Instant
[src]
impl Copy for Ipv4Addr
[src]
impl Copy for SystemTime
[src]
impl Copy for u8x8
[src]
impl Copy for FpCategory
[src]
impl Copy for u8x64
[src]
impl Copy for f32x8
[src]
impl Copy for i8x2
[src]
impl Copy for i32x4
[src]
impl<T> Copy for Wrapping<T> where
T: Copy,
[src]
T: Copy,
impl Copy for i16x2
[src]
impl Copy for i32x16
[src]
impl Copy for u16x4
[src]
impl Copy for __m128
[src]
impl Copy for CpuidResult
[src]
impl Copy for i8x8
[src]
impl Copy for i32x8
[src]
impl Copy for __m128i
[src]
impl Copy for u64x4
[src]
impl Copy for f32x4
[src]
impl Copy for b8x2
[src]
impl Copy for i16x16
[src]
impl Copy for i8x64
[src]
impl Copy for u16x32
[src]
impl Copy for i8x32
[src]
impl Copy for i16x4
[src]
impl Copy for b8x32
[src]
impl Copy for i64x4
[src]
impl Copy for u16x8
[src]
impl Copy for b8x64
[src]
impl Copy for u32x8
[src]
impl Copy for i16x8
[src]
impl Copy for f32x2
[src]
impl Copy for b8x4
[src]
impl Copy for __m256
[src]
impl Copy for __m128d
[src]
impl Copy for u16x2
[src]
impl<T> Copy for Unique<T> where
T: ?Sized,
[src]
T: ?Sized,
impl Copy for u32x4
[src]
impl Copy for u64x8
[src]
impl<T> Copy for NonZero<T> where
T: Zeroable + Copy,
[src]
T: Zeroable + Copy,
impl Copy for i64x2
[src]
impl<T> Copy for PhantomData<T> where
T: ?Sized,
[src]
T: ?Sized,
impl Copy for i8x16
[src]
impl Copy for __m256i
[src]
impl Copy for TypeId
[src]
impl Copy for TryFromIntError
[src]
impl Copy for u32x2
[src]
impl Copy for u64x2
[src]
impl Copy for Ordering
[src]
impl Copy for i32x2
[src]
impl Copy for i64x8
[src]
impl Copy for __m64
[src]
impl Copy for CharTryFromError
[src]
impl Copy for TryFromSliceError
[src]
impl<T> Copy for NonNull<T> where
T: ?Sized,
[src]
T: ?Sized,
impl Copy for f32x16
[src]
impl Copy for b8x8
[src]
impl Copy for __m256d
[src]
impl Copy for i8x4
[src]
impl Copy for u32x16
[src]
impl Copy for i16x32
[src]
impl Copy for u8x16
[src]
impl Copy for u8x32
[src]
impl Copy for u8x4
[src]
impl Copy for Duration
[src]
impl Copy for u16x16
[src]
impl Copy for TraitObject
[src]
impl Copy for b8x16
[src]
impl Copy for u8x2
[src]
impl Copy for f64x4
[src]
impl Copy for f64x2
[src]
impl Copy for f64x8
[src]
impl Copy for Heap
[src]
impl Copy for UnicodeVersion
[src]
impl Copy for timespec
[src]
impl Copy for segment_command
[src]
impl Copy for mach_header_64
[src]
impl Copy for sockaddr_inarp
[src]
impl Copy for stat
[src]
impl Copy for proc_threadinfo
[src]
impl Copy for proc_taskinfo
[src]
impl Copy for sigval
[src]
impl Copy for ipc_perm
[src]
impl Copy for pthread_mutex_t
[src]
impl Copy for kevent
[src]
impl Copy for itimerval
[src]
impl Copy for if_data
[src]
impl Copy for pthread_rwlock_t
[src]
impl Copy for tms
[src]
impl Copy for pthread_mutexattr_t
[src]
impl Copy for rusage
[src]
impl Copy for utsname
[src]
impl Copy for addrinfo
[src]
impl Copy for termios
[src]
impl Copy for stack_t
[src]
impl Copy for proc_taskallinfo
[src]
impl Copy for dirent
[src]
impl Copy for sockaddr_ctl
[src]
impl Copy for sigevent
[src]
impl Copy for load_command
[src]
impl Copy for in_addr
[src]
impl Copy for radvisory
[src]
impl Copy for ipv6_mreq
[src]
impl Copy for utimbuf
[src]
impl Copy for siginfo_t
[src]
impl Copy for glob_t
[src]
impl Copy for lconv
[src]
impl Copy for winsize
[src]
impl Copy for fd_set
[src]
impl Copy for statvfs
[src]
impl Copy for pthread_attr_t
[src]
impl Copy for bpf_hdr
[src]
impl Copy for proc_bsdinfo
[src]
impl Copy for sf_hdtr
[src]
impl Copy for hostent
[src]
impl Copy for aiocb
[src]
impl Copy for ip_mreq
[src]
impl Copy for tm
[src]
impl Copy for pthread_condattr_t
[src]
impl Copy for sockaddr_in6
[src]
impl Copy for pollfd
[src]
impl Copy for shmid_ds
[src]
impl Copy for ifaddrs
[src]
impl Copy for sockaddr_dl
[src]
impl Copy for Dl_info
[src]
impl Copy for xucred
[src]
impl Copy for dqblk
[src]
impl Copy for flock
[src]
impl Copy for servent
[src]
impl Copy for sigaction
[src]
impl Copy for timeval
[src]
impl Copy for statfs
[src]
impl Copy for rlimit
[src]
impl Copy for pthread_rwlockattr_t
[src]
impl Copy for in6_addr
[src]
impl Copy for msghdr
[src]
impl Copy for segment_command_64
[src]
impl Copy for fsid_t
[src]
impl Copy for if_nameindex
[src]
impl Copy for if_msghdr
[src]
impl Copy for passwd
[src]
impl Copy for sockaddr
[src]
impl Copy for xsw_usage
[src]
impl Copy for protoent
[src]
impl Copy for sockaddr_storage
[src]
impl Copy for pthread_cond_t
[src]
impl Copy for iovec
[src]
impl Copy for timeval32
[src]
impl Copy for linger
[src]
impl Copy for group
[src]
impl Copy for sockaddr_in
[src]
impl Copy for mach_header
[src]
impl Copy for utmpx
[src]
impl Copy for kevent64_s
[src]
impl Copy for mach_timebase_info
[src]
impl Copy for sockaddr_un
[src]
impl Copy for cmsghdr
[src]
impl Copy for fstore_t
[src]
impl Copy for _Unwind_Action
impl Copy for _Unwind_Reason_Code
impl Copy for segment_command
[src]
impl Copy for fd_set
[src]
impl Copy for lconv
[src]
impl Copy for proc_taskallinfo
[src]
impl Copy for kevent
[src]
impl Copy for sockaddr_un
[src]
impl Copy for termios
[src]
impl Copy for tm
[src]
impl Copy for linger
[src]
impl Copy for statfs
[src]
impl Copy for sigevent
[src]
impl Copy for pollfd
[src]
impl Copy for iovec
[src]
impl Copy for rlimit
[src]
impl Copy for load_command
[src]
impl Copy for sockaddr
[src]
impl Copy for sf_hdtr
[src]
impl Copy for flock
[src]
impl Copy for mach_timebase_info
[src]
impl Copy for proc_taskinfo
[src]
impl Copy for stack_t
[src]
impl Copy for Dl_info
[src]
impl Copy for segment_command_64
[src]
impl Copy for stat
[src]
impl Copy for sockaddr_inarp
[src]
impl Copy for tms
[src]
impl Copy for fsid_t
[src]
impl Copy for statvfs
[src]
impl Copy for sockaddr_in
[src]
impl Copy for passwd
[src]
impl Copy for mach_header_64
[src]
impl Copy for pthread_attr_t
[src]
impl Copy for timeval32
[src]
impl Copy for pthread_mutexattr_t
[src]
impl Copy for fstore_t
[src]
impl Copy for servent
[src]
impl Copy for protoent
[src]
impl Copy for utmpx
[src]
impl Copy for pthread_cond_t
[src]
impl Copy for siginfo_t
[src]
impl Copy for proc_bsdinfo
[src]
impl Copy for aiocb
[src]
impl Copy for ip_mreq
[src]
impl Copy for sockaddr_dl
[src]
impl Copy for pthread_condattr_t
[src]
impl Copy for winsize
[src]
impl Copy for addrinfo
[src]
impl Copy for utsname
[src]
impl Copy for pthread_rwlock_t
[src]
impl Copy for bpf_hdr
[src]
impl Copy for cmsghdr
[src]
impl Copy for glob_t
[src]
impl Copy for hostent
[src]
impl Copy for if_msghdr
[src]
impl Copy for rusage
[src]
impl Copy for in_addr
[src]
impl Copy for timespec
[src]
impl Copy for dirent
[src]
impl Copy for msghdr
[src]
impl Copy for sigaction
[src]
impl Copy for itimerval
[src]
impl Copy for radvisory
[src]
impl Copy for group
[src]
impl Copy for if_nameindex
[src]
impl Copy for xsw_usage
[src]
impl Copy for sigval
[src]
impl Copy for ifaddrs
[src]
impl Copy for in6_addr
[src]
impl Copy for sockaddr_storage
[src]
impl Copy for ipc_perm
[src]
impl Copy for pthread_rwlockattr_t
[src]
impl Copy for xucred
[src]
impl Copy for kevent64_s
[src]
impl Copy for timeval
[src]
impl Copy for sockaddr_in6
[src]
impl Copy for utimbuf
[src]
impl Copy for pthread_mutex_t
[src]
impl Copy for if_data
[src]
impl Copy for sockaddr_ctl
[src]
impl Copy for proc_threadinfo
[src]
impl Copy for ipv6_mreq
[src]
impl Copy for shmid_ds
[src]
impl Copy for dqblk
[src]
impl Copy for mach_header
[src]
Implementors
impl Copy for Infallible
impl Copy for Error
impl Copy for Utf8Error
impl<T> Copy for Discriminant<T>
impl<Y, R> Copy for GeneratorState<Y, R> where
R: Copy,
Y: Copy,impl<'a> Copy for Arguments<'a>
impl Copy for RangeFull
impl<F> Copy for RepeatWith<F> where
F: Copy,impl<T> Copy for ManuallyDrop<T> where
T: Copy,impl<Idx> Copy for RangeTo<Idx> where
Idx: Copy,impl<T> Copy for Option<T> where
T: Copy,impl Copy for nom::lib::std::cmp::Ordering
impl Copy for NoneError
impl<T> Copy for Reverse<T> where
T: Copy,impl<T, E> Copy for Result<T, E> where
E: Copy,
T: Copy,impl<Idx> Copy for RangeToInclusive<Idx> where
Idx: Copy,impl Copy for SearchStep
impl Copy for ExchangeHeapSingleton
impl<T> Copy for Bound<T> where
T: Copy,impl Copy for ParseError
impl Copy for Needed
impl Copy for Endianness
impl<'a> Copy for CompleteStr<'a>
impl<'a> Copy for CompleteByteSlice<'a>
impl<T: Copy> Copy for Input<T>