概述
Solidity中的变量类型
数值类型 Value Type
此类变量赋值时直接传递数值:布尔型、整数型……
引用类型 Reference Type
此类变量占空间大,赋值时直接传递地址(类似指针):数组、结构体
映射类型 Mapping Type
solidity中的哈希表
函数类型 Function Type
solidity文档中将函数类型归为数值类型(课程作者认为其差别较大故单独分类)
Function Type
函数形式
// solidity中的函数形式
function <funtion name>(<parameter types>) {internal|external|public|private} [pure|view|payable] [returns(<return types>)]
// 方括号内是可写可不写的关键字
- function:声明函数时的固定用法,写函数就要以function开头
- <function name>:函数名
- (<parameter types>) :圆括号里为函数的参数,即要输入到函数的变量类型和名字
- {internal | external | public | private} :函数可见性说明符,共4种
——没标明函数类型的默认internal
——public:内部外部均可见(也可用于修饰变量,public变量会自动生成getter函数,用于查询数值)
——private:只能从合约内部访问,继承的合约也不能用(也可用于修饰状态变量)
——external:只能从合约外部访问(但可用”this.f() “调用,”f“是函数名)
——internal:只能从合约内部访问,继承的合约可以用(也可用于修饰状态变量)
5. [pure | view | payable] :决定函数权限/功能的关键字
——payable:可支付的,运行时可以给合约转入ETH
——pure与view见下方
6. [returns ()] :函数返回的变量类型和名称
pure与view
- 别的语言没有类似的pure与view的关键字,课程作者认为solidity加入它们是因为gas fee
——合约的状态变量存储在链上,gas fee很贵,如果不改变链上状态,就不用付gas
——包含pure与view关键字的函数是不改写链上状态的,因此用户调它们不用付gas
——合约中非pure/view函数调用它们则会改写链上状态,需要付gas
2. 以太坊中,以下语句被视为修改链上状态:
- 写入状态变量
- 施放事件
- 创建其他合同
- 使用selfdestruct
- 通过调用发送以太币
- 调用任何未标记pure/view的函数
- 使用低级调用(low-level calls)
- 使用包含某些操作码的内联汇编
3. 教程作者用马里奥做了一个很有趣的比喻:
——碧池公主:看作存储在链上的合约中的状态变量 (state variables in solidity contract)
——小怪:看不到也摸不到公主,包含pure关键字的函数,不能读取也不能写入存储在链上的状态变量(pure:cannot read or write)
——马里奥:只能看到公主但得不到,view可以理解为“看客”,包含view关键字的函数,能读取但不能写入状态变量(view:can read but not write)
——boss:可以拥有公主,不写pure也不写view,即函数既可以读取也可以写入状态变量(can read and write)
pure与view的代码
- 在合约里定义一个状态变量 number = 5
// SPDX-License-Identifier:MIT
pragma solidity ^0.8.4;
contract FunctionTypes{
uint256 public number = 5;
}
2. 定义一个 add () 函数,每次调用,每次给 number + 1
function add() external{
number = number + 1;
}
3. 如果 add () 包含了pure关键字,如:function add () pure external,就会报错,因为pure不读取合约的状态变量更不改写
4. 那pure可以做什么呢?可以给函数传递一个参数_number,然后让它返回_number1
// pure
function addPure(uint256 _number)external pure returns(uint256 new_number){
new_number = _number + 1;
}
Example: WTF-Solidity/3-3.png at main · AmazingAng/WTF-Solidity · GitHub
5. 如果add()包含view,如:function add () view external,也会报错,因为view能读取但不能改写状态变量
6. 可以稍微改写一下方程,让它不改写number,而是返回一个新的变量
// view
function addView() external view return(uint256 new_number){
new_number = number + 1;
}
Example: WTF-Solidity/3-4.png at main · AmazingAng/WTF-Solidity · GitHub
internal vs. external代码
// internal:内部
function minus() internal {
number = number - 1;
}
// 定义一个internal的minus()函数,每次调用时number变量减1
// 合约内的函数可以调用内部函数
function minusCall() external {
minus();
}
// 由于internal只能由合约内部调用,而外部不能
// 因此必须在定义一个external的minusCall()函数,可以间接调用内部的minus()
Example: WTF-Solidity/3-1.png at main · AmazingAng/WTF-Solidity · GitHub
payable代码
// payable:递钱,能给合约支付eth的函数
function minusPayable() external payable returns(uint256 balance){
minus();
balance = address(this).balance;
}
// 定义一个 external payable 的 minusPayable() 函数,间接调用minus()
// 且返回合约里的ETH余额(this关键字让我们引用合约地址)
// 可以在调用 minusPayable() 时,往合约里转入1个ETH
Example: WTF-Solidity/3-2.png at main · AmazingAng/WTF-Solidity · GitHub
最后
以上就是勤恳歌曲为你收集整理的[solidity入门】3. 函数类型 Function Type的全部内容,希望文章能够帮你解决[solidity入门】3. 函数类型 Function Type所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复