Skip to content

Commit 0464234

Browse files
committed
code for 0x14 context managers
1 parent bb4c599 commit 0464234

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class FileManager():
2+
def __init__(self, filename, mode):
3+
self.filename = filename
4+
self.mode = mode
5+
self.file = None
6+
7+
def __enter__(self):
8+
self.file = open(self.filename, self.mode)
9+
return self.file
10+
11+
def __exit__(self, exc_type, exc_value, exc_traceback):
12+
self.file.close()
13+
14+
15+
if __name__ == "__main__":
16+
with FileManager('test.txt', 'w') as f:
17+
f.write('Test')
18+
19+
print(f.closed)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
use std::fs::File;
2+
use std::io::{self, Write};
3+
4+
struct FileManager {
5+
filename: std::path::PathBuf,
6+
mode: char,
7+
file: Option<File>,
8+
}
9+
10+
impl FileManager {
11+
fn new(filename: impl AsRef<std::path::Path>, mode: char) -> FileManager {
12+
FileManager {
13+
filename: filename.as_ref().to_owned(),
14+
mode,
15+
file: None,
16+
}
17+
}
18+
19+
fn with<F>(self: &mut Self, f: F) -> io::Result<()>
20+
where
21+
F: Fn(&mut File) -> io::Result<()>,
22+
{
23+
if self.mode == 'w' {
24+
self.file = Some(File::create(&self.filename)?);
25+
f(&mut self.file.as_mut().unwrap())?;
26+
self.file = None;
27+
}
28+
Ok(())
29+
}
30+
31+
fn closed(self: &Self) -> bool {
32+
self.file.is_none()
33+
}
34+
}
35+
36+
fn main() -> io::Result<()> {
37+
let mut fm = FileManager::new("test.txt", 'w');
38+
fm.with(|f| -> io::Result<()> {
39+
f.write(b"Test")?;
40+
Ok(())
41+
})?;
42+
println!("{}", fm.closed());
43+
Ok(())
44+
}

0 commit comments

Comments
 (0)