Funciones
fn add(left: i64, right: i64) -> i64 {
left + right
}
fn absolute(value: i64) -> i64 {
if value < 0 { ret -value }
value
}
Se escriben los parámetros. Una expresión final es el resultado; La devolución anticipada utiliza ret, no return. Omitir -> significa void.
Métodos y destructores
struct counter { value: i64 }
@borrow
fn counter.current() -> i64 {
self.value
}
fn counter.drop() {
// consuming implicit self
}
self está implícito y no debe aparecer en la lista de parámetros. @borrow ofrece un préstamo de receptor léxico compartido. Un destructor consume a su propietario y se ejecuta exactamente una vez en la limpieza estructurada, a menos que el valor se haya movido o eliminado manualmente.
Genéricos y rasgos
trait identity {
fn id() -> i64
}
fn identify<t: identity>(value: t) -> i64 {
value.id()
}
Los parámetros genéricos y los nombres trait/type utilizan minúsculas tipo serpiente. Se verifica que las implementaciones estén completas, coincidan con las firmas, sean coherentes y tengan reglas huérfanas. El envío está monomorfizado estáticamente sin vtables ni asignaciones ocultas.
Funciones extranjeras
extern "c" fn platform_call(value: i64) -> i64 link_name "platform_call";
Las llamadas al extranjero requieren unsafe hasta que esté envuelto por una función segura auditada. ABI, los efectos, la propiedad y la disponibilidad de la plataforma pertenecen al contenedor y .sdi contrato.
Valores de funciones, cierres y tareas.
Los valores de función y las llamadas indirectas se conservan. parameter/return propiedad, efectos y linear t contratos. Un cierre utiliza |parameters| body o || body; contextual fn(...) -> t Los tipos pueden inferir sus tipos de parámetros.
Los cierres simples no tienen asignación ni escape. Sus capturas se copian o se mueven según su capacidad, permanecen inmutables y se limpian exactamente una vez. Utilice box |parameters| body para una devolución de llamada retenida de escape; devoluciones de construcción result<box fn(...) -> t, alloc_error>. Las devoluciones de llamada en caja son de solo movimiento, no se pueden clonar, no se pueden enviar y no pueden escapar de una región activa.
Los valores exigibles de semillas llevan code/environment descriptores. C/platform Los punteros de función permanecen delgados y solo aceptan funciones con nombre. No se admiten cierres recursivos ni captura por referencia.
spawn { ... } describe un void cuerpo de tareas; manejar option/result fallos en su interior porque ? no puede cruzar el límite de la tarea.