Solidity 练习:库

2022-12-29 Web3 Solidity

# 一、题目说明

库类似于合约,但是不能声明任何状态变量,也不能发送 Ether。

如果库中的所有函数都是 internal 的,则库将嵌入到合约中;否则,必须先部署库,然后在部署合约之前将其链接。

# 二、任务列表

  1. 在 Math 库中,编写函数 min(uint x, uint y),返回 x 和 y 中的较小值。在 TestMath.testMin 中使用 min 函数。
  2. 在 ArrayLib 库中,编写函数 sum,返回数组 arr 中所有元素的和。在 TestArray.testSum 中使用 sum 函数。

# 三、解答代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

library Math {
    function max(uint x, uint y) internal pure returns (uint) {
        return x >= y ? x : y;
    }
    
    function min(uint x, uint y) internal pure returns (uint) {
        return x <= y ? x : y;
    }
}

contract TestMath {
    function testMax(uint x, uint y) external pure returns (uint) {
        return Math.max(x, y);
    }

    function testMin(uint x, uint y) external pure returns (uint) {
        return Math.min(x, y);
    }
}

library ArrayLib {
    function find(uint[] storage arr, uint x) internal view returns (uint) {
        for (uint i = 0; i < arr.length; i++) {
            if (arr[i] == x) {
                return i;
            }
        }
        revert("not found");
    }
    
    function sum(uint[] storage arr) internal view returns (uint) {
        uint ans;
        for (uint i = 0; i < arr.length; i++) {
            ans += arr[i];
        }
        return ans;
    }
}

contract TestArray {
    using ArrayLib for uint[];

    uint[] public arr = [3, 2, 1];

    function testFind() external view {
        arr.find(2);
    }

    function testSum() external view returns (uint) {
        return arr.sum();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

# 四、参考资料

Last Updated: 2023-01-28 4:31:25