在 Rust 用 trait 實現 OOP 的單層多重繼承

有了這寫法,就可以輕鬆實現多種功能隨意組合了

純方法,沒有依賴結構

直接寫 traitimpl Trait for Struct {}

有依賴結構

// 功能 A
mod func_a {
	#[derive(Default)]
	pub struct FuncAStruct {
		v: u8
	}
	pub trait FuncATrait: AsRef<FuncAStruct> + AsMut<FuncAStruct> {
		fn a_get(&self) -> u8 {
			//取值的方法,`self.as_ref()` 可以拿到 &FuncAStruct
			self.as_ref().v
		}
		fn a_set(&mut self, value: u8) {
			//改值的方法,`self.as_mut()` 可以拿到 &mut FuncAStruct
			self.as_mut().v += value;
		}
	}
}

// 功能 B
mod func_b {
	#[derive(Default)]
	pub struct FuncBStruct {}
	pub trait FuncBTrait: AsRef<FuncBStruct> + AsMut<FuncBStruct> {}
}

mod s {
	use super::func_a::{ FuncAStruct, FuncATrait };
	use super::func_b::{ FuncBStruct, FuncBTrait };
	
	#[derive(Default)]
	pub struct S {
		func_a: FuncAStruct,
		func_b: FuncBStruct,
	}

	// 讓 S 有功能 A
	impl AsRef<FuncAStruct> for S {
		fn as_ref(&self) -> &FuncAStruct {
			&self.func_a
		}
	}
	impl AsMut<FuncAStruct> for S {
		fn as_mut(&mut self) -> &mut FuncAStruct {
			&mut self.func_a
		}
	}
	impl FuncATrait for S {}

	// 讓 S 有功能 B
	impl AsRef<FuncBStruct> for S {
		fn as_ref(&self) -> &FuncBStruct {
			&self.func_b
		}
	}
	impl AsMut<FuncBStruct> for S {
		fn as_mut(&mut self) -> &mut FuncBStruct {
			&mut self.func_b
		}
	}
	impl FuncBTrait for S {}
}

use self::s::S;
// 把需要用到的功能引進來才能用
use self::func_a::FuncATrait;

fn main() {
	let mut s: S = Default::default();
	s.a_set(9);
	println!("func_a.v = {}", s.a_get());
}

Related posts

Serde 對現有值進行複寫的反序列化

Serde 反序列化除了基於預設值複寫外,也可以基於其他現有值複寫,通過不在文件上寫明的公開穩定特徵方法 serde::Deserialize::deserialize_in_place() 可以做到。

原始碼中的註解表示,這個方法被隱藏的原因是新手很少使用。我說這很常用吧....

Rust 巨集語法 macro_rules

參考:

https://doc.rust-lang.org/reference/macros-by-example.htmlhttps://veykril.github.io/tlborm/decl-macros/minutiae/fragment-specifiers.html

巨集語法太廣了,看起來還有 @內部規則 之類的用法,之後再看...

定義巨集

macro_rules! 巨集名稱 {
比對規則 => { 產生程式 };
...
}

比對規則

參數輸入

使用巨集時填入的參數會基於 Rust 語法被編譯器分解為帶階層的字串組,再對規則做比對

a+b 會分解為 a +...

vim 操作

啟動參數

-p 可將多個檔案各別開到標籤頁

快速鍵

= 文字重新排版、格式化

za 開關 fold

. 重複文字操作

@: 重複指令操作

^ / Home 前往行開頭

$ / End 前往行結尾

g t...

原子操作 memory order 設定

這個設定可以限制 CPU 亂序執行的執行順序,簡單說明如表:

設定值讀寫順序relaxedOO不影響acquireOX後面的程式要等這行執行完了才會執行,即後面的程式不會早於此操作執行。releaseXO前面的程式要都執行完了才會執行後面的程式,即前面的程式不會晚於此操作執行acq_relOO等同 acquire + releaseseq_cstOO視操作類型加上 acquire, release, acq_rel 其一,並依序向其他線程同步consumeOX等同 acquire,但只向與該變數有關的線程同步據說編譯器沒實作這東西,沒驗證是否為真

整理資訊原文

memory_order_relaxed:純原子操作,不影響順序memory_order_acquire:只能用於取值,且確保後面變數的讀寫操作不會再取值前開始(即保證後面的變數操作不會被往前排)memory_order_release:只能用於寫值,寫值前會確保前面變數的讀寫操作都完成了(即保證前面的變數操作不會被往後排)關聯點:使用 memory_order_acquire 的線程會向使用 memory_order_release...

Leave a Comment

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *