Solidity 从入门到实战(四)
注意:本专栏主要参考于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748
函数重载
函数重载是指函数命名相同,参数列表不同,即需要满足以下两个条件之一
1.函数传入参数类型不同
2.函数传入参数数量不同
pragma solidity ^0.4.16;contract funTest{
uint public test= 0;function fun1(uint num1,uint num2) {
test = 10;}function fun1(uint num1) {
test = 20;}function fun2(uint a) {
test = 100;}function fun2(string a) {
test = 200;}function fun3(address a) {
test=1000;}function fun3(uint160 a){
test=2000;}function fun4(uint8 a){
test=10000;}function fun4(uint16 a){
test=20000;}function fun1test() public view returns(uint){
fun1(1,2);return test;}function fun2test() public view returns(uint){
fun2('asdasd');return test;}function fun3test() public view returns(uint){
fun3(0x3e805eC48BdFBc458e7446058F94a315896A1cF6);//仅使用address类型,可以运行并运行address参数的重载函数return test;}// function fun3test2() public view returns(uint160){
//uint160 如果转化成uint160类型并运行,那么报错 //temp=uint160(0x3e805eC48BdFBc458e7446058F94a315896A1cF6);//fun3(temp);//return temp;// }//**会出现下图的错误**function fun4test() public view returns(uint){
fun4(256);return test;}function reset() public{
test = 0;}}
函数传入参数
主要有两种方法进行传参
1.可以直接对传入对应参数的值
2.格式 函数名({类型1:value1,类型2:value2,…,类型n:valuen})
3.调用函数的时候必须传入所有参数,否则会报错
pragma solidity ^0.4.16;contract funTest{
uint public num;string public teststring;function setvalue(uint num1,string teststring1){
num=num1;teststring = teststring1;}function test1(){
setvalue(1,'a');}function test2(){
setvalue({
num1:1,teststring1:'a'});}function test3(){
setvalue({
teststring1:'a',num1:1});}// function wrongtest4(){
// setvalue(1); 编译会报错//}}
函数返回值
1.与go语言类似,solidity可以有多个返回值,可以命名(类型1 value1,类型2 value2,…,类型n valuen)
2.其它性质都类似于其它语言的特性
pragma solidity ^0.4.16;contract returnTest{
function test1() public view returns(uint8 num1,uint8 num2,string teststring){
//直接赋值,最后可以看到返回值就是赋的值num1=1;num2=2;teststring='hello';}function test2() public view returns(uint8 num1,uint8 num2,string teststring){
return (10,20,'hello2');//可以直接进行返回}function test3() public view returns(uint8 num1,uint8 num2,string teststring){
num1=1;num2=2;teststring='hello';return (10,20,'hello2');//如果又赋值又返回,那么以return的值为准}function test4() public view returns(uint8 num1,uint8 num2,string teststring1,string teststring2){
teststring1='testnb1';teststring2='testnb2';//return (10+20,10*20,'hello2',teststring1+teststring2);//solidity不支持string的直接拼接return (10+20,10*20,teststring1,teststring2);}
}
变量的作用域
注意:不要在函数内部重新定义一个和函数形参一样的变量
pragma solidity ^0.4.16;contract areaTest{
uint public a=1;function areatest1(uint a) public view returns(uint){
a=10;return a;}function areatest2(uint a) public view returns(uint){
a=10;//重新定义a,会出现下图的错误// for(uint a=0;a<10;a++){
// }return a;}function areatest3() public returns(uint){
//此代码会改变全局变量a的值a++;return a;}function areatest4(uint a) public returns(uint){
//此变量只是局部变量,函数执行结束之后就销毁a++;return a;}function areatest5() public returns(uint){
//此时重定义a是可行的,覆盖全局变量a的值uint a;a=100;return a;}}
constant 关键字
1.函数内部的constant关键字,在4.x版本中它和view是等价的,在5.0版本中将不能使用
2.全局变量、constant属性、局部变量是没有这个属性的。
3.全局变量加上了constant属性,就不能被修改。
4.当前版本支持int,uint,string,bytes1–bytes32 能够使用constant。
pragma solidity ^0.4.16;
contract constantTest{
uint public constant a=1;//function changetest() public{
// a=2; 函数内试图修改,结果编译报错//}// function changetest() public{
// uint constant test=2; //函数内无法声明constant变量// }int public constant b=2;bytes32 public constant c=0x232334224;string public constant d='ttttest';}