Leere Arrays und Structs in Struct-basierten Speichergraphstrukturen initialisieren?

Wie initialisiere ich leere Arrays und Strukturen in verschachtelten Strukturdatenstrukturen?

contract NewBook {

        struct ReviewerData {
            string name,
            uint industryXP
            // foobar...
        }

        struct ChapterData {
            // string chapterID;
            string title;
            string color;
            uint pages;
            //How do I initialise the two elements below with empty values?
            ReviewerData[] reviewer;
            address[] reviewers;
        }

        struct BookData {
            // string bookID;
            ChapterData[] chapters;
        }

        mapping(bytes32 => BookData) books; // bookId => BookData

        function addChapter(bytes32 _bookID, string memory title, string color, uint pages) public {
            ChapterData memory c = ChapterData({
                title: title,
                color: color,
                pages: pages,
                //how to initialise empty reviewer struct?
                //how to initialise empty reviewers array?
            });
            books[_bookID].chapters.push(c);
        }

Antworten (1)

Aus der Solidity-Dokumentation zu dynamischen Arrays :

Arrays haben ein Längenelement, das ihre Anzahl von Elementen enthält. Die Länge von Speicherarrays ist fest (aber dynamisch, dh sie kann von Laufzeitparametern abhängen), sobald sie erstellt wurden. Bei Arrays mit dynamischer Größe (nur für Speicher verfügbar) kann dieses Mitglied zugewiesen werden, um die Größe des Arrays zu ändern.

und auf das Fehlen von Nullwerten :

Das Konzept von „undefinierten“ oder „Null“-Werten existiert in Solidity nicht, aber neu deklarierte Variablen haben immer einen Standardwert, der von ihrem Typ abhängt. Um mit unerwarteten Werten umzugehen, sollten Sie die Funktion „revert“ verwenden, um die gesamte Transaktion rückgängig zu machen, oder ein Tupel mit einem zweiten booleschen Wert zurückgeben, der den Erfolg angibt.

In Ihrem Beispiel können Sie, anstatt die neue Struktur im Speicher zu erstellen und pushsie dann mit an das Speicherarray anzuhängen, die Länge erhöhen, wodurch eine neue, leere Struktur books[_bookID].chaptersinitialisiert wird . ChapterDataBearbeiten Sie dann diese neue Speicherstruktur an Ort und Stelle.

    function addChapter(bytes32 _bookID, string memory title, string color, uint pages) public {
        uint _length = books[_bookID].chapters.length;
        books[_bookID].chapters.length++;

        ChapterData storage c = books[_bookID].chapters[_length];
        c.title = title;
        c.color = color;
        c.pages = pages;

    }
Ich verstehe, dass diese Typen mit einem 0-Wert initialisiert werden, aber Sie können Elemente einer Struktur nicht einfach ignorieren, sie müssen strikt deklariert und mit einem Wert initialisiert werden, wenn Sie versuchen, eine Struktur zu einer anderen Struktur hinzuzufügen.
sorry, ich habe die Frage etwas missverstanden. Ich habe meine Antwort bearbeitet, ich hoffe, es ist hilfreicher.