Skip to content

Latest commit

 

History

History
140 lines (105 loc) · 5.7 KB

17 函数.md

File metadata and controls

140 lines (105 loc) · 5.7 KB

函数

函数是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;
}

函数可以指定访问修饰符(publicprivateinternalexternal),这将影响谁可以调用该函数。

以下示例函数具有四种不同的访问修饰符:

// Public 函数可以由任何人调用(包括其他智能合约)
function myPublicFunction() public {}

// Private 函数只能从同一合约中的函数调用
function myPrivateFunction() private {}

// Internal 函数只能从同一合约或从与该合约继承关系的合约中的函数调用
function myInternalFunction() internal {}

// External 函数只能从外部(即其他智能合约或以太坊交易)调用
function myExternalFunction() external {}

对于接受结构体或数组等复杂类型的函数,可以使用memorystorage关键字来确定参数或返回值的类型存储位置。

以下是一个使用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

  • 函数可以返回多个值
  • 可以命名返回参数
  • 解构赋值获取多返回值
  • 数组可以作为参数和返回值
  • 函数调用可以按顺序或键值对方式传入参数