코딩시 struct같은 구조체 안에 디폴트값을 줘야할 경우가 있다.
배열이나 주소값 등등 디폴트 값 주기.
contract Initialize {
struct A {
uint a; // 0
address b; // address(0)
address[] c; // new address[](0)
uint[] d; // new uint[](0)
string [] e; // new string[](0)
bytes f; // new bytes(0) -> new bytes(0)가 되는 이유 : array랑 똑같이 취급해주면 된다.
bytes f2; // ""
bytes3 g; // ""
string h; // ""
}
A[] As; // A형 배열 As 선언
function setA() public {
As.push(A(0, address(0), new address[](0), new uint[](0), new string[](0), new bytes(0), "", "","" ));
}
}
struct안에 mapping이 있는 경우는 피하는게 상책
상대적으로 가벼운 struct안에 상대적으로 무거운mapping이 있는 경우 이중적인 경우라 함부로 default값을 주려는 경우 에러가 날수 있다.
또는 비효율적으로 해결해야한다.
struct aa {
uint a;
mapping(uint => string) b; //struct는 가벼운데 mapping은 무거워서 이중적인 모습이라 에러가 여기저기서..
}
aa[] aas;
function setaa() public {
aa storage ABC;
// aas[0] = ABC;
//b ABC = aas[0];
aas.push();
// ABC.a = _a;
aas[0].a = 100;
aas[0].b[0] = "a";
}
uint index;
/*function setaa2(uint _b_uint, string memory _b_string) public {
aas.push();
aas[index++].a = _b_uint; // 오류 야기
aas[index].b[_b_uint] = _b_string;
}*/
function setaa3(uint _b_uint, string memory _b_string) public {
aas.push();
aas[index].a = _b_uint;
aas[index].b[_b_uint] = _b_string;
}
function setaa4(uint _b_uint, string memory _b_string) public {
aas.push();
aas[index].a = _b_uint;
aas[index++].b[_b_uint] = _b_string;
}
function getaalength() public view returns(uint) {
return aas.length;
}
function getaa(uint _a, uint _b) public view returns(uint, string memory) {
return (aas[_a].a, aas[_a].b[_b]);
}
모두 비효율적인 방법.
memory는 휘발성 상대적 가벼움, storage는 덜휘발성 상대적으로 무거움.
aa storage ABC; aa는 memoty에 가깝고 ABC는 storage에 가깝다.