letclone
A procedural macro for convenient variable cloning in Rust.
Overview
letclone provides a clone! macro that simplifies the common pattern of cloning variables into new bindings. Instead of writing verbose let statements with .clone() calls, you can use the concise clone! macro.
The macro is especially useful when working with closures that need to capture cloned values, as it reduces boilerplate code significantly.
Installation
Add this to your Cargo.toml:
[]
= "0.2.0"
Usage
Basic Usage
use clone;
let original = Stringfrom;
clone!;
// Equivalent to: let original = original.clone();
Field Access
use clone;
let person = Person ;
clone!;
// Equivalent to: let name = person.name.clone();
assert_eq!;
Tuple Index Access
use clone;
let tuple = ;
clone!;
// Equivalent to:
// let field_0 = tuple.0.clone();
// let field_1 = tuple.1.clone();
assert_eq!;
assert_eq!;
Method Call
use clone;
let container = Container ;
clone!;
// Equivalent to: let get_value = container.get_value().clone();
assert_eq!;
Mutable Bindings
Use the mut modifier to create mutable bindings for variables, fields, and tuple indices:
use clone;
// Variable
let original = Stringfrom;
clone!;
// Equivalent to: let mut original = original.clone();
original.push_str;
assert_eq!;
// Field access
let data = Data ;
clone!;
// Equivalent to: let mut value = data.value.clone();
value.push_str;
assert_eq!;
// Tuple index
let tuple = ;
clone!;
// Equivalent to: let mut field_0 = tuple.0.clone();
field_0.push_str;
assert_eq!;
Nested Field Access
use clone;
let a = A ;
clone!;
// Equivalent to: let c = a.b.c.clone();
assert_eq!;
Nested Tuple Index Access
use clone;
let container = Container ;
clone!;
clone!;
// Equivalent to:
// let field_0 = container.tuple.0.clone();
// let field_1 = container.tuple.1.clone();
assert_eq!;
assert_eq!;
Nested Method Call
use clone;
let outer = Outer ;
clone!;
// Equivalent to: let get_value = outer.inner.get_value().clone();
assert_eq!;
Multiple Expressions
Clone multiple variables in a single macro call:
use clone;
let data = Data ;
let var = Stringfrom;
clone!;
// Equivalent to:
// let field1 = data.field1.clone();
// let field2 = data.field2.clone();
// let var = var.clone();
assert_eq!;
assert_eq!;
assert_eq!;
Usage in Closures
The clone! macro is particularly useful when working with closures that need to capture cloned values:
use clone;
let name = Stringfrom;
let scores = vec!;
// Without clone! macro
let closure1 = ;
// With clone! macro - much cleaner!
let closure2 = ;
closure1;
closure2;
For nested structures in closures:
use clone;
let person = Person ;
let closure = ;
closure;
Supported Expression Types
| Expression Type | Example | Expands To |
|---|---|---|
| Path/Variable | clone!(var) |
let var = var.clone(); |
| Field Access | clone!(obj.field) |
let field = obj.field.clone(); |
| Nested Field Access | clone!(a.b.c) |
let c = a.b.c.clone(); |
| Tuple Index | clone!(tuple.0) |
let field_0 = tuple.0.clone(); |
| Nested Tuple Index | clone!(obj.tuple.0) |
let field_0 = obj.tuple.0.clone(); |
| Method Call | clone!(obj.method()) |
let method = obj.method().clone(); |
| Nested Method Call | clone!(a.b.method()) |
let method = a.b.method().clone(); |
With mut |
clone!(mut var) |
let mut var = var.clone(); |
With mut on field |
clone!(mut obj.field) |
let mut field = obj.field.clone(); |
With mut on tuple |
clone!(mut tuple.0) |
let mut field_0 = tuple.0.clone(); |
Limitations
The clone! macro supports a specific set of expression types for automatic variable name derivation:
Supported:
- Path expressions (variables):
clone!(var) - Field access:
clone!(obj.field),clone!(a.b.c)(nested) - Tuple index access:
clone!(tuple.0),clone!(obj.tuple.0)(nested) - Method calls:
clone!(obj.method()),clone!(a.b.method())(nested)
Not supported:
- Binary expressions:
clone!(a + b) - Literals:
clone!(42) - Array indexing:
clone!(arr[0]) - Complex expressions that cannot derive a variable name automatically
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.