Solidity
是否可以將結構屬性設置為 undefined 或 null?
在 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
它只定義了一個類型。當您回憶起僅部分設置的某些內容時,您會看到其他值確實存在,並帶有它們的預設值。希望能幫助到你。