Solidity 练习:库
睡不醒的鲤鱼 2022-12-29 Web3 Solidity
# 一、题目说明
库类似于合约,但是不能声明任何状态变量,也不能发送 Ether。
如果库中的所有函数都是 internal 的,则库将嵌入到合约中;否则,必须先部署库,然后在部署合约之前将其链接。
# 二、任务列表
- 在 Math 库中,编写函数 min(uint x, uint y),返回 x 和 y 中的较小值。在 TestMath.testMin 中使用 min 函数。
- 在 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
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