[区块链&DAPP介绍 Day6] Solidity 教学 - reference types

昨天看完value types,今天来聊聊 reference types。

solidity 的 reference types 有三个东西很特别我们需要先特别来认识一下

  1. memory
    预设 fuction 传入跟 return 它们都是预设放在 memory

  2. storage
    预设的区域变数跟全域变数都是放在 storage

  3. calldata
    效果跟 memory 很接近,但是只有 read only。大部分是应用在参数传入使用

用下面例子两个程序例子

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract hellotest
{
  //这种就叫做 storage
  int[] public numbers;

  function Numbers() public
  {
    numbers.push(1);
    numbers.push(2);

    // 其实不用特意指定,它也是会storage
    int[] storage myArray = numbers;

    // 实质上会影响到 number
    myArray[0] = 0;
  }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract hellotest
{
  int[] public numbers;

  function Numbers() public
  {
    numbers.push(1);
    numbers.push(2);

    //这种就是储存在memory
    int[] memory myArray = numbers;


    //这个异动到的值其实没有,影响到原本的number
    myArray[0] = 0;
  }
}

上面介绍完,有别於一般於三种储存状态,再来介绍一些比较常见的 references-type

Arrays

很常见的宣告,基本上就常见的型别 T[N] 这种宣告方式就可以,下面有一些简单的范例

uint balance[10];
uint balance[3] = [1,2,3];
balance[2]=5;
uint size = 3;
uint balance[] = new uint[](size);

Structs

这个如果善於写 golang,应该都很熟悉,下面也来点简单的介绍

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

contract test {
   struct Member {
      string name;
      string addr;
   }
   Member member;

   function setMember() public {
      member = Member('syhlion', 'Taiwan');
   }
   function getAddress() public view returns (string memory) {
      return member.addr;
   }
}

明天会来介绍 mapping types。


<<:  【Day 1】踏入机器学习的世界

>>:  Day 13:「谁还在背字典?」- Tailwind IntelliSense 插件

[FGL] 可连结资料库的种类与连线方法

既然是从 INFORMIX 剥离出来的工具,应该连结资料库的能力是强大的。本段落我们检视一下Gene...

Day-12 於新电视上再次闪耀的那颗 SEGA 土星

这是一部由 SEGA 出品的第六代主机、故以太阳系中对应的第六颗行星 Saturn 为名、以下就简称...

Delphi 不重覆的字串列 TStringList 试作

Delphi 不重覆的字串列 TStringList 试作 环境:Delphi RAD 10.4 动...

ISO 27001 机房管理部份之三

ISO 27001 机房管理部份之三 稽核分三种 : 内部稽核 (例如 : 稽核组长、稽核小组) 外...

Day 29:653. Two Sum IV - Input is a BST

今日题目 题目连结:653. Two Sum IV - Input is a BST 题目主题:Ha...