फंक्शन कोड के ऐसे हिस्से होते हैं जिनमें एक या अधिक स्टेटमेंट या एक्सप्रेशन रहते हैं। कोई फंक्शन चाहे तो एक वैल्यू लौटा भी सकता है।
Rust में शैली यह है कि फंक्शन के नाम के लिए स्नेक केस इस्तेमाल होता है। फंक्शन बनाते समय नाम से पहले fn कीवर्ड लिखा जाता है। उदाहरण के लिए
fn do_nothing() {}
ब्रैकेट के अंदर शून्य या अधिक पैरामीटर रहते हैं, जो कॉमा से अलग किए जाते हैं। पैरामीटर किसी खास टाइप की वैल्यू से जुड़ा एक नाम है, जिसे फंक्शन को दिया जाता है। अगर कोई पैरामीटर न भी हो, तो भी फंक्शन बनाते समय ब्रैकेट लगाना ज़रूरी है। किसी पैरामीटर को दी जाने वाली वास्तविक वैल्यू को आर्गुमेंट कहते हैं।
पैरामीटर और रिटर्न वैल्यू के इस मेल को ही फंक्शन का सिग्नेचर कहते हैं। फंक्शन के सिग्नेचर में हर पैरामीटर का टाइप लिखना ज़रूरी होता है।
घुंघराले ब्रैकेट फंक्शन के अंदर के कोड को घेरते हैं: उसके स्टेटमेंट और एक्सप्रेशन। अगर फंक्शन में कोई स्टेटमेंट या एक्सप्रेशन न भी हो, तो भी फंक्शन बनाते समय घुंघराले ब्रैकेट लगाना ज़रूरी है।
नीचे दिए उदाहरण में फंक्शन i32 टाइप का एक पैरामीटर लेता है, उसे value नाम से बाँधता है, और उसे प्रिंट करता है।
fn print_integer(value: i32) {
println!("{value:?}");
}
पैरामीटर की परिभाषा पर ध्यान दीजिए। हर पैरामीटर name: Type के रूप में लिखा जाता है।
कोई फंक्शन वैल्यू लौटा भी सकता है। डिफ़ॉल्ट रूप से अंतिम एक्सप्रेशन का आउटपुट लौटाया जाता है।
नीचे दिए उदाहरण में फंक्शन का एक i32 पैरामीटर है और वह उसका दुगुना लौटाता है।
fn double_integer(value: i32) -> i32 {
value * 2
}
-> i32 बताता है कि फंक्शन एक i32 लौटाता है। पैरामीटर की तरह लौटाई गई वैल्यू का कोई नाम नहीं होता।
return कीवर्ड की मदद से किसी फंक्शन से जल्दी बाहर निकलना भी संभव है, जैसे:
fn long_function() -> i32 {
let some_condition = false;
// code snipped
if (some_condition) {
return 0;
}
// more code snipped
42
}
किसी कॉन्स्टेंट फंक्शन को बनाने के लिए const fn इस्तेमाल होता है, जिसका मूल्यांकन कंपाइल टाइम पर किया जा सकता है।
const fn compute_data_checksum() -> u128 {
const DATA: &[u8] = include_bytes!("my_big_data_file");
// checksum implementation is left as an exercise for the reader
}
/// This checksum is used to validate that the user has not tampered with proprietary configuration.
pub const DATA_CHECKSUM: u128 = compute_data_checksum();
क्योंकि कॉन्स्टेंट फंक्शन का मूल्यांकन कंपाइल टाइम पर हो सकता है, इसलिए इन पर कुछ ऐसे प्रतिबंध लगते हैं जो आम फंक्शन पर नहीं होते।
खास तौर पर, कोई const fn सिर्फ उन्हीं फंक्शन को कॉल कर सकता है जो खुद भी const के रूप में चिह्नित हों। इस प्रतिबंध का पालन न करने पर
कंपाइल एरर मिलती है।
const fn multiply_integer(value: i32) -> i32 {
use std::time::SystemTime;
if SystemTime::now().elapsed().unwrap().as_nanos() == 0 { // this line errors
value * 2
} else {
value * 3
}
}
कुछ फंक्शन अनाम भी होते हैं, जिनके बारे में closures टॉपिक में बताया गया है।