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.