Weisen Sie einem Mitglied in einer Struktur einen Wert zu

Ich habe folgendes:

pragma solidity ^0.4.0;  
contract MyContract {

struct FooFighter {  
    bool foo;  
    uint fighters;  
}  
mapping(bytes32 => FooFighter) public fooFighters;  

Wenn ich möchte, dass der Anfangswert von uint fighters eine vordefinierte Zahl anstelle von 0 für alle fooFighters ist. wie würde ich das machen?

Antworten (1)

Es gibt keine Möglichkeit, einen Standardwert für eine Zustandsvariable zu haben, insbesondere für eine Zuordnung, da die EVM vor der Zuweisung nicht wissen kann, wo sie gespeichert wird. Die zweitbeste Methode zum Einrichten von Speicherwerten ist der Konstruktor.

Es gibt also keine Möglichkeit, Standardstrukturwerte in Solidity zuzuweisen. Bei der Analyse kompilierter Ablaufverfolgungen des folgenden Vertrags stelle ich jedoch fest, dass mit dem memorySchlüsselwort deklarierte Strukturvariablen ihre Mitglieder explizit auf Nullwerte initialisiert haben, bevor die tatsächlichen Werte zugewiesen werden. Dies ist bei direkt zugewiesenen struct state-Variablen nicht der Fall.

contract abc
{
    struct ABC {
        uint a;
        uint b;
        uint c;
    }

    ABC s;

    // Bytecode assigns value directly to storage slots
    function s_pass() {
        s = ABC({a:1, b:2, c:3});
    }

    // Bytcode initialised `ABC memory m` into `memory` with `0` values before assigning        
    function s_frm_m_pass() {
        ABC memory m = ABC({a:1, b:2, c:3});
        s = m;
    }
}

Bytecode für die Strukturinitialisierung vonABC memory m

JUMPDEST
PUSH1 60
PUSH1 40
MLOAD
SWAP1
DUP2
ADD
PUSH1 40
MSTORE   // setup memory index for ABC.a
DUP1
PUSH1 00 // initialise ABC.a 
DUP2
MSTORE   // memory store ABC.a 
PUSH1 20 // offset to  ABC.b
ADD
PUSH1 00 // initialise ABC.b
DUP2
MSTORE   // memory store ABC.b 
PUSH1 20 // offset to  ABC.c
ADD
PUSH1 00 // initialise ABC.c
DUP2
MSTORE   // memory store ABC.c 
POP
SWAP1
JUMP     // return to function

Die Tatsache, dass der Compiler dies für Strukturen in tut, memoryweist darauf hin, dass es ein Argument dafür geben könnte, dass Standardwerte durch die Zuweisung einer speicherinitialisierten, aber nicht zugewiesenen Struktur übergeben werden. Sie könnten dann die Standardwerte auf folgende Weise an den Speicher übergeben ...

    // proposed default value syntax for structs
    struct ABC {
        uint a = 1;
        uint b = 2;
        uint c = 3;
    }

    // Assigning default struct values to storage
    function s_frm_default() {
        ABC memory m;
        s = m;
    }

Wenn Sie nach einer Bytecode-Operation nach der Kompilierung bereit sind, können Sie natürlich die PUSH1 00auf beliebige Werte ändern, bevor Sie den Vertrag bereitstellen.

All dies ist jedoch erheblich mehr Arbeit als nurs = ABC({a:1, b:2, c:3});