Drop Trait का उपयोग
Drop एक special goodbye method है जिसे Rust किसी value के हमेशा के लिए गायब होने से ठीक पहले अपने आप call करता है।In this page:
impl Drop for Name {
fn drop(&mut self) {
// cleanup
}
}
Implementing Drop
Drop trait का drop method implement करना किसी type को इसकी value का scope खत्म होते ही अपने आप custom cleanup code execute करने देता है।
उदाहरण: Implementing Drop
// Define a struct `Logger` to group related fields together
struct Logger {
name: String,
}
// Implement the `Drop` trait for `Logger`
impl Drop for Logger {
// Define the function `drop` taking `self`
fn drop(&mut self) {
// Print "Logger '{}' shutting down" to the console, substituting in `self.name` (with a trailing newline)
println!("Logger '{}' shutting down", self.name);
}
}
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `_logger`, set to `Logger { name: String::from("main-logger") }`
let _logger = Logger { name: String::from("main-logger") };
// Print "Logger is active" to the console (with a trailing newline)
println!("Logger is active");
}
Login to try C/C++/Java/PHP code in the editor
Forcing an Early Drop
चूंकि सीधे .drop() call करना compiler द्वारा disallowed है, std::mem::drop(value) का उपयोग किसी value को इसके natural scope के खत्म होने से पहले साफ़ कराने के लिए किया जाता है।
उदाहरण: Forcing an Early Drop
// Define a struct `Resource` to group related fields together
struct Resource;
// Implement the `Drop` trait for `Resource`
impl Drop for Resource {
// Define the function `drop` taking `self`
fn drop(&mut self) {
// Print "Resource cleaned up" to the console (with a trailing newline)
println!("Resource cleaned up");
}
}
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `res`, set to `Resource`
let res = Resource;
// Print "About to drop early" to the console (with a trailing newline)
println!("About to drop early");
drop(res);
// Print "Dropped; continuing" to the console (with a trailing newline)
println!("Dropped; continuing");
}
Login to try C/C++/Java/PHP code in the editor
Drop Order Matches Reverse Declaration
जब Drop implementations वाली कई values एक साथ scope से बाहर जाती हैं, वे declare होने के उल्टे order में साफ़ होती हैं, एक stack को unwind करने जैसा।
उदाहरण: Drop Order Matches Reverse Declaration
// Define a struct `Item` to group related fields together
struct Item(i32);
// Implement the `Drop` trait for `Item`
impl Drop for Item {
// Define the function `drop` taking `self`
fn drop(&mut self) {
// Print "Dropping item {}" to the console, substituting in `self.0` (with a trailing newline)
println!("Dropping item {}", self.0);
}
}
// Entry point: execution of the program starts here
fn main() {
// Declare an immutable variable `_a`, set to `Item(1)`
let _a = Item(1);
// Declare an immutable variable `_b`, set to `Item(2)`
let _b = Item(2);
// Declare an immutable variable `_c`, set to `Item(3)`
let _c = Item(3);
// Print "All items created" to the console (with a trailing newline)
println!("All items created");
}
Login to try C/C++/Java/PHP code in the editor
A Practical Use: Resource Cleanup
Drop आमतौर पर यह गारंटी देने के लिए उपयोग होता है कि cleanup logic, जैसे एक connection बंद करना, हमेशा चले -- भले ही function जल्दी return हो -- क्योंकि value जब भी इसका scope खत्म हो, drop हो जाती है।
उदाहरण: A Practical Use: Resource Cleanup
// Define a struct `Connection` to group related fields together
struct Connection {
id: u32,
}
// Implement the `Drop` trait for `Connection`
impl Drop for Connection {
// Define the function `drop` taking `self`
fn drop(&mut self) {
// Print "Closing connection #{}" to the console, substituting in `self.id` (with a trailing newline)
println!("Closing connection #{}", self.id);
}
}
// Define the function `use_connection` with no parameters
fn use_connection() {
// Declare an immutable variable `_conn`, set to `Connection { id: 7 }`
let _conn = Connection { id: 7 };
// Print "Using connection #7" to the console (with a trailing newline)
println!("Using connection #7");
}
// Entry point: execution of the program starts here
fn main() {
use_connection();
// Print "Connection was closed automatically" to the console (with a trailing newline)
println!("Connection was closed automatically");
}
Login to try C/C++/Java/PHP code in the editor
- किसी value पर सीधे
.drop()call करने की कोशिश करना -- Rust इसे explicitly मना करता है और इसके बजायstd::mem::dropप्रदान करता है। - यह मान लेना कि
Drop::dropकिसी value के move होते ही तुरंत चलता है -- यह सिर्फ तब चलता है जब value का owner सच में scope से बाहर जाता है। - यह भूल जाना कि values उसी scope के अंदर declaration के उल्टे order में drop होती हैं, जो cleanup ordering के लिए मायने रख सकता है।
Dropimplement करना किसी type को इसकी value scope से बाहर जाने पर अपने आप custom cleanup logic चलाने देता है।- आप
dropmethod सीधे call नहीं कर सकते; एक early drop मजबूर करने के लिए free functionstd::mem::drop(value)उपयोग करें। - Values किसी scope के अंदर उनकी declaration के उल्टे order में drop होती हैं।
Dropआमतौर पर file handles, locks, या network connections जैसे resources release करने के लिए उपयोग होता है।
Chapter Quiz — Complete all 7 topics to unlock
0/7 topics done
Complete these topics first: