深入理解Solidity——Using for

2023-11-01

指令using A for B;用来附着库里定义的函数(从库A)到任意类型B。这些函数将会默认接收调用函数对象的实例作为第一个参数。语法类似,python中的self变量一样。

using A for *的效果是,库A中的函数被附着在做任意的类型上。

在这两种情形中,所有函数,即使那些第一个参数的类型与调用函数的对象类型不匹配的,也被附着上了。类型检查是在函数被真正调用时,函数重载检查也会执行。

using A for B;指令仅在当前的作用域有效,且暂时仅仅支持当前的合约这个作用域,后续也非常有可能解除这个限制,允许作用到全局范围。如果能作用到全局范围,通过引入一些模块(module),数据类型将能通过库函数扩展功能,而不需要每个地方都得写一遍类似的代码了。

下面我们来换个方式重写set的例子。

pragma solidity ^0.4.16;

// This is the same code as before, just without comments
library Set {
  struct Data { mapping(uint => bool) flags; }

  function insert(Data storage self, uint value)
      public
      returns (bool)
  {
      if (self.flags[value])
        return false; // already there
      self.flags[value] = true;
      return true;
  }

  function remove(Data storage self, uint value)
      public
      returns (bool)
  {
      if (!self.flags[value])
          return false; // not there
      self.flags[value] = false;
      return true;
  }

  function contains(Data storage self, uint value)
      public
      view
      returns (bool)
  {
      return self.flags[value];
  }
}

contract C {
    using Set for Set.Data; // this is the crucial change
    Set.Data knownValues;

    function register(uint value) public {
        // Here, all variables of type Set.Data have
        // corresponding member functions.
        // The following function call is identical to
        // `Set.insert(knownValues, value)`
        require(knownValues.insert(value));
    }
}

我们也可以通过这种方式来扩展基本类型。

pragma solidity ^0.4.16;

library Search {
    function indexOf(uint[] storage self, uint value)
        public
        view
        returns (uint)
    {
        for (uint i = 0; i < self.length; i++)
            if (self[i] == value) return i;
        return uint(-1);
    }
}

contract C {
    using Search for uint[];
    uint[] data;

    function append(uint value) public {
        data.push(value);
    }

    function replace(uint _old, uint _new) public {
        // This performs the library function call
        uint index = data.indexOf(_old);
        if (index == uint(-1))
            data.push(_new);
        else
            data[index] = _new;
    }
}

需要注意的是所有库调用都实际上是EVM函数调用。这意味着,如果你传的是memory类型的,或者是值类型,那么仅会传一份拷贝,即使是self变量。变通之法就是使用存储类型的变量,这样就不会拷贝内容。

上一篇:深入理解Solidity——库

下一篇:深入理解Solidity——Solidity汇编

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解Solidity——Using for 的相关文章

随机推荐

  • 爬取杂志所有期刊的文章案例

    爬取杂志所有期刊的文章案例 前言 这次给大家带来一个简单的爬虫案例 就是爬取意林杂志所有期刊的文章 本案例网址 https www yilinzazhi com 一 分析网页 可以看出这个网站的网页很规整 而且没有反爬 每一年的期刊日期都是
  • Flutter绘制系列03---绘制图片文字

    1 绘制图片系列 因为读取图片是一个异步的操作 在读取完毕之后 需要重新渲染界面 也就是可变状态 现在要有一个概念 画布只承担绘制工作 一切数据的来源由使用者来提供 也就是将ui Image对象作为参数传递給PaperPainter 画板质
  • PowerVM 分区快速划分配置工具的使用方法

    在 PowerVM 虚拟化配置实施时 管理员经常要面对数十台物理服务器 数百个分区 如果采取手工配置与实施 工作量大 繁琐 且会造成大量的重复劳动 针对这种情况 IBM 系统科技实验室服务部推出了 PowerVM 分区快速划分与配置工具 P
  • flask - 定义API接口

    flask自行定义API接口 并且可以实现接口调试的增删查改 需要两个工具 pip install flask restful pip install flask marshmallow 初始化app 初始化app的两种方式 Api app
  • 用Python实现PDF转Word文档

    Refer to 只需2行代码 轻松将PDF转换成Word Introduce 要用Python实现PDF转Word 需要通过python内的PYMuPDF库提取PDF文件中的数据然后采用python docx库解析内容的布局 段落 图片
  • php中session超时严格控制的解决方案

    php中session默认是30分钟超时 但是有的时间压根就没到30分钟就自动超时了 这对很多操作带来不便 下面我们来看看解决30分钟超时的办法 第一种回答 最常见的一种回答是 设置Session的过期时间 也就是session gc ma
  • 荒野大镖客ol 服务器位置,荒野大镖客OL盗贼据点分布位置

    玩家们好 本次小编为大家介绍一下荒野大镖客OL盗贼据点分布位置 一起来看看吧 有关盗贼据点的相关事项 1 地点都差不多不会变 最多是稍有一点点偏差 这一点我很确定 因为同地点我刷过两三次 2 如果其它玩家灭过该位置的盗贼据点的话 一定时间内
  • “errcode“:60020,“errmsg“:“not allow to access from your ip,from ip: 183.198.X.X

    企业微信开发过程中 添加组织人员遇到的问题 主要是这个ip没有被认可 需要添加白名单 步骤如下 管理工具 通讯录同步 通讯录同步 企业可信IP 配置本地ip加入白名单即可
  • 一枚芯片的实际成本是多少?(2)晶片的成本

    晶片的成本 由于在将晶圆加工 切割成晶片的时候 并不是能保证100 利用率的 因而存在一个成品率的问题 所以晶片的成本用公式表示就是 晶片的成本 晶圆的成本 每片晶圆的晶片数 晶片成品率 由于晶圆是圆形的 而晶片是矩形的 必然导致一些边角料
  • 【Kubernetes】神乎其技的K8s到底是什么,为什么被越来越多人使用

    欢迎来到本文 个人简介 陈童学哦 目前学习C C 算法 Python Java等方向 一个正在慢慢前行的普通人 系列专栏 陈童学的日记 其他专栏 C STL 感兴趣的小伙伴可以看看 希望各位 点赞 收藏 留言 万物从心起 心动则万物动 前言
  • 自定义训练大型语言模型(LLM):带有代码示例的详细指南

    自定义训练大型语言模型 LLM 带有代码示例的详细指南 这篇文章提供了一个综合指南 描述了关于如何使用代码示例和实例来自定义训练大型语言模型 例如GPT 4 的方法 近年来 大型语言模型 LLM 如GPT 4因其在自然语言理解和生成方面的惊
  • 如何在VC++IDE 环境下生成.MAK文件

    转载自以下 同样只适用于EVC VC6 不适用于VS2003及以上 http blog csdn net lantian1099 article details 1833253 通过VC IDE 环境中的 TOOLS gt OPTIONS
  • kvm qemu内幕介绍

    kvm qemu内幕介绍 标签 虚拟化io数据结构linux内核优化磁盘 2012 09 14 11 10 6923人阅读 评论 4 收藏 举报 分类 linux 56 版权声明 本文为博主原创文章 未经博主允许不得转载 目录 1 硬件虚拟
  • Kaldi中文语音识别-----手把手教你kaldi的安装编译

    写在前面 本人目前读研中 小白一枚 主要研究方向 语音识别及语音歌曲合成 在这里记录一下自己学习软件的过程 还望大神们口下留情 kaldi是什么 kaldi是一个用C 写的语音识别工具包 kaldi旨在供语音识别研究员使用 当然 kaldi
  • RGB TFT-LCD彩条显示实验

    实验任务 本节的实验任务是使用正点原子ZYNQ开发板上的RGB TFT LCD接口 驱动RGB LCD液晶屏 支持目前推出的所有RGB LCD屏 并显示出彩条 模块示意图 RGBTFT LCD输入时序包含三个要素 像素时钟 同步信号 以及图
  • 也谈分离JavaScript和HTML

    不知道能不能将JavaScript和HTML的分离也归结为 你必将业务逻辑由显示中分离 thou shalt separate business logic from display 1 的问题 但有HTML和CSS的分离在前面对照 它们的
  • java mysql 项目_mysql数据库如何实现与Java项目连接

    mysql数据库如何实现与Java项目连接 发布时间 2020 11 09 16 47 40 来源 亿速云 阅读 68 作者 Leah mysql数据库如何实现与Java项目连接 很多新手对此不是很清楚 为了帮助大家解决这个难题 下面小编将
  • Python发送邮件

    Python3 SMTP 发送邮件 在现代社会 邮件已经成为了人们重要的沟通方式之一 Python3 提供了 SMTP 库 使得发送邮件变得非常容易 本文将介绍如何使用 Python3 中的 SMTP 库来发送邮件 SMTP 简介 SMTP
  • 虚拟机VMwar报错:您没有查看“hgfs“的内容所需的权限解决

    取消挂载 sudo umount mnt hgfs 再指定用户和组挂载 sudo vmhgfs fuse host mnt hgfs o allow other o uid 1000 o gid 1000 o umask 022
  • 深入理解Solidity——Using for

    指令using A for B 用来附着库里定义的函数 从库A 到任意类型B 这些函数将会默认接收调用函数对象的实例作为第一个参数 语法类似 python中的self变量一样 using A for 的效果是 库A中的函数被附着在做任意的类