`

函数修饰符(modifier)

 
阅读更多
函数修饰符用于修改函数的行为。例如,向函数添加条件限制。
contract Owner {

   // 定义修饰符 onlyOwner 不带参数
   modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }

   // 定义修饰符 costs 带参数
   modifier costs(uint price) {
      if (msg.value >= price) {
         _;
      }
   }
}


修饰符定义中出现特殊符号_的地方,用于插入函数体。如果在调用此函数时,满足了修饰符的条件,则执行该函数,否则将抛出异常

pragma solidity ^0.5.0;

contract Owner {
   address owner;

   constructor() public {
      owner = msg.sender;
   }

   // 定义修饰符 onlyOwner 不带参数
   modifier onlyOwner {
      require(msg.sender == owner);
      _;
   }

   // 定义修饰符 costs 带参数
   modifier costs(uint price) {
      if (msg.value >= price) {
         _;
      }
   }
}

contract Register is Owner {
   mapping (address => bool) registeredAddresses;
   uint price;

   constructor(uint initialPrice) public { price = initialPrice; }

   // 使用修饰符 costs
   function register() public payable costs(price) {
      registeredAddresses[msg.sender] = true;
   }

   // 使用修饰符 onlyOwner
   function changePrice(uint _price) public onlyOwner {
      price = _price;
   }
}


限制调用者,时间,金额
pragma solidity ^0.5.0;

contract Test {
   address public owner = msg.sender;
   uint public creationTime = now;

   modifier onlyBy(address _account) {
      require(
         msg.sender == _account,
         "Sender not authorized."
      );
      _;
   }
   function changeOwner(address _newOwner) public onlyBy(owner) {
      owner = _newOwner;
   }
   modifier onlyAfter(uint _time) {
      require(
         now >= _time,
         "Function called too early."
      );
      _;
   }
   function disown() public onlyBy(owner) onlyAfter(creationTime + 6 weeks) {
      delete owner;
   }
   modifier costs(uint _amount) {
      require(
         msg.value >= _amount,
         "Not enough Ether provided."
      );
      _;
      if (msg.value > _amount)
         msg.sender.transfer(msg.value - _amount);
   }
   function forceOwnerChange(address _newOwner) public payable costs(200 ether) {
      owner = _newOwner;
      if (uint(owner) & 0 == 1) return;        
   }
}
分享到:
评论

相关推荐

    前端大厂最新面试题-modifier.docx

    Vue 中的修饰符可分为五种:表单修饰符、事件修饰符、鼠标按键修饰符、键值修饰符和 v-bind 修饰符。 表单修饰符 表单修饰符是在我们填写表单的时候用得最多的,指令用得最多的是 v-model。关于表单的修饰符有如下...

    【IT十八掌徐培成】Java基础第25天-02.declaredMethod-method-Modifier.zip

    今天我们将深入探讨"Declared Methods"(声明的方法)、"Method"(方法)以及"Modifier"(修饰符)这三个概念,这些都是Java编程中的基础知识,对于理解和编写高质量的代码至关重要。 首先,我们来理解"Declared ...

    DRemm:双稳健估计器,用于评估二元和连续修饰符的效果度量修饰

    DRemm(Double Robust Estimator for Modifier Effects Metrics)是一种用于评价二元和连续修饰符效果度量的统计方法。这个方法在R语言环境下实现,为研究人员提供了更为精确且稳健的评估手段。 **1. 双稳健估计器...

    php smarty函数扩展

    在本次的文件内容中,我们看到了如何扩展Smarty模板引擎的功能,通过添加自定义的修饰符(modifier)插件。 在Smarty模板引擎中,修饰符是用于修改或者转换变量值的函数。系统自带了一些基本的修饰符,但用户也可以...

    ember-event-helpers:{{on}}修饰符的免费事件模板帮助器

    余烬事件帮助者 与指定的{{on}}元素修饰符一起使用的免费模板帮助程序。安装ember install ember-event-helpers如果您低于Ember 3.10,则还需要安装 : ember install ember-on-modifier兼容性Ember.js v2.18或更高...

    web前端编码规范,代码规范

    类名由三部分组成:`block`(块)、`element`(元素)和`modifier`(修饰符)。命名应全小写,单词间用`-`连接,避免驼峰命名。例如,`.block__elem--mod`。 2. **选择器**:BEM提倡仅使用`class` name作为选择器,...

    获取函数特性实例代码

    函数特性不仅限于基本的参数和返回类型,还包括更高级的概念,如访问修饰符(public、private等)、是否为抽象或虚拟、是否为静态等。在C#中,这些信息可以通过`MethodAttributes`枚举值获取: ```csharp Console....

    printf函数详细解释

    - `[length modifier]`:可选的长度修饰符,用于指定数据类型。 - `conversion specifier`:指定输出的数据类型及格式。 ##### 2.1 类型转换说明符 - **整数类型**: - `d`: 十进制整数,符号(正或负)会被打印...

    PHP正则的Unknown Modifier错误解决方法

    “Unknown Modifier”错误通常发生在使用`preg_replace()`等函数时,由于正则表达式中的修饰符(modifier)出现了问题。修饰符在正则表达式中用来改变搜索的行为,比如不区分大小写的匹配、全局搜索等。正确的修饰符...

    smarty内建函数

    7. `{modifier}`:修饰符是用于处理或格式化数据的简单函数,如`{$var|upper}`将把`$var`的值转换为大写。常见的修饰符有`lower`(小写)、`capitalize`(首字母大写)、`escape`(转义HTML特殊字符)等。 8. `{...

    c++中__declspec的用法.pdf

    它的语法格式为:__declspec ( extended-decl-modifier-seq ),其中 extended-decl-modifier-seq 是一个扩展的声明修饰符序列。 1. align(#):用于精确控制用户自定义数据的对齐方式,# 是对齐值。例如:__declspec...

    smarty中改进truncate使其支持中文的方法

    在使用Smarty时,经常会用到各种内置的修饰符(modifier)来处理数据,例如truncate修饰符用于截取字符串并添加省略符号。然而,默认情况下smarty的truncate修饰符并不支持中文字符,因为它使用了普通的substr函数,...

    c#视频教程1-2

    在C#中,"修饰符"(15-modifier[1].swf)是编程中的重要元素,用于定义类、方法、变量等的访问权限和特性。比如,`public`、`private`、`protected`和`internal`是访问修饰符,它们决定了代码的可访问范围;`static`...

    php smarty truncate UTF8乱码问题解决办法

    其中smarty_modifier_truncate2是修饰符的入口函数,负责接收输入的字符串和截断参数,并调用substr_utf8函数来完成实际的截断操作。 substr_utf8函数的主要功能是遍历字符串中的每个字符,并判断其占用的字节长度...

    Java类与对象

    - **access modifier**: 访问修饰符,如public, private等。 - **return type**: 方法返回值的类型,如果是无返回值,则用`void`表示。 - **methodName**: 方法名称。 - **parameters**: 方法的参数列表。 #### ...

    Java基础入门教程 Java编程技术04 类和对象(2学时)(共31页).pptx

    其中,`<modifier>` 是访问修饰符,如 `public` 或 `private`,用于控制成员的访问权限;`<name>` 是类的名称;`<attribute_declaration>` 定义类的属性;`<constructor_declaration>` 是构造函数的声明;`...

    smarty truncate中文乱码解决

    Smarty提供了`modifier.truncateutf8.php`这个自定义修饰符来专门处理UTF-8编码下的字符串截取,以避免此类问题。 1. **理解UTF-8编码** UTF-8是一种变长的字符编码,一个英文字符通常占用1个字节,而一个中文字符...

    setlocal函数和用法

    - `modifier`:附加的修饰符。 #### 四、返回值 `setlocale` 函数返回一个指向字符串的指针,该字符串表示实际设置的 locale。如果 locale 设置失败,则返回 `NULL` 或 `""`。当 `locale` 参数为 `NULL` 时,该...

    java反射的基本用法介绍

    2. 了解修饰符:`Modifier.toString(c2.getModifiers())`可以获取类的修饰符,如`public`、`final`等。 3. 获取类的字段信息: - `c2.getDeclaredFields()`返回类的所有字段(包括私有、受保护和默认访问修饰符的...

Global site tag (gtag.js) - Google Analytics