高级EOS系列 - 第2部分 - 单例模式

单例
欢迎来到高级EOS开发系列,在这里我将讨论技术和功能,这些很少被教程和课程所涵盖。本系列的目的是汇集您在EOS网络上作为应用程序开发人员完成技能所需的缺失部分。每个帖子都是按难度排序的,所以如果您想要概述,我建议您从第1部分开始完成。对于本系列的第2部分,我们将查看Singletons,此示例的所有代码都可以在GitHub上找到

MitchPierias/Advanced-EOS-Examples

由于这些是高级或扩展主题,我很严肃地假设您已经了解基础知识,并希望进一步了解您的知识。出于这个原因,这些文章中共享的代码将简化为正在讨论的主题。

单例模式应该用来存储合约状态,或者当只需要一行时,作为多索引表的替代。

持久性

我们将探讨单例模式作为合约状态持久性的方法。使用table会浪费资源,因为我们的数据只会占用一行。

定义单例模式

对于此示例,我们将使用单例来存储合约配置状态。让我们用结构来定义我们的单例。我们将使用一种bool类型closed和uint32_t类型char_count。我们可以用它来限制用户上传大小。

struct Config {
  bool		closed = false;
  uint32_t	char_count = 144;
};

typedef singleton<N(settings), Config> settings_table;

接下来,我们将为我们的实例创建一个占位符变量,使其在合同的上下文中成为全局变量。

settings_table config;
初始化Singleton

我们可以在每次使用它时或在我们的合约构造函数中初始化我们的单例,以便在我们的合约的每个操作中都可用。我们在这个例子中的合约被命名singletons,但你可以称之为你想要的。

singletons(action_name self) : contract(self), config(_self, _self) {}

与多索引表类似,初始化单例采用contract-code和scope。在这个例子中,我们将代码和范围都设置为_self.

获取单例模式的值

现在我们已经初始化了单例,我们可以通过读取char_count值并将其打印到控制台来开始与值进行交互。

auto state = config.get();
print(state.char_count);

就是这样!我们config.get()检索先前初始化的单例并将其分配给state变量。现在我们可以访问struct使用点符号的属性。

给单例赋值

在这个例子中,我们将char_count使用成员函数更新属性singleton.set(STRUCT,PAYER)让我们看两个方法来更新我们的单例。

方法1 - 内联更新

最简单的方法是构建我们的内联结构,将它直接传递给我们设置的set函数,就像这样;

config.set(Config{true, 172}, _self);

这里我们设置closed为true,char_count为172,同时委托_self作为此RAM的付款人。当struct只包含几个属性并维护属性顺序时,此方法是干净的,但我们需要一个更好的方法来处理更大的结构。

方法2 - 检索和更新

接下来让我们使用fetch和update方法重新打开我们的合约。首先,我们将Config使用该singleton.get()方法获取当前状态,设置closed值,然后再次设置状态。

auto state = config.get();
state.closed = false;
config.set(state, _self);

这就是单例模式,简单!在下一部分中,我们将研究多索引表索引,主要关注使用二级索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值