From 2a3d956174bc48fe48373fed1d7a9b652ea4ced7 Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Fri, 1 Sep 2023 18:57:37 +0900 Subject: [PATCH] [obsidian] vault backup: 2023-09-01 18:57:37 --- .../Rustでの評価文脈(環境)のRAIIっぽい実装.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md index df41f1ba..984fe3d2 100644 --- a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md +++ b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md @@ -23,25 +23,28 @@ Environmentは評価全体で見ればLetやLambdaごとに分岐していく構 こんな感じすかねえ ```rust -struct EnvironmentT<'a, T>(&'a mut Vec<(String, T)>, usize); +struct EnvironmentT<'a, T: Clone>(&'a mut Vec<(String, T)>, usize); -impl<'a, T> EnvironmentT<'a, T> { +impl<'a, T: Clone> EnvironmentT<'a, T> { pub fn new(vec: &'a mut Vec<(String, T)>, mut names: Vec<(String, T)>) -> Self { let len = vec.len(); vec.append(&mut names); Self(vec, len) } - pub fn drop(&mut self) { - self.0.truncate(self.1); - } - pub fn lookup(&self, name: &String) -> Option<&'a T> { + pub fn lookup(&self, name: &String) -> Option { let res = self .0 .iter() .rev() .filter(|(n, _v)| name == n) .collect::>(); - res.get(0).map(|(_, v)| v) + res.get(0).map(|(_, v)| v.clone()) + } +} + +impl<'a, T: Clone> Drop for EnvironmentT<'a, T> { + fn drop(&mut self) { + self.0.truncate(self.1); } } ``` \ No newline at end of file