我想在魯斯特實現一個簡單的虛擬機。目前,我正在致力於支持空間用於字符串和整數的「RegisterBank」。 的RegisterBank結構看起來如下:
pub struct RegisterBank {
int_registers: Vec<i32>,
str_registers: Vec<String>,
}
所以這是兩個向量的只是一個簡單的集合。
以前的工作:
當我試圖實施「負荷」和「存儲」功能,有兩個不同的功能
pub fn load_int(...) { ... }
pub fn load_str(...) { ... }
和模式匹配之間的選擇(這是我想要的反正學習)
pub fn load(self, register: SomeMatchableType) {
match register { ... }
}
因爲有兩個非常相似的任務一個功能看起來不錯,我嘗試了一些東西IKE此:
enum OperandType {
Number(i32),
Word(String),
}
,然後有像pub fn load(self, register: OperandType)
的功能相匹配寄存器並返回是一個字符串(或& STR,等等)或根據其操作數類型的整數。
問題: 目前的實施是卡在兩個單獨的函數(對於i32和字符串),這是工作正常。因爲我已經設法爲fn store(&mut self, register: usize, value: OperandType)
做到這一點,所以對於fn load(self, register: ???)
這也應該是可能的。我最大的問題是設計這樣一個函數,它將兩個任務合併爲一個模式匹配,具體取決於枚舉(或者如果某人有聰明的想法,也許還有其他的東西)。
基本上,解決方案應該做到:
- 決定哪一個寄存器(int_registers或str_register)選擇基於輸入參數
- 獲取寄存器的內容
- 返回它
你可以做一個'enum RegisterType {Number(usize),Word(usize)}' – Adrian
順便說一句,這與你的問題沒有任何關係,但我認爲你的代碼看起來更習慣,如果你重命名'OperandType '只是'操作數' – Adrian