Move Semantics and Ownership

32.1 sink Parameters

proc store(s: var seq[string], item: sink string) =
  s.add item                 # item is moved in, not copied

var bag: seq[string]
var msg = "hello"
store(bag, msg)              # msg's last use: moved (msg is now "wasMoved")
store(bag, "literal")

32.2 move, ensureMove, wasMoved

var a = @[1, 2, 3]
var b = move(a)              # explicit move; a is reset to empty
var c = ensureMove(b)        # Nim 2: compile error if a move isn't possible

32.3 lent (Borrowed Return Values)

type Holder = object
  items: seq[string]
proc first(h: Holder): lent string = h.items[0]   # returns a borrowed view, no copy
proc firstMut(h: var Holder): var string = h.items[0]

32.4 Isolated[T] for Thread Transfer

import std/isolation
let iso = isolate(@[1, 2, 3])        # proves no other references exist
# send through a channel safely

32.5 openArray Views and Experimental View Types

--experimental:views lets openArray[T] and var openArray be used as first-class borrowed views, with borrow checking.