Funções
fn add(left: i64, right: i64) -> i64 {
left + right
}
fn absolute(value: i64) -> i64 {
if value < 0 { ret -value }
value
}
Os parâmetros são digitados. Uma expressão final é o resultado; retorno antecipado usa ret, não return. Omitir -> significa void.
Métodos e destruidores
struct counter { value: i64 }
@borrow
fn counter.current() -> i64 {
self.value
}
fn counter.drop() {
// consuming implicit self
}
self está implícito e não deve aparecer na lista de parâmetros. @borrow fornece um empréstimo de receptor lexical compartilhado. Um destruidor consome seu proprietário e é executado exatamente uma vez na limpeza estruturada, a menos que o valor tenha sido movido ou descartado manualmente.
Genéricos e características
trait identity {
fn id() -> i64
}
fn identify<t: identity>(value: t) -> i64 {
value.id()
}
Parâmetros genéricos e nomes trait/type usam letras minúsculas. As implementações são verificadas quanto à integridade, correspondência de assinatura, coerência e regras órfãs. O despacho é estaticamente monomorfizado sem vtables ou alocação oculta.
Funções estrangeiras
extern "c" fn platform_call(value: i64) -> i64 link_name "platform_call";
Chamadas estrangeiras exigem unsafe até ser envolvido por uma função segura auditada. ABI, efeitos, propriedade e disponibilidade da plataforma pertencem ao wrapper e .sdi contrato.
Valores de função, fechamentos e tarefas
Valores de função e chamadas indiretas preservam parameter/return propriedade, efeitos e linear t contratos. Um fechamento usa |parameters| body ou || body; contextual fn(...) -> t tipos podem inferir seus tipos de parâmetros.
Os fechamentos simples são livres de alocação e sem escape. Suas capturas são copiadas ou movidas por capacidade, permanecem imutáveis e são limpas exatamente uma vez. Use box |parameters| body para um retorno de chamada retido de escape; construção retorna result<box fn(...) -> t, alloc_error>. Os retornos de chamada em caixa são somente para movimentação, não podem ser clonados, não podem ser enviados e não podem escapar de uma região ativa.
Os valores iniciais que podem ser chamados são transportados code/environment descritores. C/platform ponteiros de função permanecem finos e aceitam apenas funções nomeadas. Fechamentos recursivos e captura por referência não são suportados.
spawn { ... } descreve um void corpo da tarefa; manusear option/result falhas dentro dele porque ? não pode cruzar o limite da tarefa.