5.1.17. Move, Copy, and Clone
This tutorial covers the three assignment operators: copy (=), move
(<-), and clone (:=), when to use each, and how types determine
operator availability.
5.1.17.1. Copy (=)
Bitwise copy. Source unchanged. Works for POD types (int, float, string) and POD-only structs:
var a = 42
var b = a // b is 42, a is still 42
5.1.17.2. Move (<-)
Transfers ownership. Source is zeroed. Use for containers (array, table), lambdas, and iterators:
var nums <- [1, 2, 3]
var other <- nums // other owns the array, nums is empty
Functions returning containers must use return <-:
def make_data() : array<int> {
var result : array<int>
result |> push(1)
return <- result
}
5.1.17.3. Clone (:=)
Deep copy. Both sides remain valid and independent:
var original : array<int>
original |> push(1)
original |> push(2)
var copy : array<int>
copy := original // deep copy
copy |> push(999) // does not affect original
Clone initialization:
var another := original
5.1.17.4. Type compatibility
Type |
|
|
|
|---|---|---|---|
int, float, POD |
Yes |
Yes |
Yes |
string |
Yes |
Yes |
Yes |
array, table |
No |
Yes |
Yes |
lambda |
No |
Yes |
No |
iterator |
No |
Yes |
No |
block |
No |
No |
No |
5.1.17.5. Relaxed assign
By default, the compiler auto-promotes = to <- when the right side
is temporary (literal, function return). Disable with
options relaxed_assign = false.
5.1.17.6. Struct field initialization
Each field can use a different mode:
var weapons : array<string>
weapons |> push("bow")
var loadout = Inventory(items <- weapons, weight = 5)
// weapons is now empty after the move
5.1.17.7. Custom clone functions
Override clone behavior by defining a clone function for your type:
struct GameState {
level : int
score : int
}
def clone(var dst : GameState; src : GameState) {
dst.level = src.level + 1000 // custom logic during clone
dst.score = src.score
}
var original = GameState(level=5, score=100)
var copy := original // invokes custom clone
// copy.level is 1005, not 5
See also
Move, Copy, and Clone in the language reference.
Full source: tutorials/language/17_move_copy_clone.das
Next tutorial: Classes and Inheritance