Solidity|Solidity - 变量作用域
2018-10-25笔记代码块 代码块指的就是
{}
所围成的代码,也就是从{
开始,到}
结束,花括号里面的所有的代码,就属于一个代码块,变量的作用域伴随着代码块的结束而结束。变量作用域 变量作用域也就是变量的可见范围,生存期,通俗讲就是可以使用该变量的范围。代码块内的变量作用域从声明开始,到花括号结束。
一条重要的规则,外层代码块的变量,对内层代码块可见,但是内层代码块的变量就对外层不可见。举个例子,你知道你老板是谁(因为你要拿工资),你老板不需要知道你是谁。
例外情况
Variables and other items declared outside of a code block, for example functions, contracts, user-defined types, etc., are visible even before they were declared. This means you can use state variables before they are declared and call functions recursively.这个意思就是,状态变量、函数声明、
struct
定义等(这些虽然也定义在contract
的代码块外,但是他们无拘无束)不用遵守先声明后使用的规则。solidity在执行的时候,会先将所有变量都声明创建完成后,再对他进行初始化(如果有做初始化的话):pragma solidity >0.4.99 <0.6.0;
contract hello {
uint a = b;
function get() view public returns(uint) {
return a;
}uint b = 10;
}
其中我们在声明
b
之前就使用b
给a
进行赋值。调用get
方法可以得到:文章图片
代码块外.png
解释一下过程:首先先创建
a
,然后创建b
,在创建的时候是使用默认的初始值0
。然后执行a = b
,所以a
的值就变成了0
(从get
返回的结果可以看到),然后执行b = 10
,这就是为什么a
不是10
的原因了。通常情况 代码块内的声明就需要遵守声明顺序了,看下面这个合约,
pragma solidity >0.4.99 <0.6.0;
contract hello {
function get() view public returns(uint) {
uint a = b;
uint b = 10;
return a;
}
}
编译上面的合约,会得到如下的报错,因为
a
在声明b
之前就使用了b
,因为此时编译器还找不到b
。文章图片
编译器报错.png
但是如果存在一个状态变量
b
的话,就不会报错了,看下面的这个合约,结合上面变量作用域中提到的规则,就可以很好的解释如下合约的输出了:pragma solidity >0.4.99 <0.6.0;
contract hello {
uint b = 100;
function get1() public returns(uint) {
b = 10;
uint b;
return b;
}
function get2() public returns(uint) {
return b;
}
}
get1
的返回值:文章图片
get1.png
get2
的返回值文章图片
get2.png 【Solidity|Solidity - 变量作用域】
首先,在
get1
中,先执行的是b=10
,这时候,get1
中的局部变量b
还没有声明,因此是引用的状态变量b
(从get2
的返回值可以看到),然后执行uint b
,默认初始化为0
(这时覆盖了状态变量的b
),因此get1
返回的是0
。推荐阅读
- Shell-Bash变量与运算符
- (二)ES6第一节变量(let|(二)ES6第一节变量(let,const)
- 概率论/统计学|随机变量 的 分布函数 与 概率密度函数 的区别
- Python|Win10下 Python开发环境搭建(PyCharm + Anaconda) && 环境变量配置 && 常用工具安装配置
- linux环境变量相关操作
- 【课程-Perl】Lesson|【课程-Perl】Lesson 2: 值与变量
- 变量声明前置与函数声明前置
- 正则表达式中增加变量
- 1.块级作用域绑定
- 2018-07-30|2018-07-30 Block和Closure 作为类的属性(变量)