个人目录
以太坊solidity学习记录(一)新版在线remix编译器的使用(2020.4.27)
以太坊solidity学习记录(二)基础操作整理
以太坊solidity学习记录(三)基础数据操作
以太坊solidity学习记录(四)地址与交易
以太坊solidity学习记录(五)函数入门
以太坊solidity学习记录(六)内存与结构体
1.函数重载
结论:
1.函数重载是指函数命名相同,但需要满足以下两个条件之一
a.函数传入参数类型不同
b.函数传入参数数量不同
2.如果函数多个参数都匹配,那么会报错
3.address因为实际存储的也是uint160
代码
pragma solidity ^0.4.0;
contract funtest{
/*function fun0() {
}
function fun0() {
}*/
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(0x2e805eC48BdFBc458e7446058F94a315896A1cF6);
//仅使用address类型,可以运行并运行address参数的重载函数
return test;
}
//function fun3test2() public view returns(uint160){
//uint160 如果转化成uint160类型并运行,那么报错
//temp=uint160(0x2e805eC48BdFBc458e7446058F94a315896A1cF6);
//fun3(temp);
//return temp;
//}
function fun4test() public view returns(uint){
fun4(256);
return test;
}
function reset() public{
test = 0;
}
}
运行结果
2.函数传入参数
结论:
1.可以直接对传入参数里面的命名来进行对应命名。这样可以调整顺序
2.格式
函数名({类型1:value1,类型2:value2,…,类型n:valuen})需要打{},而且等号(=)换成冒号(:)
3.使用时必须传入所有参数,否则报错
contract nametest{
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({teststring1:'a'});
//}
}
运行结果:
其他的可以自行点击test1,test2,test3看结果
3.函数返回参数
结论:
1.solidity可以有多个返回值,可以命名(类型1 value1,类型2 value2,....,类型n valuen)
,可以直接赋值,如value1=111;
,赋值之后return里面对应参数也会修改,可以不用return。
2.return语句后面可以接表达式,如uint类型 return (value1+value2, value1*value2);
;
3.可以直接接具体数值,如uint类型 return (1+2,1*2,'teststring');
代码
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');//如果又赋值又返回,那么以最后为准
}
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);