你如何在 Solidity 中 return 结构的多个实例?
How do you return multiple instances of a struct in Solidity?
我正在学习结构数据类型,我想知道是否:
- 可以同时 return 结构对象的多个实例。
- 在本地(在函数内)声明的实例可以 return 它的值。
我想获取在同一时间return发送给我的所有实例(book1、book2 和 book3)的详细信息。我 运行 代码,只能在 A GIVEN TIME 获得 ONE INSTANCE 的详细信息。因此,我在州级(book1 和 book2)声明的两个实例returned 值WHEN CALLED SEPARATELY。但是,在 本地 声明的 book3 在调用时并没有 return 它的值。我得到的是声明错误 (DeclarationError: Undeclared Identifier).
- 如何 return 将所有值组合在一起?
- 为什么 book3 没有 return 计算其值?结构不能有本地实例吗?
pragma solidity >=0.4.0 <0.9.0;
// Creating a struct contract
contract MyStruct {
// Declaring a struct
struct Book {
string name;
string writer;
uint id;
bool available;
}
// Declaring a structure object, book1 (state variable of type struct; no values)
Book book1;
// Assigning values to fields for another struct instance, book2
Book book2 = Book ("Building Ethereum DApps", "Roberto Infante", 2, false);
// Defining a function to set values for the fields for structures
function setBookDetails() public {
// Assigning values to book 1 (state struct above)
book1 = Book("Introducing Ethereum and Solidity", "Chris Dannen", 1, true);
// Defining a new book instance locally, book3 (local struct)
Book memory book3 = Book ("Solidity Programming Essentials", "Ritesh Modi", 3, true);
}
// Defining function to print book1 details
function getBookDetails() public view returns (string memory, string memory, uint, bool) {
return (book1.name, book1.writer, book1.id, book1.available);
//return (book2.name, book2.writer, book2.id, book2.available);
//return (book3.name, book3.writer, book3.id, book3.available);
}
}
- 如果您要使用数组,您可以使用 return 语句 return ALL book objects。 Solidity 还为 public 变量自动创建 getter 函数。由于您的数组可能是 public,因此会自动为它生成一个 public getter 函数。 getter 函数用于直接访问数组变量而不是检索数组本身。
- 存储变量和内存变量之间存在差异。 Solidity 智能合约在执行期间可以使用任意数量的内存,但一旦执行停止,内存将被完全擦除以供下一次执行。另一方面,存储是持久的,智能合约的每次执行都可以访问以前存储在存储区域中的数据。
我只是想补充一下@Peteris 的回答,说也可以 return 结构的多个实例而不创建数组。一个函数可以有多个 return 值,但在这种情况下您仍然使用单个 return
:
function getBookDetails()
public
view
returns (Book memory, Book memory, Book memory)
{
return (book1, book2, book3);
}
当然,由于 book3
仅在 setBookDetails
中可见,它只有在您将其提供给函数时才会起作用,例如通过使它成为一个存储变量,将声明移动到函数或通过参数传递它。
我正在学习结构数据类型,我想知道是否:
- 可以同时 return 结构对象的多个实例。
- 在本地(在函数内)声明的实例可以 return 它的值。
我想获取在同一时间return发送给我的所有实例(book1、book2 和 book3)的详细信息。我 运行 代码,只能在 A GIVEN TIME 获得 ONE INSTANCE 的详细信息。因此,我在州级(book1 和 book2)声明的两个实例returned 值WHEN CALLED SEPARATELY。但是,在 本地 声明的 book3 在调用时并没有 return 它的值。我得到的是声明错误 (DeclarationError: Undeclared Identifier).
- 如何 return 将所有值组合在一起?
- 为什么 book3 没有 return 计算其值?结构不能有本地实例吗?
pragma solidity >=0.4.0 <0.9.0;
// Creating a struct contract
contract MyStruct {
// Declaring a struct
struct Book {
string name;
string writer;
uint id;
bool available;
}
// Declaring a structure object, book1 (state variable of type struct; no values)
Book book1;
// Assigning values to fields for another struct instance, book2
Book book2 = Book ("Building Ethereum DApps", "Roberto Infante", 2, false);
// Defining a function to set values for the fields for structures
function setBookDetails() public {
// Assigning values to book 1 (state struct above)
book1 = Book("Introducing Ethereum and Solidity", "Chris Dannen", 1, true);
// Defining a new book instance locally, book3 (local struct)
Book memory book3 = Book ("Solidity Programming Essentials", "Ritesh Modi", 3, true);
}
// Defining function to print book1 details
function getBookDetails() public view returns (string memory, string memory, uint, bool) {
return (book1.name, book1.writer, book1.id, book1.available);
//return (book2.name, book2.writer, book2.id, book2.available);
//return (book3.name, book3.writer, book3.id, book3.available);
}
}
- 如果您要使用数组,您可以使用 return 语句 return ALL book objects。 Solidity 还为 public 变量自动创建 getter 函数。由于您的数组可能是 public,因此会自动为它生成一个 public getter 函数。 getter 函数用于直接访问数组变量而不是检索数组本身。
- 存储变量和内存变量之间存在差异。 Solidity 智能合约在执行期间可以使用任意数量的内存,但一旦执行停止,内存将被完全擦除以供下一次执行。另一方面,存储是持久的,智能合约的每次执行都可以访问以前存储在存储区域中的数据。
我只是想补充一下@Peteris 的回答,说也可以 return 结构的多个实例而不创建数组。一个函数可以有多个 return 值,但在这种情况下您仍然使用单个 return
:
function getBookDetails()
public
view
returns (Book memory, Book memory, Book memory)
{
return (book1, book2, book3);
}
当然,由于 book3
仅在 setBookDetails
中可见,它只有在您将其提供给函数时才会起作用,例如通过使它成为一个存储变量,将声明移动到函数或通过参数传递它。