当然,可以通过条件来完成,但我想知道是否有更直接的方法。
如果没有任何明确的方法,那么实现它的最佳方法是什么?
在当前版本 0.8 中,没有本地函数可以从一组输入数字中获取最小值/最大值。
对于静态数量的值,您可以实现一个简单的条件(如果有超过 2 个值,则可以实现一组条件):
function max(uint256 a, uint256 b) external pure returns (uint256) {
return a >= b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
对于动态数量的值,您可以简单地循环输入数组并跟踪最小/最大值:
function max(uint256[] memory numbers) external pure returns (uint256) {
require(numbers.length > 0); // throw an exception if the condition is not met
uint256 maxNumber; // default 0, the lowest value of `uint256`
for (uint256 i = 0; i < numbers.length; i++) {
if (numbers[i] > maxNumber) {
maxNumber = numbers[i];
}
}
return maxNumber;
}
Run Code Online (Sandbox Code Playgroud)
该函数具有线性复杂度。只读调用是免费的,但如果您max()由于交易而从另一个函数执行(这会花费汽油费),请注意复杂性。
OpenZeppelin 提供了一个Math.max可以用于此目的的函数:
import "openzeppelin-contracts/utils/math/Math.sol";
uint256 max = Math.max(a, b);
Run Code Online (Sandbox Code Playgroud)
https://docs.openzeppelin.com/contracts/3.x/api/math#Math-max-uint256-uint256-
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |