Solidity字符串和函数

  字符串:需要使用双引号""或者单引号''括起来,例如:定义一个字符串变量:string name="jake";string字符串不能通过length方法获得长度。

一.十六进制数据

  以关键字hex打头,后面紧跟用单或双引号包裹的字符串。如hex"001122ff"。通过下面的例子来理解下是什么意思:

pragma solidity ^0.4.4;

contract HexLiteral{
    function test() returns (string){
      var a = hex"001122FF";
 
      //var b = hex"A";
      //Expected primary expression
      
      return a;
  }
}

  由于一个字节是8位,所以一个hex是由两个[0-9a-z]字符组成的。所以var b = hex"A";不是成双的字符串是会报错的。var类型会在后面的文章进行解释。

 

二.十六进制的字面量与字符串可以进行同样的类似操作(例如索引)

pragma solidity ^0.4.4;

contract HexLiteralBytes{
    function test() returns (bytes4, bytes1, bytes1, bytes1, bytes1){
      bytes4 a = hex"001122FF";
 
      return (a, a[0], a[1], a[2], a[3]);
  }
}

  上面运行结果可以发现,它可以隐式的转为bytes。

 

三.函数(function)

  函数有两种类型,内部函数(internal)和外部函数(external),内部函数只能在当前合约的上下文内使用,外部函数允许使用到本合约之外的地方。函数的默认类型是内部函数,如果外部函数被本合约之外的环境调用,会自动转换为bytes24类型,包括20字节的函数所在地址和4字节的函数方法签名。
  例子:

function abc(uint a) returns(uint){
  return a;       
}

  abc是函数名字,括号内是参数,如果没有参数则括号内为空,returns是返回值,需要在括号内定义好返回值的类型,如果没有返回值,则必须省略returns关键字。

  通过一个例子来学习更多的变化情况:

pragma solidity ^0.4.4;

contract FuntionTest{
    function internalFunc() internal{}
 
    function externalFunc() external{}
 
    function callFunc(){
        //直接使用内部的方式调用
        internalFunc();
 
        //不能在内部调用一个外部函数,会报编译错误。
        //externalFunc();
        //Error: Undeclared identifier.
        
        //不能通过`external`的方式调用一个`internal`
        //Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
        //this.internalFunc();
 
        //使用`this`以`external`的方式调用一个外部函数
        this.externalFunc();
    }
}

contract FunctionTest1{
    function externalCall(FuntionTest ft){
        //调用另一个合约的外部函数
        ft.externalFunc();
        
        //不能调用另一个合约的内部函数
        //Error: Member "internalFunc" not found or not visible after argument-dependent lookup in contract FuntionTest
        //ft.internalFunc();
    }
}

  解释:函数internalFunc被定义为内部函数,可以直接调用。函数externalFunc被定义为外部函数,在本合约内直接调用会报错,需要加上关键字this:this.externalFunc( )才可以。同时,在内部函数前加this函数会报错,不能用外部函数的调用方法来调用内部函数。

  调用另一个合约的外部函数格式:ft.externalFunc( ),fx是另一个合约的名字,externalFunc是外部函数的名字。另一个合约的内部函数是不能被调用的,会报错。

 

文章来源:https://blog.csdn.net/aaa19890808/article/details/79332833

posted on 2018-12-18 19:40  bijian1013  阅读(787)  评论(0编辑  收藏  举报

导航