Girilen n adet parametreyi alıp, bir mantık çerçevesinde sarmalanmış kod bloğuna aktararak bir veya birden fazla sonucun üretilmesini ve çağrıldığı noktaya döndürülmesini sağlayan yapısal bloklardır.
- İşlevin İngilizce karşılığı function kelimesinin kısaltılmış hali olan
fn
anahtar sözcüğü ile bildirilirler. - Argüman ile kullanıldığında bu argümanların veri türleri parametre listesinde bildirilir.
- İşlevlerin boş bir Tuple () döndüreceği varsayılır. Bir işlevin sonuç döndürmesi isteniyorsa, dönüş türleri
->
işaretinden sonra belirtilir.
fn main() {
println!("Merhaba dünya!");
}
fn topla(a: i8, b: i8) {
println!("toplam: {}", a + b);
}
fn main() {
topla(10, 20);
}
return
anahtar sözcüğü kullanılmayan örnek. Sadece son ifade döner. Son satırda noktalı virgül aranmaz:
fn birle_topla(a: i32) -> i32 {
a + 1 // Son ifade bu satır olduğundan, dönecek olan ifade bu satırdadır.
// Ve bu bildirimin return a + 1; ifadesine eşit olduğu anlaşılır.
}
return
anahtar sözcüğü kullanan örnek. Döndürülecek olan satırreturn
anahtar kelimesiyle işaretlendirildiğinden bu satırdaki ifade işlenerek döndürülür.
fn ikiyle_topla(a: i32) -> i32 {
return a + 2; // a+2 döndürülür.
}
// 01. Tür bildirimsiz kullanım
let b = birle_topla;
let c = b(5); // 6
// 02. Tür bildirimli kullanım
let d: fn(i32) -> i32 = ikiyle_topla;
let e = d(5); // 7
Kapama ya da lambda işlevler olarak bilinirler; argümanlarının veri türlerini bildirmek veya işlevden sonuç döndürmek isteğe bağlıdır.
Standart biçimde tasarlanmış isimlendirilmiş bir işlev aşağıdaki gibi ifade edilebilir:
fn karesini_al(x: u32) -> u32 {
x * x
}
fn main() {
let a = 5;
println!("{}'nın karesi: {}", a, karesini_al(a));
}
Aynı örneği isimsiz işlev olarak tasarlanamak çok daha pratiktir. Bu tasarımda işlevin giriş ve çıkış türlerini isteğe bağlı olarak bildirilir:
fn main() {
let x = 3;
let karesi = |x: i32|-> i32 {
x * x
};
println!("{}'in karesi: {}", x, karesi(x));
}
Giriş ve dönüş türlerini belirtmenin isteğe bağlı olduğu bu isimsiz işlevde, giriş parametreleri işleve ||
kullanılarak geçirilir ve ifade gövdesi {};
köşeli parantezler ile sarılır.
Eğer giriş ve dönüş türleri belirtilmeyen isimsiz işlev tek bir satırdan oluşuyorsa {};
köşeli parantez kullanmak zorunlu değildir.
fn main() {
let x = 2;
let karesi = |i| i * i; // bir satırdan oluşan isimsiz
//işlevlerde { } isteğe bağlı
println!("karesi: {}", karesi(x)); // karesi: 4
}
İsimsiz işlevleri tür bildirimi ile oluşturup çağırabilirsiniz. Ancak hem oluştururken hem de çağırırken süslü parantezler { }
zorunludur.
fn main() {
let x = 3;
// oluştururken ve çağırırken { } zorunludur.
let x_in_karesi = |i: u32| -> u32 { i * i}(x);
println!("x'in karesi: {}", x_in_karesi); // x'in karesi: 9
}
Bu tarz isimsiz işlevlerde sadece dönüş türünü bildirmek zorunludur.
fn main() {
let x = 4;
// ⭐️ Dönüş türü zorunludur
let karesi = |i| -> i32 { i * i}(x);
println!("karesi: {}", karesi); // karesi: 16
}