为什么 Remix IDE 中的循环只能写在函数中?
Why loops in Remix IDE can only be write in a function?
我试图写一个没有函数的循环代码,但是它报错了。
但是写在一个函数里,就可以了。为什么?
您只能在函数中使用 for
循环和其他条件,因为它只是处理数据的方法。
不能在函数(或构造函数)外使用条件!
智能合约,更具体地说,任何用 solidity 编写的东西,只能部署在区块链上,这意味着它们 运行 在以太坊虚拟机 (EVM) 上。每次在 EVM 上使用处理能力时,都必须支付 gas 费用。任何数据处理或循环等操作都必须用 gas 费支付。因此,这些操作必须限制在一个函数内,以便它们可以被调用和支付。
如果你可以 运行 在 function/constructor 之外的循环,它将无法定义 运行 的位置或时间,因此要么永远不会被使用,要么会花费无限的 gas。
添加到@Kerry99 的回答中;
- 这与 Remix IDE 无关,它是关于 Solidity 语言规范、solc 编译器和一点 design-oriented 编程以及一点点与 evm
- 这是solidity语言的设计选择,如果你问的是为什么这样设计,欢迎讨论。在合约作用域本身执行代码(循环、条件和函数调用)可用于初始化变量,我们有一些东西,
constructor
如果问题是为什么它在我将它包装在一个函数块中后开始工作,你的合约块中的悬挂代码(?)在语法上对编译器来说是不正确的
我试图写一个没有函数的循环代码,但是它报错了
但是写在一个函数里,就可以了。为什么?
您只能在函数中使用 for
循环和其他条件,因为它只是处理数据的方法。
不能在函数(或构造函数)外使用条件!
智能合约,更具体地说,任何用 solidity 编写的东西,只能部署在区块链上,这意味着它们 运行 在以太坊虚拟机 (EVM) 上。每次在 EVM 上使用处理能力时,都必须支付 gas 费用。任何数据处理或循环等操作都必须用 gas 费支付。因此,这些操作必须限制在一个函数内,以便它们可以被调用和支付。
如果你可以 运行 在 function/constructor 之外的循环,它将无法定义 运行 的位置或时间,因此要么永远不会被使用,要么会花费无限的 gas。
添加到@Kerry99 的回答中;
- 这与 Remix IDE 无关,它是关于 Solidity 语言规范、solc 编译器和一点 design-oriented 编程以及一点点与 evm
- 这是solidity语言的设计选择,如果你问的是为什么这样设计,欢迎讨论。在合约作用域本身执行代码(循环、条件和函数调用)可用于初始化变量,我们有一些东西,
constructor
如果问题是为什么它在我将它包装在一个函数块中后开始工作,你的合约块中的悬挂代码(?)在语法上对编译器来说是不正确的