🦊6 关键字

[TOC]

关键字

new

new 关键字可用于初始化数组、创建合约。

  • new 关键字初始化数组 uint[] public myArray = new uint[](5);;

  • 在知道待创建合约的完整代码情况下可以使用 new 关键字可以创建一个新合约。

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

contract A {
    uint public num;
    constructor (uint n){
        num = n;
    }

    function getOwner() public view returns(address){
        return msg.sender;
    }
}

contract B {
    address public addr;
    A a = new A(10);
    constructor(){
        addr = a.getOwner();
    }
}

delete

delete 关键字是重置变量的值。

  • 对于变量 uint a = 10; delete a; 的结果是将 a 变量的类型初始值赋值给 a,delete a; 以后 a 的值为0。

  • delete 用于动态数组,会将动态数组数组长度重置为0。

  • delete 用于静态数组,会将数组中的所有元素重置为初始值。

  • delete arr[1]; 仅重置数组索引位置的元素,动态长度的数组重置一个索引的元素也不会改变长度。

  • delete 用于结构体,会将结构体中的所有成员重置。

  • delete 用于 delete 映射; 无效(因为映射的键可以是任意的,通常也是未知的),用于映射的单个的键及其映射的值是有效的。

  • delete 的效果就像是给变量赋值,相当于在变量中存储了一个新的对象,但是如果变量是引用 delete 是不会更改被引用的值的,它只会修改变量本身。

修饰符

关键字
使用对象
作用

public

函数和状态变量

公开,外部、当前合约和派生合约都可见。

internal

函数和状态变量

内部、派生可见。

private

函数和状态变量

私有,仅在当前合约中可见。

external

函数

仅在外部可见(只能被消息调用,如通过this.func())

pure

函数

不允许修改或访问状态。

view

函数

不允许修改状态。

payable

函数

允许在调用的同时接收以太币。

constant

状态变量

初始化时赋值后不得更改,不占用存储槽。

immutable

状态变量

只允许一次赋值后不得更改,存储在代码中。

anonymous

事件

不将事件签名存储为主题。

indexed

事件

将参数存储为主题。

virtual

函数和修改器

允许在派生合约中重写函数或修改器。

override

函数和修改器

重写了父合约中的函数或修改器。

storage

函数形参和变量

修饰函数形参是 storage 存储位置

memory

函数形参和变量

修饰函数形参是 memory 存储位置

calldata

函数形参和变量

修饰函数形参是 calldata 存储位置

合约相关

this 当前合约,可以显示转换为地址类型 address。

  • selfdestruct(address payable recipient) 销毁合约,并把余额发送到指定 地址类型 Address。

  • selfdestruct 具有从EVM继承的一些特性:接收合约的 receive 函数 不会执行。 > - 合约仅在交易结束时才真正被销毁,并且 revert 可能会“撤消”销毁。

  • 当前合约内的所有函数都可以被直接调用,包括当前函数。

  • 在 0.5.0 之前, 还有一个 suicide ,它和 selfdestruct 语义是一样的。

Last updated