你如何在 Solidity 中 return 结构的多个实例?

How do you return multiple instances of a struct in Solidity?

我正在学习结构数据类型,我想知道是否:

我想获取在同一时间return发送给我的所有实例(book1、book2 和 book3)的详细信息。我 运行 代码,只能在 A​​ GIVEN TIME 获得 ONE INSTANCE 的详细信息。因此,我在州级(book1 和 book2)声明的两个实例returned 值WHEN CALLED SEPARATELY。但是,在 本地 声明的 book3 在调用时并没有 return 它的值。我得到的是声明错误 (DeclarationError: Undeclared Identifier).

  1. 如何 return 将所有值组合在一起?
  2. 为什么 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);
    }
}
  1. 如果您要使用数组,您可以使用 return 语句 return ALL book objects。 Solidity 还为 public 变量自动创建 getter 函数。由于您的数组可能是 public,因此会自动为它生成一个 public getter 函数。 getter 函数用于直接访问数组变量而不是检索数组本身。
  2. 存储变量和内存变量之间存在差异。 Solidity 智能合约在执行期间可以使用任意数量的内存,但一旦执行停止,内存将被完全擦除以供下一次执行。另一方面,存储是持久的,智能合约的每次执行都可以访问以前存储在存储区域中的数据。

我只是想补充一下@Peteris 的回答,说也可以 return 结构的多个实例而不创建数组。一个函数可以有多个 return 值,但在这种情况下您仍然使用单个 return

function getBookDetails()
    public
    view
    returns (Book memory, Book memory, Book memory)
{
    return (book1, book2, book3);
}

当然,由于 book3 仅在 setBookDetails 中可见,它只有在您将其提供给函数时才会起作用,例如通过使它成为一个存储变量,将声明移动到函数或通过参数传递它。