Solidity

是否可以將結構屬性設置為 undefined 或 null?

  • January 29, 2020

在 JavaScript 中,我們能夠:

Object {
a: number;
b?: string;
c: number;
d?: string;
}

b 和 d 是可選的,在變數初始化期間可以省略這些。這在堅固性中可能嗎?是否可以做類似的事情:

struct test {
address a;
uint256 b;
bytes32 c;
address d;
}

// Initialisation: 
test newTest = test({
a: address(0),
b: 1,
c: bytes32(0),
d: address(0)
});

所以只有 b 屬性在 newTest 中有一個合理的值。其餘的可以省略。這合法嗎?我認為這不是最佳做法,有什麼更好的選擇?

我的預期目的:我的 dapp 和合約之間有 CQRS-ish 類型的互動,其中合約中的函式將對有效負載採取行動,有效負載可以是不同的類型。該對像作為結構傳遞,其中分配了動作的類型,並將有效負載分配給具有正確數據類型的結構中的屬性之一。

不,但是是的。

要意識到的重要一點是,儲存的佈局是為了容納您定義的結構。不設置意味著它們將根據類型和長度(即 false、0、length=0 等)保留其初始值 0x000…。

實際上,您不需要寫 0,但您將無法實例化部分實例。

這不會編譯:

test newTest = test({
a: address(0)
});

但是,這將起作用:

pragma solidity 0.5.16;

contract NullVals {

   struct Test {
       address a;
       uint256 b;
       bytes32 c;
       address d;
   }

   mapping(bytes32 => Test) public tests;

   function silentSetter(bytes32 key, address a) public {
       Test storage t = tests[key];
       t.a = a;
   }

}

請注意,我在儲存中使用了映射來保存實例,因為struct它只定義了一個類型。當您回憶起僅部分設置的某些內容時,您會看到其他值確實存在,並帶有它們的預設值。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/79435