Rust語言之GoF設計模式:原型模式

banq 發表於 2022-09-25
設計模式 Go

原型模式:一種建立模式,允許您複製現有物件而不依賴於它們的型別。
原型Prototype允許克隆物件,甚至是複雜的物件,而無需耦合到它們的特定類。

Rust 有許多型別的標準Clone實現(透過#[derive(Clone)]),這使得Prototype 易於使用且無縫。

#[derive(Clone)]
struct Rectangle {
    width, height: u32,
}

let rectangle1 = Rectangle::new(10, 20);
let mut rectangle2 = rectangle1.clone();
rectangle2.set_width(50);


談到克隆或原型模式,一個繞不開的話題是:按值傳遞與按引用傳遞。
但在大多數語言中,變數不能直接持有物件/結構,建立它們的唯一方法是在堆上透過指標。這意味著對於大多數複雜的型別,你是在傳遞引用而不是複製它們。

因此,Rust的最大區別在於它允許你直接在堆疊中建立結構,並透過複製來傳遞它們。
它還引入了一個新的移動值的概念(本質上只是一個複製,但確保原始值不再被使用)。
rusts思維方式的一大好處是:從來不用擔心過深度克隆與淺層克隆的問題。
而且你基本上可以在需要的地方建立所有的深/淺克隆型別(比如當你明確希望事物被淺層複製時,使用引用或Arc/Rc)。

在Rust中,所有的東西都是透過值傳遞的,但是你仍然可以顯式地做一個引用並傳遞引用,這本質上就是透過引用傳遞。引用本身是透過值傳遞的,但被傳遞的值只是對其他東西的引用。

參考:Rust智慧指標