函数接受有类型的参数作为输入,并且可能与许多其他语言不同,也可以返回任意数量的值作为输出。(英文好的小伙伴可参考原汁原味官方文档)
函数参数
函数参数的声明方式与变量相同,未使用的参数的名称可以省略。例如,如果你想让合约接受一种带有两个整数的外部调用,你可以使用如下方法:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract Simple {
uint sum;
function taker(uint _a, uint _b) public {
sum = _a + _b;
}
}
函数参数可以被赋值,用作任何其他局部变量。另外solidity中对于函数参数命名有一定的规范(使用‘_’下划线前缀),这也是代码编程的最佳实践。
外部函数不能接受多维数组作为输入参数。如果您通过在源文件中添加 pragma abicoder v2 来启用 ABI coder v2 ,则此功能是可能的。内部函数可以在不启用该特性的情况下接受多维数组。
返回变量
函数返回变量在关键字returns之后用与函数参数相同的语法声明。例如,假设你想返回两个结果:作为函数参数传递的两个整数的和与乘积,那么你可以使用如下方法:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract Simple {
function arithmetic(uint _a, uint _b)
public
pure
returns (uint o_sum, uint o_product)
{
o_sum = _a + _b;
o_product = _a * _b;
}
}
返回变量的名称可以省略。返回变量可以被用作任何其他局部变量,并使用其默认值进行初始化,直到(重新)赋值为止。你可以显式地赋值给返回变量,然后保持上述函数不变,或者你可以直接用return语句提供返回值(一个或多个):
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
contract Simple {
function arithmetic(uint _a, uint _b)
public
pure
returns (uint o_sum, uint o_product)
{
return (_a + _b, _a * _b);
}
}
如果使用提前返回来离开具有返回变量的函数,则必须在使用return语句的时提供返回值。
不能从非内部函数返回某些类型,特别是多维动态数组和结构体。如果你通过添加 pragma abicoder v2 来启用ABI coder v2; 对于您的源文件,可以使用更多类型,但mapping类型仍然局限于单个合约内,您不能传输它们。
返回多个变量值
当一个函数有多个返回类型时,语句返回(v0, v1,…, vn)可以用来返回多个值。组件的数量必须与返回变量的数量相同,并且它们的类型必须匹配(可能存在隐式转换)。