Tự học Solidity bài 23: Xử lý hàm có nhiều giá trị trả về Multiple Return Values trong ngôn ngữ lập trình Solidity.
Multiple Return Values
Xử lý hàm có nhiều giá trị trả về Multiple Return Values trong ngôn ngữ lập trình Solidity.
Summary for English Visiter
function multipleReturns() internal returns(uint a, uint b, uint c) { return (1, 2, 3); } function processMultipleReturns() external { uint a; uint b; uint c; // get all A,B,C (a, b, c) = multipleReturns(); } function getLastReturnValue() external { uint c; (,,c) = multipleReturns(); //only C }
Thank you!
Khác với các ngôn ngữ lập trình mà ta đã quen thuộc, ngôn ngữ solidity hỗ trợ nhiều giá trị trả về trong một hàm. Vậy làm cách nào để chúng ta có thể lấy được các giá trị trả về mong muốn trong một tập các dữ liệu được returns? Để trả lời cho câu hỏi này chúng ta hãy tìm hiểu bài học thứ 23 này nhé.
Xử lý nhiều giá trị trả về
Hàm getKitty này là ví dụ đầu tiên mà chúng tôi thấy rằng trả về nhiều giá trị. Hãy xem cách mà chúng ta lấy dữ liệu trả về của hàm:
function multipleReturns() internal returns(uint a, uint b, uint c) {
return (1, 2, 3);
}
function processMultipleReturns() external {
uint a;
uint b;
uint c;
// Neu ban muon lay tat ca gia tri tra ve:
(a, b, c) = multipleReturns();
}
// Hoac chi muon lay 1 vai gia tri tra ve
function getLastReturnValue() external {
uint c;
// Chung ta chi can de trong cac gia tri return khong muon lay
(,,c) = multipleReturns();
}
1. Nếu muốn lấy tất cả giá trị trả về thì khi báo đầy đủ và cho chúng. vào trong dấu ngoặc () và ngắn cách bởi dấu phẩy.
2. Nếu muốn lấy 1 vài giá trị trả về thì bỏ trống những chỗ mà ta không muốn lấy giá trị trả về.
Thực hành luôn cho nhớ lâu bạn nhé
Hãy nhớ lại 2 bài học trước ta đã nghiên cứu về Interface và cách thức gọi hàm từ một hợp đồng khác trên blockchain. Trong ví dụ dưới đây sẽ có áp dụng kiến thức đó và lấy giá trị cuối cùng của hàm getKitty trả về. Hàm này trả về tận 10 giá trị, và ta chỉ lấy gia trị trả về cuối cùng. Đọc hiểu đoạn code này và thực hành nhé.
pragma solidity >=0.5.0 <0.6.0;
import "./zombiefactory.sol";
contract KittyInterface {
function getKitty(uint256 _id) external view returns (
bool isGestating,
bool isReady,
uint256 cooldownIndex,
uint256 nextActionAt,
uint256 siringWithId,
uint256 birthTime,
uint256 matronId,
uint256 sireId,
uint256 generation,
uint256 genes
);
}
contract ZombieFeeding is ZombieFactory {
address ckAddress = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
KittyInterface kittyContract = KittyInterface(ckAddress);
function feedAndMultiply(uint _zombieId, uint _targetDna) public {
require(msg.sender == zombieToOwner[_zombieId]);
Zombie storage myZombie = zombies[_zombieId];
_targetDna = _targetDna % dnaModulus;
uint newDna = (myZombie.dna + _targetDna) / 2;
_createZombie("NoName", newDna);
}
function feedOnKitty(uint _zombieId, uint _kittyId) public {
uint kittyDna;
(,,,,,,,,,kittyDna) = kittyContract.getKitty(_kittyId);
feedAndMultiply(_zombieId, kittyDna);
}
}
Nếu bạn chưa biết cách TẠO FILE, COMPILER và DEPLOY thì hãy xem lại trong bài giới thiệu nhé. Có hướng dẫn chi tiết ở đó.
BÀI TIẾP THEO: BÀI SỐ 24
HỌC TỪ ĐẦU: BÀI SỐ 1