Solidity語言學習筆記————20、函式修飾符
函式修飾符(Function Modifiers)
修飾符可以用來輕鬆改變函式的行為,比如在執行的函式之前自動檢查條件。他們可繼承合約的屬性,也可被派生的合約重寫。
pragma solidity ^0.4.11;
contract owned {
function owned() public { owner = msg.sender; }
address owner;
// 這個合約僅僅定義了修飾符,但沒有使用它-它在派生的合約裡使用
// 函式體插入到特殊的標識 "_"定義的地方
// 這意味著若它自己呼叫此函式,則函式將被執行
// 否則,將丟擲異常
modifier onlyOwner {
require(msg.sender == owner);
_;
}
}
contract mortal is owned {
// 該合約是從"owned" 繼承的"onlyowner"修飾符,
// 並且應用到"close"函式, 如果他們儲存owner
function close() public onlyOwner {
selfdestruct(owner);
}
}
contract priced {
// 修飾符可以接收引數
modifier costs(uint price) {
if (msg.value >= price) {
_;
}
}
}
contract Register is priced, owned {
mapping (address => bool) registeredAddresses;
uint price;
function Register(uint initialPrice) public { price = initialPrice; }
// It is important to also provide the
// `payable` keyword here, otherwise the function will
// automatically reject all Ether sent to it.
function register() public payable costs(price) {
registeredAddresses[msg.sender] = true;
}
function changePrice(uint _price) public onlyOwner {
price = _price;
}
}
contract Mutex {
bool locked;
modifier noReentrancy() {
require(!locked);
locked = true;
_;
locked = false;
}
/// This function is protected by a mutex, which means that
/// reentrant calls from within `msg.sender.call` cannot call `f` again.
/// The `return 7` statement assigns 7 to the return value but still
/// executes the statement `locked = false` in the modifier.
function f() public noReentrancy returns (uint) {
require(msg.sender.call());
return 7;
}
}
多個修飾符可以被應用到一個函式中(用空格隔開),並順序地進行計算。
警告 |
---|
在Solidity的早期版本中,有修改器的函式,它的return 語句的行為有些不同。 |
在修改器中和函式體內的顯式的return語句,僅僅跳出當前的修改器和函式體。返回的變數會被賦值,但整個執行邏輯會在前一個修改器後面定義的”_”後繼續執行。
修改器的引數可以是任意表示式。在對應的上下文中,所有的函式中引入的符號,在修改器中均可見。但修改器中引入的符號在函式中不可見,因為它們有可能被重寫。
相關文章
- Solidity語言學習筆記————19、函式可見性定義符、修飾符、保留字和語法Solid筆記函式
- Solidity語言學習筆記————28、純函式Solid筆記函式
- Solidity語言學習筆記————26、回退函式Solid筆記函式
- Solidity語言學習筆記————27、檢視函式Solid筆記函式
- Solidity語言學習筆記————18、字串和函式Solid筆記字串函式
- Solidity語言學習筆記————30、函式過載Solid筆記函式
- Solidity語言學習筆記————23、函式呼叫和賦值Solid筆記函式賦值
- Solidity語言學習筆記————1、初識Solidity語言Solid筆記
- Solidity語言學習筆記————38、Solidity彙編Solid筆記
- c語言學習筆記===函式C語言筆記函式
- Solidity語言學習筆記————36、 庫Solid筆記
- Solidity語言學習筆記————37、Using forSolid筆記
- Solidity語言學習筆記————4、常量Solid筆記
- vue學習筆記7-事件修飾符Vue筆記事件
- Solidity語言學習筆記————33、事件(Events)Solid筆記事件
- Solidity語言學習筆記————12、陣列Solid筆記陣列
- Solidity語言學習筆記————34、繼承Solid筆記繼承
- Solidity語言學習筆記————43、安全考量Solid筆記
- Solidity語言學習筆記————42、提示和技巧Solid筆記
- Solidity語言學習筆記————16、對映MappingSolid筆記APP
- Solidity語言學習筆記————32、建立合約Solid筆記
- Solidity語言學習筆記————21、函式的訪問許可權和可見性Solid筆記函式訪問許可權
- Solidity語言學習筆記————11、隱式轉換和顯式轉換Solid筆記
- 【Go】Go語言學習筆記-2-函式Go筆記函式
- Solidity語言學習筆記————41、記憶體佈局Solid筆記記憶體
- Solidity語言學習筆記————39、獨立彙編Solid筆記
- Solidity語言學習筆記————25、作用域和宣告Solid筆記
- Solidity語言學習筆記————10、布林型、整型Solid筆記
- Solidity語言學習筆記————3、Remix的基本使用Solid筆記REM
- Solidity語言學習筆記————15、結構體StructSolid筆記結構體Struct
- Solidity語言學習筆記————14、左值運算子Solid筆記
- Solidity語言學習筆記————9、左值運算子Solid筆記
- Solidity語言學習筆記————17、原始檔對映Solid筆記
- Solidity語言學習筆記————5、全域性變數Solid筆記變數
- Solidity語言學習筆記————2、使用編譯器Solid筆記編譯
- C++函式修飾符總結C++函式
- 探索 Solidity 中的各種修飾符Solid
- Solidity語言學習筆記————35、抽象合約和介面Solid筆記抽象