function nextInitializedTickWithinOneWord(
mapping(int16 => uint256) storage self,
int24 tick,
int24 tickSpacing,
bool lte
) internal view returns (int24 next, bool initialized) {
int24 compressed = tick / tickSpacing;
if (lte) {
(int16 wordPos, uint8 bitPos) = position(compressed);
uint256 mask = (1 << bitPos) - 1 + (1 << bitPos);
uint256 masked = self[wordPos] & mask;从映射参数的这里中可以看出,第一个参数使这个函数成为映射的方法(int16、=>、uint256)。需要注意的一点是:当调用此函数时,没有任何东西作为agrument传递。我不明白我是如何理解这一点的。
还有一件事我不明白,那就是蒙面值是如何计算的。也帮我做这个。
发布于 2023-04-16 22:15:29
此函数用作mapping(int16 => uint256)类型的运算符。
基本上,您可以使用Using A for B语法将函数附加到类型。这些函数的第一个参数是特殊的,看一些例子更容易理解。
因此,在您的示例中,代码将有一个库,其中包含一些函数,这些函数都在mapping(int16 => uint256)上执行某些操作。这是B类型,将显示为函数中的第一个参数:
library LibraryName {
function nextInitializedTickWithinOneWord(
mapping(int16 => uint256) storage self,
int24 tick,
int24 tickSpacing,
bool lte
) internal view returns (int24 next, bool initialized) {
...
}
}主契约具有这种类型的变量ticks。导入库并使用语法Using A for B,我们可以执行以下所有功能:
using LibraryName for mapping(int16 => uint256);
mapping(int16 => uint256) public ticks;
ticks.nextInitializedTickWithinOneWord(
_tick,
_tickSpacing,
_lte
);相当于这样做:
LibraryName.nextInitializedTickWithinOneWord(
ticks,
_tick,
_tickSpacing,
_lte
);查看医生来了中的其他示例。一个常见的例子是Using SafeERC20 for IERC20,您有一个用token.safeTransfer(to, amount)调用的函数function safeTransfer(IERC20 token, address to, uint256 amount)。所以这个函数的第一个参数是“外部”写的。
希望一切都清楚。我不禁要问第二个问题,也许你是在问<<和&的意思吗?如果是这样的话,1 << bitPos基本上是2**bitPos,而&是按位的。无论如何,我同意最好用一个单独的问题来问它。
https://ethereum.stackexchange.com/questions/149026
复制相似问题