constant(常量)
說到常量
這一概念,擁有現(xiàn)代編程經(jīng)歷的您,對這一詞再熟悉不過了。
常量
,常量
,顧名思義便是變量值始終不變,這在很多面向?qū)ο蟪绦蛘Z言中都有。
相對 Solidity 來說,它也是支持常量
的。
假若將狀態(tài)變量(State Vriable)
聲明為constant(常量)
,而它的值是在編譯時
有確定的表達式來給它賦值。
我們知道常量
值是在編譯時
確定的,所以區(qū)塊數(shù)據(jù)
(例如 block.timestamp
, address(this).balance
或者 block.number
)或執(zhí)行數(shù)據(jù)( msg.value
或 gasleft()
)或?qū)ν獠亢霞s的調(diào)用來給它們賦值都是不允許的。
允許可能對內(nèi)存分配產(chǎn)生副作用(side-effect)的表達式,但那些可能對其他內(nèi)存對象產(chǎn)生副作用的表達式則不允許。
內(nèi)建(built-in)函數(shù) keccak256
, sha256
, ripemd160
, ecrecover
, addmod
和 mulmod
是允許的(即使他們確實會調(diào)用外部合約, keccak256
除外)。
允許內(nèi)存分配器的副作用的原因是它可以構(gòu)造復(fù)雜的對象,例如: 查找表(lookup-table)。 此功能尚不完全可用。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract ConstantExample {
address public constant MY_ADDRESS = 0x777788889999AaAAbBbbCcccddDdeeeEfFFfCcCc;
uint public constant MY_UINT = 123;
}
immutable(不可變量)
將狀態(tài)變量
聲明為immutable(不可變量)
較constant
聲明的狀態(tài)變量
限制少。
可以在合約的構(gòu)造函數(shù)中或聲明時為不可變的變量分配任意值。 不可變量只能賦值一次,并且在賦值之后才可以讀取。
編譯器生成的合約創(chuàng)建代碼將在返回合約之前修改合約的運行時代碼,方法是將對不可變量的所有引用替換為分配給它們的值。 如果要將編譯器生成的運行時代碼與實際存儲在區(qū)塊鏈中的代碼進行比較,則這一點很重要。
不可變量可以在聲明時賦值,不過只有在合約的構(gòu)造函數(shù)執(zhí)行時才被視為視為初始化。 這意味著,你不能用一個依賴于不可變量的值在行內(nèi)初始化另一個不可變量。 不過,你可以在合約的構(gòu)造函數(shù)中這樣做。
這是為了防止對狀態(tài)變量初始化和構(gòu)造函數(shù)順序的不同解釋,特別是繼承時,出現(xiàn)問題。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract ImmutableExample {
address public immutable MY_ADDRESS;
uint public immutable MY_UINT;
constructor(uint _myUint) {
MY_ADDRESS = msg.sender;
MY_UINT = _myUint;
}
}
文章來源:http://www.zghlxwxcb.cn/news/detail-787536.html
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;
contract ConstantImmutableExample {
string constant TEXT = "abc";
bytes32 constant MY_HASH = keccak256("abc");
uint immutable decimals;
uint immutable maxBalance;
address immutable owner = msg.sender;
constructor(uint decimals_, address ref) {
decimals = decimals_;
maxBalance = ref.balance;
}
function isBalanceTooHigh(address _other) public view returns (bool) {
return _other.balance > maxBalance;
}
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-787536.html
到了這里,關(guān)于玩以太坊鏈上項目的必備技能(Constant 和 Immutable 狀態(tài)變量-Solidity之旅十六)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!