在本文中,我們將討論 Solidity 中可用的兩種不同的函數類型:視圖函數和純函數。 我們還將討論一種稱為構造函數的特殊類型的函數。
本文基於此筆記 區塊鏈開發者課程 並組織如下:
- 視圖和純函數
- 理解構造函數
視圖和純函數
首先,我們將創建一個名為的新文件 EampleViewPure.sol
並創建一個同名的合同。
然後我們將創建任何存儲變量,它將是一個公共無符號整數 myStorageVariable
。
如果我們部署它,我們就會有一個公共變量,其中有一個名為的公共 getter 函數 myStorageVariable
這將返回存儲變量的內容。
我們還知道這個 getter 函數是一個調用,也稱為 閱讀功能。 讀取功能有兩種:
- 查看功能
- 純函數
我們寫一個視圖函數來訪問 myStorageVariable
返回我們的無符號整數:
//SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
contract ExampleViewPure {
uint public myStorageVariable;
function getMyStorageVariable() public view returns(uint) {
return myStorageVariable;
}
}
如果我們部署它,我們會看到 Remix 中的按鈕都是相同的顏色,因為它們都是視圖函數:
現在讓我們編寫一個純函數,名為 getAddition
回來 a+b
:
//SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
contract ExampleViewPure {
uint public myStorageVariable;
function getMyStorageVariable() public view returns(uint) {
return myStorageVariable;
}
function getAddition(uint a, uint b) public pure returns(uint) {
return a+b;
}
}
視圖函數和純函數之間的區別在於視圖函數可以訪問存儲變量,但不能寫入它們。
純函數只能調用非存儲變量或其他純函數的變量。
在這個 example, 我們剛剛 uint a
和 uint b
作為參數,我們沒有使用其他存儲變量、視圖函數或編寫任何內容。 下面你可以看到我們可以將兩個整數相加
在這種情況下,您無需付費給任何人來挖掘交易,這與寫入功能不同。
隨時了解最新動態 AI
我們是一個由機器學習工程師、定量分析師和量子計算愛好者組成的獨立團隊。 訂閱我們的時事通訊,永遠不會錯過我們的文章、最新消息等。
報名
偉大的! 檢查您的收件箱並單擊鏈接。
抱歉,出了一些問題。 請再試一次。
理解構造函數
我們將在本文中介紹的最後一個 Solidity 概念是構造函數。
讓我們創建一個名為的新文件 ExampleConstructor.sol
並創建一個同名的合同。
然後我們將創建一個公共 address
變量稱為 myAddress
。 如果我們部署它,我們知道它將使用默認的 0 地址進行初始化。
現在讓我們創建兩個函數,其中一個稱為 setMyAddress
和另一個 setMyAddressToMsgSender
正如我們之前所做的:
//SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
contract ExampleConstructor {
address public myAddress;
function setMyAddress(address _myAddress) public {
myAddress = _myAddress;
}
function setMyAddressToMsgSender() public {
myAddress = msg.sender;
}
}
現在我們可以將此地址分配給我們選擇的地址或消息發送者。
如果我們想將其分配給我們自己的地址,即部署智能合約的地址,我們可以設置 address public myAddress = msg.sender;
。
然而,如果我們想在部署時直接將其分配到另一個地址,我們實際上必須調用兩個交易。 這意味著我們不能將其設為部署期間分配的變量。
這就是構造函數發揮作用的地方。
什麼是構造函數?
構造函數是在部署智能合約時直接調用的特殊函數。 它只能調用一次,而不能在合約部署後調用。
構造函數也不使用 function
關鍵字,接受任何類型的參數,並且沒有可見性說明符。 為了 example,我們可以將構造函數設置為特定地址,如下所示:
//SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
contract ExampleConstructor {
address public myAddress;
constructor(address _someAddress) {
myAddress = _someAddress;
}
function setMyAddress(address _myAddress) public {
myAddress = _myAddress;
}
function setMyAddressToMsgSender() public {
myAddress = msg.sender;
}
}
如果我們要部署它,我們現在可以提供一個地址參數,它將設置 myAdress
部署後
摘要:視圖函數、純函數和構造函數
回顧一下,有兩種類型的讀取函數:視圖函數和純函數。
視圖函數和純函數之間的區別在於視圖函數可以訪問存儲變量,但不能寫入它們。
純函數只能調用非存儲變量或其他純函數的變量。
另一種特殊類型的函數是構造函數,它在部署智能合約時直接調用。 它只能調用一次,而不能在合約部署後調用。
在下一篇文章中,我們將把所有這些概念整合在一起並創建一個簡單的區塊鏈消息項目。