Solidity学习::(15)getter访问器

getter访问器


作用: 

对于所有public状态变量,Solidity语言编译器,提供了自动为状态变量生成对应的getter(访问器)的特性

在合约内,我们可以直接操作及访问data状态变量,但在合约外我们只能用data()的方式来访问。另外,在合约内,我们不能直接访问data(),因为访问器函数的可见性是external。

直观版:

(1)合约内访问public状态变量a-----------------------> 直接用a即可   【可set】【可访问】

(2)合约外访问public状态变量a-----------------------> 用a()              【只能访问】

(3)状态变量所创建的访问器函数,与变量同名。

测试代码:

pragma solidity ^0.4.0;

contract AccessGetter{
  uint public data = 10;

  function f() returns (uint, uint){
    //合约内访问
    return (data, this.data());
  }
}

contract SetVar{

  function f(AccessGetter accessget) returns (uint){
    //合约外访问 external的方式访问
    return (accessget.data());
  }
}

 下对于非基本类型类型的状态变量进行举例:

1、枚举

枚举的访问器与基本类型类似,均是生成与状态变量同名的函数。

pragma solidity ^0.4.0;

contract EnumGetter{
  enum Color{Blue, Green, Yellow}
  Color public color = Color.Green;

  function f() returns (Color, Color){
      return (color, this.color());
  }
}

2、数组 

数组的访问器要带参数,以表示数组的下标

测试代码:

(1)一维变长数组

pragma solidity ^0.4.0;

contract ArrayGetter{
  uint[] public arr = new uint[](1);

  function f() returns (uint, uint){
    //直接访问与以带序号参数访问器的方式访问
    return (arr[0], this.arr(0));
  }
}

(2)多维数组

pragma solidity ^0.4.0;

contract ArrayGetter{
    //定义一个长度为3,每个元素都是变长数组的数组
  uint[][3] public arr;

  function f() returns (uint,uint){
    //直接访问与以带序号参数访问器的方式访问
    arr[0].push(2);
    return (arr[0][0],this.arr(0,0));
  }
}

3、映射

显而易见,跟数组差不多的操作。

对于映射类型,它的访问器也是有参数的,参数为映射定义的键类型。

测试代码:

pragma solidity ^0.4.0;

contract MappingGetter{
  mapping(uint => uint) public data;

  function f() returns (uint, uint){
    data[25] = 100;

    //直接访问,通过访问器访问
    return(data[25], this.data(25));
  }
}

 4、结构体

结构体的访问器也是同名的函数。访问器返回结果是结构体中的每个变量。

pragma solidity ^0.4.0;

contract StructGetter{
  struct S{
    uint a;
    string b;
    bytes32 c;
  }

  S public s = S(10, "Hello",hex"1234");
  
  function f() returns (uint, bytes32){
      var (a, b, c) = this.s();
      
      return (a, c);
  }
}

 5、注意事项?

Solidity不支持通过external的访问变长内容?

但是Remix则可以。。


 牛刀小试:

 阅读代码,不运行,求出下面代码返回的值:

pragma solidity ^0.4.0;

contract Complex {
    struct Data {
        uint a;
        bytes3 b;
        mapping (uint => uint) map;
    }
    mapping (uint => mapping(bool => Data[])) public data;
    Data[] internal arr;

    function f() returns (uint, bytes3){
        Data memory d = Data(1, 0x123);
        arr.push(d);
        data[0][true] = arr;

        return this.data(0, true, 0);
    }
}

上述代码将返回10x000123


参考文章: http://me.tryblockchain.org/solidity-getter.html#fn3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值