函数是Solidity中定义的代码块,可以用来接收和返回值。
以下是一些Solidity函数的示例:
// SPDX-License-Identifier: MIT // SPDX 许可证标识符,表示此智能合约采用 MIT 许可证
pragma solidity ^0.8.17; // 版本指令,表示当前智能合约需要使用 Solidity 0.8.17 及以上版本
contract Function { // 定义了名为 Function 的智能合约
// Functions can return multiple values. // 函数可以返回多个值
function returnMany() public pure returns (uint, bool, uint) { // 定义了一个名为 returnMany 的函数,该函数没有修改状态(即 pure),并返回三个值(即 uint、bool 和 uint)
return (1, true, 2); // 返回三个值
}
// Return values can be named. // 返回值可以有名称
function named() public pure returns (uint x, bool b, uint y) { // 定义了一个名为 named 的函数,该函数没有修改状态(即 pure),并返回三个值,分别是 uint 类型的 x 和 y,以及 bool 类型的 b
return (1, true, 2); // 返回三个值,并将它们分别赋值给 x、b 和 y
}
// Return values can be assigned to their name.
// In this case the return statement can be omitted. // 返回值也可以分配到它们的名称中。在这种情况下,返回语句可以省略
function assigned() public pure returns (uint x, bool b, uint y) { // 定义了一个名为 assigned 的函数,该函数没有修改状态(即 pure),并返回三个值,分别是 uint 类型的 x 和 y,以及 bool 类型的 b
x = 1; // 将 1 赋值给变量 x
b = true; // 将 true 赋值给变量 b
y = 2; // 将 2 赋值给变量 y
}
// Use destructuring assignment when calling another
// function that returns multiple values. // 在调用返回多个值的另一个函数时使用解构赋值
function destructuringAssignments()
public
pure
returns (uint, bool, uint, uint, uint) // 定义了一个名为 destructuringAssignments 的函数,该函数没有修改状态(即 pure),并返回五个值(即 uint、bool、uint、uint 和 uint)
{
(uint i, bool b, uint j) = returnMany(); // 调用之前定义的 returnMany 函数,并将它返回的三个值分别赋值给 i、b 和 j 变量
// Values can be left out.
(uint x, , uint y) = (4, 5, 6); // 定义了一个包含三个元素的数组,将这个数组的第一个和第三个元素分别赋值给变量 x 和 y
return (i, b, j, x, y); // 返回五个值,分别为 i、b、j、x 和 y
}
// Cannot use map for either input or output
// 不能将映射用于输入或输出
// Can use array for input // 可以在输入中使用数组
function arrayInput(uint[] memory _arr) public {} // 定义了一个名为 arrayInput 的函数,该函数接受一个 uint 类型的数组作为参数,并没有返回值
// Can use array for output // 可以在输出中使用数组
uint[] public arr; // 声明了一个名为 arr 的数组变量,类型为 uint 数组
function arrayOutput() public view returns (uint[] memory) { // 定义了一个名为 arrayOutput 的函数,该函数只读(即 view),返回一个 uint 类型的数组
return arr; // 返回数组 arr
}
}
// Call function with key-value inputs
contract XYZ { // 定义了一个名为 XYZ 的智能合约
function someFuncWithManyInputs( // 定义了一个名为 someFuncWithManyInputs 的函数,它接收多个不同类型
函数可以有以下类型的参数和返回值:
bool
:布尔值(true或false)string
:字符串int
:有符号整数uint
:无符号整数address
:以太坊地址bytes
:字节数组
以下是一个接受和返回整数的函数示例:
function calculate(uint256 x) public pure returns (uint256) {
return x * 2;
}
函数可以指定访问修饰符(public
,private
,internal
和external
),这将影响谁可以调用该函数。
以下示例函数具有四种不同的访问修饰符:
// Public 函数可以由任何人调用(包括其他智能合约)
function myPublicFunction() public {}
// Private 函数只能从同一合约中的函数调用
function myPrivateFunction() private {}
// Internal 函数只能从同一合约或从与该合约继承关系的合约中的函数调用
function myInternalFunction() internal {}
// External 函数只能从外部(即其他智能合约或以太坊交易)调用
function myExternalFunction() external {}
对于接受结构体或数组等复杂类型的函数,可以使用memory
或storage
关键字来确定参数或返回值的类型存储位置。
以下是一个使用memory
关键字进行数组计算的示例:
pragma solidity ^0.8.0;
contract MyContract {
function calculate(uint[] calldata numbers) public pure returns (uint) {
uint sum = 0;
for (uint i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
return sum;
}
}
最后,注意当函数接收以太坊发送的资金时,必须使用payable
关键字,并且可以指定函数触发的事件。
以下是一个接受资金和触发事件的函数示例:
pragma solidity ^0.8.0;
contract MyContract {
event PaymentReceived(address from, uint amount);
function receivePayment() external payable {
emit PaymentReceived(msg.sender, msg.value);
}
}
对于Function
- 函数可以返回多个值
- 可以命名返回参数
- 解构赋值获取多返回值
- 数组可以作为参数和返回值
- 函数调用可以按顺序或键值对方式传入参数