関数外部で宣言した値は関数内部では更新できないので、引数に渡して、返却することで実質的に更新してることになる。
fn sub(i: u32) -> u32{ return i + 1; } fn main() { let mut i = 1; for n in 0..5 { i = sub(i); } println!("{}", i); }
Running `target/debug/sample`
6
この原理を応用する
fn build_layer(&mut self,n: usize) -> usize{ let mut num = n; let mut new_layer: Vec<Node> = Vec::new(); if self.layer.len() % 2 == 1 { self.layer.push(self.layer[self.layer.len() - 1].clone()); self.leaves.push(self.leaves[self.leaves.len() - 1].clone()); } for i in (0..self.layer.len()).step_by(2) { let parent_data = sha256hash(self.layer[i].data.clone(), self.layer[i+1].data.clone()); let left = Node {left: "".to_string(), right: "".to_string(), parent: parent_data.clone(), sibling: self.layer[i+1].data.clone(), position: Position::Left, data: self.layer[i].data.clone(), hash:hash(self.layer[i].data.clone())}; let right = Node {left: "".to_string(), right: "".to_string(), parent: parent_data.clone(), sibling: self.layer[i].data.clone(), position: Position::Right, data: self.layer[i+1].data.clone(), hash:hash(self.layer[i+1].data.clone())}; let parent = Node {left: self.layer[i].data.clone(), right: self.layer[i+1].data.clone(), parent: "".to_string(), sibling: "".to_string(), position: Position::None, data: parent_data.clone(), hash:hash(parent_data.clone())}; new_layer.push(parent.clone()); self.leaves[num] = left.clone(); self.leaves[num+1] = right.clone(); self.leaves.push(parent.clone()); num = num + 2; } self.layer = new_layer; return num; } fn build_tree(&mut self) { let mut n = 0; while self.layer.len() > 1 { n = self.build_layer(n); } self.root = self.layer[0].data.clone(); }
[Node { left: “”, right: “”, parent: “2ce109e9d0faf820b2434e166297934e6177b65ab9951dbc3e204cad4689b39c”, sibling: “bbb”, position: Left, data: “aaa”, hash: “9834876dcfb05cb167a5c24953eba58c4ac89b1adf57f28f2f9d09af107ee8f0” }, Node { left: “”, right: “”, parent: “2ce109e9d0faf820b2434e166297934e6177b65ab9951dbc3e204cad4689b39c”, sibling: “aaa”, position: Right, data: “bbb”, hash: “3e744b9dc39389baf0c5a0660589b8402f3dbb49b89b3e75f2c9355852a3c677” }, Node { left: “”, right: “”, parent: “fcb0de60e5febc4dea96c4dc0153362d289f1aa5bd0797db2dcd7f23708205bb”, sibling: “ddd”, position: Left, data: “ccc”, hash: “64daa44ad493ff28a96effab6e77f1732a3d97d83241581b37dbd70a7a4900fe” }, Node { left: “”, right: “”, parent: “fcb0de60e5febc4dea96c4dc0153362d289f1aa5bd0797db2dcd7f23708205bb”, sibling: “ccc”, position: Right, data: “ddd”, hash: “730f75dafd73e047b86acb2dbd74e75dcb93272fa084a9082848f2341aa1abb6” }, Node { left: “”, right: “”, parent: “b0f69b8d46703ad68753ec87d319678be392a9e2fa024449750821f886e5d1af”, sibling: “fff”, position: Left, data: “eee”, hash: “282b91e08fd50a38f030dbbdee7898d36dd523605d94d9dd6e50b298e47844be” }, Node { left: “”, right: “”, parent: “b0f69b8d46703ad68753ec87d319678be392a9e2fa024449750821f886e5d1af”, sibling: “eee”, position: Right, data: “fff”, hash: “f284bdc3c1c9e24a494e285cb387c69510f28de51c15bb93179d9c7f28705398” }, Node { left: “”, right: “”, parent: “d5fe46b1204cb7bb339b929b1777e04d2c7235915d7a50d6baa134e20dbc80c6”, sibling: “gggg”, position: Left, data: “gggg”, hash: “45d25abffe8c792d74d30346429b5bc244b815eeb378a9c38395f7a466cf6894” }, Node { left: “”, right: “”, parent: “d5fe46b1204cb7bb339b929b1777e04d2c7235915d7a50d6baa134e20dbc80c6”, sibling: “gggg”, position: Right, data: “gggg”, hash: “45d25abffe8c792d74d30346429b5bc244b815eeb378a9c38395f7a466cf6894” }, Node { left: “”, right: “”, parent: “a70145e430c9ffc0527e6679bd3d14c3819921c7bdcee060e3e848c1e60fe771”, sibling: “fcb0de60e5febc4dea96c4dc0153362d289f1aa5bd0797db2dcd7f23708205bb”, position: Left, data: “2ce109e9d0faf820b2434e166297934e6177b65ab9951dbc3e204cad4689b39c”, hash: “08c3a23afb58cefa0357697210f5a6be5234b45e8161963f75a58a9ba6b5a9e4” }, Node { left: “”, right: “”, parent: “a70145e430c9ffc0527e6679bd3d14c3819921c7bdcee060e3e848c1e60fe771”, sibling: “2ce109e9d0faf820b2434e166297934e6177b65ab9951dbc3e204cad4689b39c”, position: Right, data: “fcb0de60e5febc4dea96c4dc0153362d289f1aa5bd0797db2dcd7f23708205bb”, hash: “7674e6963d9a3f51967dff713d69254ad3acb05d803238bc6b725fcb10f43e8a” }, Node { left: “”, right: “”, parent: “1b67b42ffe8865f9f551071cb412895c96f5b9f52586e904d9933f57c05981b1”, sibling: “d5fe46b1204cb7bb339b929b1777e04d2c7235915d7a50d6baa134e20dbc80c6”, position: Left, data: “b0f69b8d46703ad68753ec87d319678be392a9e2fa024449750821f886e5d1af”, hash: “3bfa169f6fa2da82a6cc3f5ecdc26d56b3d4897938df6fdac431226fcd6999d5” }, Node { left: “”, right: “”, parent: “1b67b42ffe8865f9f551071cb412895c96f5b9f52586e904d9933f57c05981b1”, sibling: “b0f69b8d46703ad68753ec87d319678be392a9e2fa024449750821f886e5d1af”, position: Right, data: “d5fe46b1204cb7bb339b929b1777e04d2c7235915d7a50d6baa134e20dbc80c6”, hash: “955b23e75d9bc447bb70907b3c97f04137c539c550f69ac79ccb67f61d8dc94f” }, Node { left: “”, right: “”, parent: “71dae017bc564544250be0bcad9740c09600c9638f6962b8ef167d1d22a21e46”, sibling: “1b67b42ffe8865f9f551071cb412895c96f5b9f52586e904d9933f57c05981b1”, position: Left, data: “a70145e430c9ffc0527e6679bd3d14c3819921c7bdcee060e3e848c1e60fe771”, hash: “f50d2b271f9a6f44901225646baf708d887b9114a6d3f0aea9654f48fd608220” }, Node { left: “”, right: “”, parent: “71dae017bc564544250be0bcad9740c09600c9638f6962b8ef167d1d22a21e46”, sibling: “a70145e430c9ffc0527e6679bd3d14c3819921c7bdcee060e3e848c1e60fe771”, position: Right, data: “1b67b42ffe8865f9f551071cb412895c96f5b9f52586e904d9933f57c05981b1”, hash: “3acf37e5cbffb91875022edd43e62b46ba3c950a856938ae1cd19f92e9fb88b8” }, Node { left: “a70145e430c9ffc0527e6679bd3d14c3819921c7bdcee060e3e848c1e60fe771”, right: “1b67b42ffe8865f9f551071cb412895c96f5b9f52586e904d9933f57c05981b1”, parent: “”, sibling: “”, position: None, data: “71dae017bc564544250be0bcad9740c09600c9638f6962b8ef167d1d22a21e46”, hash: “ad52237a2e4eb1512b8bd1ccf1695ef95d9831ad7aeff0ba6718aa549991e020” }]
71dae017bc564544250be0bcad9740c09600c9638f6962b8ef167d1d22a21e46
これで合ってるか?