Programmering
  1. Teori
  2. Logik
  3. Anonyme Funktioner
  • Eksamen
  • Projektarbejde
  • Synopsis
  • Cheatsheets
    • Python cheatsheet
    • Rust cheatsheet
    • Kodningsplatforme
  • Opsætning
    • Git
    • Python
    • Rust
    • VScode
  • Teori
    • Arbejdsproces
      • Abstraktion
      • Fejlfinding
      • Generalisering
      • Git
      • Kommentarer
      • Moduler
      • Pakker
    • Data
      • Datastrukturer
      • Datatyper
      • Ejerskab og referencer
      • Enum
      • Hukommelse og pointers
      • Indkapsling
      • Polymorfi
      • Struct
    • Diagrammer
      • Brugerhistorier
      • Klassediagrammer
      • Rutediagrammer
      • Tegneprogrammer
    • Logik
      • Anonyme Funktioner
      • Fejlhåndtering
      • Grådig algoritme
      • Metaprogrammering
      • Samtidig programmering
  • Studieområdet
    • Forslag til emner
    • Empiri
    • Metoder i Programmering

På denne side

  • Anvendelse med iterator
  • Indfange værdier og ejerskab
  1. Teori
  2. Logik
  3. Anonyme Funktioner

Anonyme Funktioner

Teori

Udgivet

21. marts 2026

Anonyme funktioner er funktioner uden navn og forbindes ofte med det funktionelle programmeringsparadigme. De kan gemmes i variabler (som i første eksempel nedenfor) eller bruges som input til andre funktioner (som i sidste eksempel nedenfor). I nogle sprog (fx Python) er anonyme funktioner også kendt som Lambda funktioner.

NoteEksempel: Sammenligning med alm. funktion

I eksemplet nedenfor (fra [1]) sammenlignes en alm. funktion (dog skrevet på kun 1 linje) med 3 måder at skrive en anonym funktion.

fn  add_one_v1   (x: u32) -> u32 { x + 1 }  // fn
let add_one_v2 = |x: u32| -> u32 { x + 1 }; // Parametre angives mellem | |. Bemærk let og ;
let add_one_v3 = |x|             { x + 1 }; // Angivelse af datatyper kan undlades.
let add_one_v4 = |x|               x + 1  ; // Hvis funktionen kun består af 1 sætning/linje, så kan { } undlades.

println!("{}", add_one_v3(10));
println!("{}", add_one_v4(10));

Anvendelse med iterator

Anonyme funktioner bruges ofte til at skrive ens kode kortere eller mere kompakt, fx sammen med Iterator. Nedenstående to eksempler (fra [1]) giver samme resultat.

Hvad der er nemmest at læse afhænger både af erfaring og præference. Effektivitet vil ofte være det samme, se [1] sektion 13.4.

NoteEksempel: Iteration med/uden anynom funktion

Uden anonym funktion

let v1 = vec![1, 2, 3];
let mut v2 = Vec::new();
for x in v1 {
    v2.push(x + 1);
}
println!("{:?}", v2);

Med iterator og anonym funktion

let v1 = vec![1, 2, 3];
let v2: Vec<i32> = v1.iter().map(|x| x + 1).collect();
println!("{:?}", v2);

Indfange værdier og ejerskab

Anonyme funktioner kan indfange variablerne fra det område hvor de defineres. Det kan gøres på de samme tre måder som funktionsparametre kan angives: (1) overtagelse af ejerskab, (2) mutabel reference eller (3) reference. Dette sker automatisk baseret på hvordan variablerne bruges i den anonyme funktion.

De anonyme funktioner vil dermed opfylde 1, 2 eller alle 3 af følgende kategorier i stigende rækkefølge (så Fn overholder også altid FnMut):

  1. FnOnce: Kan kaldes min. 1 gang. (Gælder altid.)
  2. FnMut: Kan kaldes mere end 1 gang. Ændrer måske de indfangede variabler.
  3. Fn: Foretager ingen flytning af ejerskab eller mutation af de indfangede variabler.

Den anonyme funktion kan tvinges til at tage ejerskab vha. nøgleordet move hvilket ofte bruges i forbindelse med tråde.

NoteEksempel: Indfange værdier i anonym funktion

I første eksempel indfanger den anonyme funktion f en mutabel reference til vektoren v og bliver dermed kategoriseret som FnMut. Den kan derfor uden problemer bruges i den sidste for_each (som kræver at funktionen tilhører kategorien FnMut).

Hvis vi brugte move for f ville det give problemer, men dog først på sidste linje hvor vektoren v ikke længere ville eksistere (da ejerskabet er overgået til f).

let mut v = vec![1, 2, 3];
let mut f = || v.iter_mut().for_each(|x| *x += 1);
(0..5).for_each(|_| f());
println!("{:?}", v);

I nedenstående eksempel går det galt. Her er den anonyme funktion f kategoriseret som FnOnce da ejerskabet af vektoren v flyttes til variablen v2 inde i den anonyme funktion. Den kan derfor kun kaldes en enkelt gang og vil give en fejl ved den sidste for_each som stadig kræver at funktionen tilhører kategorien FnMut.

let v = vec![1, 2, 3];
let f = || { let v2 = v; };
(0..5).for_each(|_| f());
println!("{:?}", v);
Tilbage til toppen

Referencer

[1]
S. Klabnik og C. Nichols, “13. Functional Language Features: Iterators and Closures”, i The Rust Programming Language, No Starch Press. Tilgængelig hos: https://doc.rust-lang.org/stable/book/ch13-00-functional-features.html

ZBC Slagelse HTX

Senest redigeret d. 21. marts 2026

JACS