昨天看完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。