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?
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 memory
Schlü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, memory
weist 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 00
auf beliebige Werte ändern, bevor Sie den Vertrag bereitstellen.
All dies ist jedoch erheblich mehr Arbeit als nurs = ABC({a:1, b:2, c:3});