Solidity - 函数修饰符

2025年5月27日 | 7分钟阅读

函数修饰符可用于修改函数的行为。在执行函数之前,可以使用函数修饰符自动检查条件。 这些可用于各种目的。 函数修饰符可以在执行函数代码之前和之后使用。

  • 修改可以应用于在执行特定函数之前需要自动检查条件的情况。
  • 如果不满足指定的条件,则不会运行该函数。

语法

创建函数修饰符的过程包括声明它们,然后在必要的函数中调用它们。

函数修饰符有两种类型

1. 带参数的函数修饰符

2. 不带参数的函数修饰符

如果修饰符没有参数,则不需要括号 ()。

合并通配符

函数定义在执行期间会替换 "_;" 符号,也称为合并通配符。

  • 换句话说,在此通配符被调用后,控制权将转移到包含相关函数定义的位置。
  • 每个修改都需要该符号。
  • 此通配符可能出现在修饰符中的任何位置。
  • 当通配符添加到修饰符的末尾时,将检查条件,如果满足条件,则调用相关函数。
  • 当将其插入开头时,将在相关函数之后执行条件验证。

基于参数的修饰符

修饰符接受一个参数,该参数括在修饰符名称后的括号 () 中。

语法

下面的 Solidity 程序演示了带参数的函数修饰符

输出

Solidity - Function Modifiers

理由

1. 创建修饰符

该代码生成 isPass 修饰符,该修饰符接受用户的百分比作为参数。 只有当百分比大于或等于 30 时,该函数才能使用此修饰符运行。 如果学生低于 30%,则会出现通知“必须确保至少 30% 才能通过”。

2. 调用修饰符

要调用修饰符,请提供百分比值。 在此示例中,百分比被硬编码为 35,如下所示。 因此,信息将被记录。

无参数修饰符

一个修饰符可以没有参数。 如果修饰符没有参数,则不需要括号 ()。

在这种情况下,修饰符名称是 mod_name,关键字是 functionmodifier。

显示没有参数的修饰符的 solidity 程序如下所示

输出

Solidity - Function Modifiers

理由

1. 初始化地址

上面的代码使用构造函数来初始化领导者的地址。 合同创建者的地址将保存在 Solidity 代码的 msg.sender 中。 因此,领导者被分配给该变量中包含的地址。

2. 修饰符创建

以下代码创建 isLeader 修饰符。 此修改检查用户输入的地址是否与 leader 变量中的地址匹配。

3. 函数定义

只要需要在定义之后应用上述约束,修饰符就会合并到函数中。 在此示例中,函数 inputValues 包含修饰符 isLeader,仅当从 leader 地址进行输入时,才允许用户输入学生详细信息。

多个修饰符一起运行

一个函数可以有多个修饰符,并且为了使函数正常工作,需要满足每个要求。 引入了两个修饰符 isLeader 和 isPass,以检查是否只有至少 30% 的领导者正在编辑。 只有具有领导权限且至少 30% 的用户才能使用 inputValues 函数。

语法

下面显示了使用多个修饰符工作的 solidity 程序

输出

Solidity - Function Modifiers

说明

一个函数可以有多个修饰符。 调用修饰符的方式如下所示,将多个修饰符应用于一个函数。

因此,只有当用户是领导者并且至少有 30% 时,他们才能提交条目

覆盖修饰符

与函数可以被覆盖类似,修饰符也可以被覆盖。

如演示所示,override 关键字允许在子类中覆盖来自父类的修改。 下面显示了用于方法覆盖的 solidity 程序

我们必须在修饰符覆盖中部署继承的合同才能部署该合同。 在这种情况下,我们必须选择并实现 moddest 合同。

修饰符利用枚举

可以使用修饰符检查枚举变量的值(当它在全局范围内定义时)。

下面显示了实现枚举的 solidity 程序

输出

Solidity - Function Modifiers

Solidity 修饰符的优点

  • 代码可重用性: 使用修饰符,您可以指定一组适用于多个不同函数的检查或条件。 修饰符允许您避免编写重复代码,从而提高合同的模块化和可维护性。
  • 可读性和清晰性: 修饰符可以通过概述函数运行必须满足的要求,使您的代码更易于阅读。 这有助于其他开发人员理解合同的预期行为。
  • 安全性和验证: 修饰符有助于在执行函数之前验证输入或实施安全措施。
  • 例如,您可以设计一个修饰符来验证事务的发送者是否已获得授权,或者是否满足特定要求,然后再启用函数的运行。
  • Gas 效率: 您可以通过使用修饰符来减少智能合约使用的 gas。 在每个函数中复制测试会导致多余的 gas 成本,可以通过使用修饰符将常见检查或前提条件应用于多个函数来避免这种情况。

下一个主题Solidity-函数