目录
(1)string不能用length方法求长度;但是bytes是可以的,所以要想知道string长度,我们可以先把他转化为bytes;
一,变量
1.局部变量
- 在函数内部声明
- 不存储在链上
2.状态变量
- 在函数外部声明
- 状态变量是永远存储在链上的值
3.全局变量
- 内置提供的有关于区块链的信息,如block,msg等
二,可见修饰符
1.public
所有合约和账号都可以调用
2.private
只有在定义该函数的合约可以调用(函数里面的)
3.internal
当前合约,或者继承该合约的,类似于java的protected关键字
4.external
只有其他合约或者账号可以调用,合约内的函数不能调用,除非用this
三,函数
1.理解
函数是代码的可执行单元。函数通常在合约内部定义,但也可以在外部定义
2.return和returns
- returns加在函数名后面,用于声明返回的变量类型以及变量名。
- return用于函数主体当中,返回指定的变量。
3.view和pure
- getter类型的函数可以被view或者pure修饰。
view
修饰符适用于只读地访问合约状态的函数,可以读取合约状态变量。pure
修饰符适用于执行纯粹计算的函数,不涉及合约状态或区块链数据。// SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.8.0 <0.9.0 ; contract Function { string public name = 'xfy'; function setName(string memory _name) public returns(string memory) { name = _name; //调用函数不能自执行 return printName(name); } function foo() public pure returns(string memory){ string memory str = 'hello'; return str; } function fzz() public view returns(string memory) { return name; } } function printName(string memory _name) pure returns(string memory) { return _name; }
以上的代码中,foo函数不调用区块链上的状态函数name所以用pure就i够了,但是fzz函数读取了name所以用view,如果是修改的话,如setname函数,就声明都不写。
四,错误处理
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0 <0.9.0;
contract Errordemo{
uint public x = 100;
function doAssert() public returns(uint){
//assert(3>5);
require(3>5);
x = 200;
return x;
}
}
assert是先执行,一旦出错,又改回去了,改回去是消耗gas的。
require是先执行,如果错了,就会回滚,然后会退回gas修改所消耗的gas
(他后面还可以自定义错误信息,显示出来。)