Gibt eine Struktur aus einem Solidity Contract zurück

Ich versuche nur, eine Bestätigung zu erhalten, ob dies derzeit in Solidity unterstützt wird. Ältere Antworten auf diese Frage scheinen zu implizieren, dass dies hinzugefügt wurde, aber ich kann keine konkrete Literatur zur Bestätigung finden.

Wenn ich eine Struktur im Vertrag habe, kann ich sie über einen Getter im Vertrag zurückgeben? Zum Beispiel:

struct myDetails {
    string firstName;
    string lastName;
}

function getName() returns (???) {
    return myName;
}

Danke

Martin

Antworten (2)

Es ist derzeit nicht möglich, eine Struktur mit einer eigenen Funktion nach außen zurückzugeben . Nichtsdestotrotz ist es mit den automatisch generierten Gettern von Solidity möglich.

Durch Markieren einer Variablen public(zB uint public someNumber) generiert Solidity automatisch einen Getter ( someContract.someNumber()). Dies funktioniert tatsächlich mit Strukturen ( Foo public someFoo) und sogar mit Arrays und Mappings! ( mapping(uint => player) public players) Im letzten Fall geben Sie dem Getter einen Schlüssel, um den gewünschten zu erhalten. ( someContract.players(7))

Eine Einschränkung: Verschachtelte Strukturen, Arrays und Zuordnungen innerhalb von Strukturen werden derzeit nicht von Gettern zurückgegeben. Saiten sind es jedoch.

In scheint der mapping(uint => player) public playersWerttyp playerein benutzerdefinierter, dh nicht primitiver Typ zu sein. Ich nehme also an, es wäre eine Struktur oder ein Mapping. Wenn also someContract.players(7)a zurückgegeben playerwird, bedeutet das, dass Strukturen innerhalb von Zuordnungen zurückgegeben werden können, obwohl Zuordnungen innerhalb von Strukturen dies nicht können (was Sie später in der Einschränkung erwähnen)?
Strukturen können mit dieser Methode durch Zuordnungen abgerufen werden, ja.
Jetzt ist es 2018/1, stimmt es immer noch, dass "es nicht möglich ist, eine Struktur mit einer eigenen Funktion nach außen zurückzugeben"? In Remix ausprobiert und scheint die Idee, eine Struktur vollständig zurückzugeben, nicht abzulehnen. Es generiert jedoch einen Kompilierungsfehler, der möglicherweise damit zusammenhängt. Ich habe hier eine Frage gestellt: stackoverflow.com/questions/48160495/…

In den offiziellen Repos gibt es keinen Hinweis darauf, eine Rückgabe des Struct-Typs zuzulassen. siehe https://github.com/ethereum/solidity/releases

Ich schlage vor, dass Sie für Ihre getName-Funktion mehrere Rückgaben verwenden.

function getName() returns (string,string) {

 string firstName;
 string lastName;
  return (firstName, lastName);
}