Skip to main content

narust_158/entity/
item.rs

1//! 🎯复刻OpenNARS `nars.entity.Item`
2//! * ✅【2024-05-02 00:54:15】所有方法基本复刻完毕
3
4use super::BudgetValue;
5use crate::{inference::Budget, util::ToDisplayAndBrief};
6use serde::{Deserialize, Serialize};
7
8/// 模拟`nars.entity.Item`
9/// * 📌袋中的「物品」类型
10/// * 📝实际上其「键」和其「预算」都应只限于在「袋」内
11///   * 📌即便实际上其自身有存储,也不过是在一种「特殊条件」下进行
12/// * 🚩【2024-04-28 08:38:15】目前仍然先参照OpenNARS的方法来
13///   * 在`Item`类中,有存在「不通过『袋』访问『预算』」的情况
14/// * 🚩【2024-05-01 23:17:26】暂且按照OpenNARS的命名来:直接使用`Item`而非`BagItem`
15/// * 📍示例:只实现「像预算那样『具有p、d、q属性』,但不仅仅有p、d、q属性」且不能直接从p、d、q构造
16///   * ℹ️亦即:实现[`BudgetValue`]而未实现[`BudgetValueConcrete`]
17///   * ✨并不「继承」预算值,但却可以当预算值一样使用(属性&方法)
18///
19/// An item is an object that can be put into a Bag,
20/// to participate in the resource competition of the system.
21///
22/// It has a key and a budget. Cannot be cloned
23pub trait Item: Budget {
24    /// 获取其元素id
25    /// * 🎯应该只与自身数据绑定
26    ///   * 📄概念的「词项名」
27    fn key(&self) -> &String;
28
29    /// 🆕决定「袋」中俩[`Item`]的合并顺序
30    /// * 📜默认的「合并顺序」:旧→新(然后抛掉旧的)
31    fn merge_order(&self, _new: &Self) -> MergeOrder {
32        MergeOrder::OldToNew
33    }
34}
35
36/// 预算合并顺序(枚举)
37/// * 🎯用于「袋」中「相同key值预算该从哪儿合并到哪儿」的逻辑
38#[derive(Debug, Clone, Copy, PartialEq, Eq)]
39pub enum MergeOrder {
40    /// 从「将移出的Item」合并到「新进入的Item」
41    /// * 📌修改「新进入的Item」
42    OldToNew,
43    /// 从「新进入的Item」合并到「将移出的Item」
44    /// * 📌修改「将移出的Item」
45    NewToOld,
46}
47
48/// 🆕一个基于「复合」而非「继承」的[`Item`]默认实现
49/// * 🎯用于内含字段并让「任务」「概念」等分发
50#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
51pub struct Token {
52    /// The key of the Item, unique in a Bag
53    /// * ❓后续可以放入「袋」中,使用「Key → Item(T, Budget)」的结构将「预算值」完全合并入「袋」中
54    ///   * 📌【2024-06-21 22:34:13】注:这是个大工程,需要完全不同的数据类型架构
55    ///   * 📄参考OpenNARS改版的`dev-bag-item`分支
56    key: String,
57
58    /// The budget of the Item, consisting of 3 numbers
59    /// * 📝仅用于各预算值函数,以及在「袋」中的选取(优先级)
60    budget: BudgetValue,
61}
62
63impl Token {
64    /// 构造函数
65    /// * 📌对所有参数均要求完全所有(排避免意外的共享引用)
66    pub fn new(key: impl Into<String>, budget: BudgetValue) -> Self {
67        Token {
68            key: key.into(),
69            budget,
70        }
71    }
72
73    /// 预算值(读写)
74    pub fn budget(&self) -> &BudgetValue {
75        &self.budget
76    }
77
78    /// 预算值(读写)
79    pub fn budget_mut(&mut self) -> &mut BudgetValue {
80        &mut self.budget
81    }
82}
83
84impl ToDisplayAndBrief for Token {
85    fn to_display(&self) -> String {
86        format!("{} {}", self.budget_to_display(), self.key)
87    }
88
89    fn to_display_brief(&self) -> String {
90        format!("{} {}", self.budget_to_display_brief(), self.key)
91    }
92}
93
94// 委托实现「预算值」
95impl Budget for Token {
96    fn priority(&self) -> super::ShortFloat {
97        self.budget.priority()
98    }
99
100    fn __priority_mut(&mut self) -> &mut super::ShortFloat {
101        self.budget.__priority_mut()
102    }
103
104    fn durability(&self) -> super::ShortFloat {
105        self.budget.durability()
106    }
107
108    fn __durability_mut(&mut self) -> &mut super::ShortFloat {
109        self.budget.__durability_mut()
110    }
111
112    fn quality(&self) -> super::ShortFloat {
113        self.budget.quality()
114    }
115
116    fn __quality_mut(&mut self) -> &mut super::ShortFloat {
117        self.budget.__quality_mut()
118    }
119}
120
121impl Item for Token {
122    /// 键(只读)
123    fn key(&self) -> &String {
124        &self.key
125    }
126}