🦊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