我是靠谱客的博主 勤恳歌曲,最近开发中收集的这篇文章主要介绍[solidity入门】3. 函数类型 Function Type,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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>)]
// 方括号内是可写可不写的关键字
  1. function:声明函数时的固定用法,写函数就要以function开头
  2. <function name>:函数名
  3. (<parameter types>) :圆括号里为函数的参数,即要输入到函数的变量类型和名字
  4. {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

  1. 别的语言没有类似的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的代码

  1. 在合约里定义一个状态变量 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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部