首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种修饰语情况下,下划线是什么意思?

在这种修饰语情况下,下划线是什么意思?
EN

Ethereum用户
提问于 2022-12-07 00:55:16
回答 1查看 51关注 0票数 0

我遇到了修饰符中的下划线这个令人困惑的小情况,所以我想在这里发布它,以检查我的理解是否正确。

代码语言:javascript
复制
contract whatever{
    bool public locked;
    uint public x = 10;

    modifier noReentrancy() {
        require(!locked, "No reentrancy");

        locked = true;
        _;
        locked = false;
    }

    function decrement(uint i) public noReentrancy {
        x -= i;

        if (i > 1) {
            decrement(i - 1);
        }
    }
}

修饰符函数中间的下划线对我来说是个小窍门。因此,我的理解是:当第一次运行修饰符时,锁定的值为真。然后下划线意味着运行函数代码,即x-= i.这将触发if条件,如果我>i,则在执行时( noReentry修饰符的点)将再次调用相同的函数,那么锁的值将为false,这将触发函数递减()以停止。那么,除非i的值是1或0(如果没有触发条件),那么在这种情况下,x的值总是10吗?

感谢您的耐心!

EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-12-07 01:31:42

下划线表示函数代码的其余部分。在下划线之前的任何内容都在函数代码之前运行,后面运行的都是函数代码。

(顺便说一句,在函数使用多个修饰符的情况下,它们按照代码中声明的顺序运行(而不是在函数声明中),例如:

代码语言:javascript
复制
modifier isA{
//...
}
modifier isB{
//...
}
function modified() isB isA external {
// isA is ran before isB
}

绕道,回到答案。)

所以你对修饰语的理解是正确的。然而,您对代码的理解却不是这样。在这里,假设调用i > 1时,修饰符的开头将被运行,因此locked将被设置为true,然后x将减少,则if()条件将计算为true (i大于1),这将再次调用该函数,再次运行修饰符代码,而require语句require(!locked)将计算为false,因为将locked设置为false的其余修饰符尚未运行,调用将恢复。

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/140731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档