Funzioni
fn add(left: i64, right: i64) -> i64 {
left + right
}
fn absolute(value: i64) -> i64 {
if value < 0 { ret -value }
value
}
I parametri vengono digitati. Il risultato è un'espressione finale; la restituzione anticipata utilizza ret, non return. Omettere -> significa void.
Metodi e distruttori
struct counter { value: i64 }
@borrow
fn counter.current() -> i64 {
self.value
}
fn counter.drop() {
// consuming implicit self
}
self è implicito e non deve comparire nell'elenco dei parametri. @borrow 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 unsafe finché non viene avvolto da una funzione sicura controllata. ABI, gli effetti, la proprietà e la disponibilità della piattaforma appartengono al wrapper e .sdi contratto.
Valori delle funzioni, chiusure e attività
I valori delle funzioni e le chiamate indirette vengono preservati parameter/return proprietà, effetti e linear t contratti. Una chiusura utilizza |parameters| body o || body; contestuale fn(...) -> t 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 box |parameters| body per una richiamata conservata in uscita; resi di costruzione result<box fn(...) -> t, alloc_error>. 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.
spawn { ... } delinea a void corpo del compito; maniglia option/result fallimenti al suo interno perché ? non può oltrepassare il confine del compito.