Trait UseCloned

Source
pub trait UseCloned: Clone { }
๐Ÿ”ฌThis is a nightly-only experimental API. (ergonomic_clones)
Expand description

Trait for objects whose Clone impl is lightweight (e.g. reference-counted)

Cloning an object implementing this trait should in general:

  • be O(1) (constant) time regardless of the amount of data managed by the object,
  • not require a memory allocation,
  • not require copying more than roughly 64 bytes (a typical cache line size),
  • not block the current thread,
  • not have any semantic side effects (e.g. allocating a file descriptor), and
  • not have overhead larger than a couple of atomic operations.

The UseCloned trait does not provide a method; instead, it indicates that Clone::clone is lightweight, and allows the use of the .use syntax.

ยง.use postfix syntax

Values can be .used by adding .use postfix to the value you want to use.

โ“˜
fn foo(f: Foo) {
    // if `Foo` implements `Copy` f would be copied into x.
    // if `Foo` implements `UseCloned` f would be cloned into x.
    // otherwise f would be moved into x.
    let x = f.use;
    // ...
}

ยงuse closures

Use closures allow captured values to be automatically used. This is similar to have a closure that you would call .use over each captured value.

Dyn Compatibilityยง

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementorsยง