Trait sp_std::marker::Copy 1.0.0[−][src]
pub trait Copy: Clone { }
Expand description
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
:
#[derive(Copy, Clone)] 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`
Shared references (&T
) are also Copy
, so a type can be Copy
, even when it holds
shared references of types T
that are not Copy
. Consider the following struct,
which can implement Copy
, because it only holds a shared reference to our non-Copy
type PointList
from above:
#[derive(Copy, Clone)] struct PointListWrapper<'a> { point_list_ref: &'a PointList, }
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.
Additional implementors
In addition to the implementors listed below,
the following types also implement Copy
:
- Function item types (i.e., the distinct types defined for each function)
- Function pointer types (e.g.,
fn() -> i32
) - Array types, for all sizes, if the item type also implements
Copy
(e.g.,[i32; 123456]
) - Tuple types, if each component also implements
Copy
(e.g.,()
,(i32, bool)
) - Closure types, if they capture no value from the environment
or if all such captured values implement
Copy
themselves. Note that variables captured by shared reference always implementCopy
(even if the referent doesn’t), while variables captured by mutable reference never implementCopy
.
Implementations on Foreign Types
Shared references can be copied, but mutable references cannot!
Implementors
impl Copy for BenchmarkSelector
impl Copy for BenchmarkSelector
impl Copy for BenchmarkParameter
impl Copy for BenchmarkParameter
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl Copy for SizeType
impl Copy for SizeType
impl Copy for Mode
impl Copy for Mode
impl Copy for DatabaseType
impl Copy for DatabaseType
impl Copy for DatabaseSize
impl Copy for DatabaseSize
impl Copy for ProxyType
impl Copy for ProxyType
impl Copy for Runtime
impl Copy for Runtime
impl Copy for Runtime
impl Copy for Runtime
impl Copy for BlockType
impl Copy for BlockType
impl Copy for DatabaseType
impl Copy for DatabaseType
impl Copy for Profile
impl Copy for Profile
impl Copy for DestroyWitness
impl Copy for DestroyWitness
impl Copy for ConversionError
impl Copy for ConversionError
impl Copy for Reasons
impl Copy for Reasons
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl Copy for ReturnFlags
impl Copy for ReturnFlags
impl Copy for Conviction
impl Copy for Conviction
impl<Balance: Copy> Copy for Delegations<Balance>
impl<Balance: Copy> Copy for Delegations<Balance>
impl Copy for Vote
impl Copy for Vote
impl<Balance: Copy> Copy for AccountVote<Balance>
impl<Balance: Copy> Copy for AccountVote<Balance>
impl Copy for VoteThreshold
impl Copy for VoteThreshold
impl<Bn: Copy> Copy for Phase<Bn>
impl<Bn: Copy> Copy for Phase<Bn>
impl Copy for ElectionCompute
impl Copy for ElectionCompute
impl Copy for SolutionOrSnapshotSize
impl Copy for SolutionOrSnapshotSize
impl<Balance: Copy> Copy for VoterInfo<Balance>
impl<Balance: Copy> Copy for VoterInfo<Balance>
impl Copy for GrandpaTimeSlot
impl Copy for GrandpaTimeSlot
impl<Balance: Copy + Encode + Decode + MaxEncodedLen + Clone + Debug + Eq + PartialEq> Copy for Judgement<Balance>
impl<Balance: Copy + Encode + Decode + MaxEncodedLen + Clone + Debug + Eq + PartialEq> Copy for Judgement<Balance>
impl Copy for IdentityField
impl Copy for IdentityField
impl Copy for IdentityFields
impl Copy for IdentityFields
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl<BlockNumber: Copy> Copy for Timepoint<BlockNumber>
impl<BlockNumber: Copy> Copy for Timepoint<BlockNumber>
impl<AccountId: Copy, ProxyType: Copy, BlockNumber: Copy> Copy for ProxyDefinition<AccountId, ProxyType, BlockNumber>
impl<AccountId: Copy, ProxyType: Copy, BlockNumber: Copy> Copy for ProxyDefinition<AccountId, ProxyType, BlockNumber>
impl<AccountId: Copy, Hash: Copy, BlockNumber: Copy> Copy for Announcement<AccountId, Hash, BlockNumber>
impl<AccountId: Copy, Hash: Copy, BlockNumber: Copy> Copy for Announcement<AccountId, Hash, BlockNumber>
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl Copy for Vote
impl Copy for Vote
impl Copy for Judgement
impl Copy for Judgement
impl<Balance: Copy, BlockNumber: Copy> Copy for Payout<Balance, BlockNumber>
impl<Balance: Copy, BlockNumber: Copy> Copy for Payout<Balance, BlockNumber>
impl Copy for VouchingStatus
impl Copy for VouchingStatus
impl<AccountId: Copy, Balance: Copy> Copy for Bid<AccountId, Balance>
impl<AccountId: Copy, Balance: Copy> Copy for Bid<AccountId, Balance>
impl<AccountId: Copy, Balance: Copy> Copy for BidKind<AccountId, Balance>
impl<AccountId: Copy, Balance: Copy> Copy for BidKind<AccountId, Balance>
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl<T: Copy + Config<I>, I: Copy + Instance> Copy for Module<T, I>
impl<AccountId: Copy> Copy for RewardDestination<AccountId>
impl<AccountId: Copy> Copy for RewardDestination<AccountId>
impl Copy for Forcing
impl Copy for Forcing
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>
impl Copy for DestroyWitness
impl Copy for DestroyWitness
impl<Balance: Copy, BlockNumber: Copy> Copy for VestingInfo<Balance, BlockNumber>
impl<Balance: Copy, BlockNumber: Copy> Copy for VestingInfo<Balance, BlockNumber>
impl Copy for RecordProof
impl Copy for RecordProof
impl Copy for WasmExecutionMethod
impl Copy for WasmExecutionMethod
impl Copy for TracingReceiver
impl Copy for TracingReceiver
impl Copy for NodeKeyType
impl Copy for NodeKeyType
impl Copy for CryptoScheme
impl Copy for CryptoScheme
impl Copy for OutputType
impl Copy for OutputType
impl Copy for ExecutionStrategy
impl Copy for ExecutionStrategy
impl Copy for RpcMethods
impl Copy for RpcMethods
impl Copy for Database
impl Copy for Database
impl Copy for SyncMode
impl Copy for SyncMode
impl Copy for NewBlockState
impl Copy for NewBlockState
impl Copy for MemorySize
impl Copy for MemorySize
impl Copy for KeepBlocks
impl Copy for KeepBlocks
impl Copy for TransactionStorageMode
impl Copy for TransactionStorageMode
impl Copy for ForkChoiceStrategy
impl Copy for ForkChoiceStrategy
impl Copy for CheckForEquivocation
impl Copy for CheckForEquivocation
impl Copy for EpochIdentifierPosition
impl Copy for EpochIdentifierPosition
impl<T: Copy> Copy for SlotDuration<T>
impl<T: Copy> Copy for SlotDuration<T>
impl Copy for WasmExecutionMethod
impl Copy for WasmExecutionMethod
impl Copy for SupervisorFuncIndex
impl Copy for SupervisorFuncIndex
impl Copy for IfDisconnected
impl Copy for IfDisconnected
impl Copy for BitswapConfig
impl Copy for BitswapConfig
impl Copy for TransactionImport
impl Copy for TransactionImport
impl Copy for MessageIntent
impl Copy for MessageIntent
impl Copy for SetId
impl Copy for SetId
impl Copy for ReputationChange
impl Copy for ReputationChange
impl Copy for IncomingIndex
impl Copy for IncomingIndex
impl Copy for DenyUnsafe
impl Copy for DenyUnsafe
impl Copy for RpcMethods
impl Copy for RpcMethods
impl Copy for FixedI64
impl Copy for FixedI64
impl Copy for FixedI128
impl Copy for FixedI128
impl Copy for FixedU128
impl Copy for FixedU128
impl Copy for Percent
impl Copy for Percent
impl Copy for PerU16
impl Copy for PerU16
impl Copy for Permill
impl Copy for Permill
impl Copy for Perbill
impl Copy for Perbill
impl Copy for Perquintill
impl Copy for Perquintill
impl Copy for Rational128
impl Copy for Rational128
impl Copy for BlockStatus
impl Copy for BlockStatus
impl Copy for BlockOrigin
impl Copy for BlockOrigin
impl Copy for NoNetwork
impl Copy for NoNetwork
impl Copy for SlotDuration
impl Copy for SlotDuration
impl Copy for AllowedSlots
impl Copy for AllowedSlots
impl Copy for Slot
impl Copy for Slot
impl Copy for DeriveJunction
impl Copy for DeriveJunction
impl Copy for PublicError
impl Copy for PublicError
impl Copy for Ss58AddressFormat
impl Copy for Ss58AddressFormat
impl Copy for ParseError
impl Copy for ParseError
impl Copy for KeyTypeId
impl Copy for KeyTypeId
impl Copy for CryptoTypeId
impl Copy for CryptoTypeId
impl Copy for PublicError
impl Copy for PublicError
impl Copy for Public
impl Copy for Public
impl Copy for PublicError
impl Copy for PublicError
impl Copy for StorageKind
impl Copy for StorageKind
impl Copy for HttpRequestId
impl Copy for HttpRequestId
impl Copy for HttpError
impl Copy for HttpError
impl Copy for HttpRequestStatus
impl Copy for HttpRequestStatus
impl Copy for Timestamp
impl Copy for Timestamp
impl Copy for Duration
impl Copy for Duration
impl Copy for Capability
impl Copy for Capability
impl Copy for Capabilities
impl Copy for Capabilities
impl Copy for Public
impl Copy for Public
impl Copy for LogLevel
impl Copy for LogLevel
impl Copy for LogLevelFilter
impl Copy for LogLevelFilter
impl Copy for Keyring
impl Copy for Keyring
impl Copy for Keyring
impl Copy for Keyring
impl Copy for NumberOrHex
impl Copy for NumberOrHex
impl<Block: BlockT> Copy for BlockId<Block>
impl<Block: BlockT> Copy for BlockId<Block>
impl<'a> Copy for OpaqueDigestItemId<'a>
impl<'a> Copy for OpaqueDigestItemId<'a>
impl Copy for Era
impl Copy for Era
impl Copy for InvalidTransaction
impl Copy for InvalidTransaction
impl Copy for UnknownTransaction
impl Copy for UnknownTransaction
impl Copy for TransactionValidityError
impl Copy for TransactionValidityError
impl Copy for TransactionSource
impl Copy for TransactionSource
impl Copy for DispatchError
impl Copy for DispatchError
impl<Info: Copy> Copy for DispatchErrorWithPostInfo<Info> where
Info: Eq + PartialEq + Clone + Copy + Encode + Decode + Printable,
impl<Info: Copy> Copy for DispatchErrorWithPostInfo<Info> where
Info: Eq + PartialEq + Clone + Copy + Encode + Decode + Printable,
impl Copy for TokenError
impl Copy for TokenError
impl Copy for ArithmeticError
impl Copy for ArithmeticError
impl Copy for ExecutionStrategy
impl Copy for ExecutionStrategy
impl Copy for ChildType
impl Copy for ChildType
impl Copy for Timestamp
impl Copy for Timestamp
impl Copy for Error
impl Copy for Error
impl Copy for ValueType
impl Copy for ValueType
impl Copy for Value
impl Copy for Value
impl<T: Copy + PointerType> Copy for Pointer<T>
impl<T: Copy + PointerType> Copy for Pointer<T>
impl Copy for ReturnValue
impl Copy for ReturnValue
impl<T: Copy + Config> Copy for Module<T>
impl<T: Copy + Config> Copy for Module<T>