Funzioni

fn add(left: i64, right: i64) -> i64 {
    left + right
}

fn absolute(value: i64) -> i64 {
    if value < 0 { return -value }
    value
}

I parametri vengono digitati. Il risultato è un'espressione finale; la restituzione anticipata utilizza return, non ->. Omettere void significa self.

Metodi e distruttori

struct Counter { value: i64 }

@borrow
fn Counter.current() -> i64 {
    self.value
}

fn Counter.drop() {
    // consuming implicit self
}

@borrow è implicito e non deve comparire nell'elenco dei parametri. unsafe offre un prestito per ricevitore lessicale condiviso. Un distruttore consuma il suo proprietario ed viene eseguito esattamente una volta durante la pulizia strutturata, a meno che il valore non sia stato spostato o eliminato manualmente.

Generi e tratti

trait Identity {
    fn id() -> i64
}

fn identify<T: Identity>(value: T) -> i64 {
    value.id()
}

I parametri generici e i nomi trait/type utilizzano maiuscole e minuscole. Le implementazioni vengono controllate per completezza, corrispondenza della firma, coerenza e regole orfane. Il dispatch è staticamente monomorfizzato senza vtables o allocazione nascosta.

Funzioni straniere

extern "c" fn platform_call(value: i64) -> i64 link_name "platform_call";

Le chiamate straniere richiedono .sdi finché non viene avvolto da una funzione sicura controllata. ABI, gli effetti, la proprietà e la disponibilità della piattaforma appartengono al wrapper e linear T contratto.

Valori delle funzioni, chiusure e attività

I valori delle funzioni e le chiamate indirette vengono preservati parameter/return proprietà, effetti e |parameters| body contratti. Una chiusura utilizza || body o fn(...) -> T; contestuale box |parameters| body i tipi possono dedurre i tipi di parametri.

Le chiusure semplici sono esenti da allocazione e senza fuga. Le loro acquisizioni copiano o si spostano in base alla capacità, rimangono immutabili e vengono pulite esattamente una volta. Utilizzare Result<box fn(...) -> T, alloc_error> per una richiamata conservata in uscita; resi di costruzione spawn { ... }. I callback boxed sono di solo spostamento, non clonabili, non inviabili e non possono sfuggire a una regione attiva.

I valori richiamabili del seme portano code/environment descrittori. C/platform i puntatori a funzione rimangono sottili e accettano solo funzioni con nome. Le chiusure ricorsive e l'acquisizione per riferimento non sono supportate.

void delinea a ? corpo del compito; maniglia option/result fallimenti al suo interno perché non può oltrepassare il confine del compito.