在 Ethereum Solidity 中,当更改数组长度时,我得到 "Value must be an lvalue"。为什么?
In Ethereum Solidity, when changing an array length, I get "Value must be an lvalue". Why?
在 Solidity 中,您可以使用 array.length++ 增加数组的大小以为新成员腾出空间。但我收到一个错误:
Value must be an lvalue
您可以使用“arrayname.length = ;”调整存储中的动态数组(即在合约级别声明的数组)的大小但是如果你得到“左值”错误,你可能做错了两件事之一。
您可能正在尝试调整 内存 中的数组大小,或者
您可能正在尝试调整 非动态 数组的大小。
int8[] memory somearray; // CASE 1
somearray.length++; // illegal
int8[5] somearray; // CASE 2
somearray.length++; // illegal
重要说明:在 Solidity 中,数组的声明方式与您可能习惯的声明方式相反。如果你有一个 >=2D 数组,其中包含一些动态组件和一些非动态组件,你可能会违反#2 并且不明白为什么。另请注意,数组是以“正常”方式访问的。以下是此 "backward" 声明范例的一些实际应用示例:
int8[][5] somearray; // This is 5 dyn arrays, NOT a dyn array-of-arrays w/len=5
// so...
somearray[4]; // the last dynamic array
somearray[1][12]; // the 13th element of the second dynamic array
// thus...
somearray.length++; // illegal. This array has length 5. Always.
somearray[0].length++;// legal
遇到同样的问题,我不得不使用 storage
关键字,因为我试图修改全局存储阵列。
bytes32[] storage someArray = someGlobalStorageArray;
在 Solidity 中,您可以使用 array.length++ 增加数组的大小以为新成员腾出空间。但我收到一个错误:
Value must be an lvalue
您可以使用“arrayname.length = ;”调整存储中的动态数组(即在合约级别声明的数组)的大小但是如果你得到“左值”错误,你可能做错了两件事之一。 您可能正在尝试调整 内存 中的数组大小,或者 您可能正在尝试调整 非动态 数组的大小。
int8[] memory somearray; // CASE 1
somearray.length++; // illegal
int8[5] somearray; // CASE 2
somearray.length++; // illegal
重要说明:在 Solidity 中,数组的声明方式与您可能习惯的声明方式相反。如果你有一个 >=2D 数组,其中包含一些动态组件和一些非动态组件,你可能会违反#2 并且不明白为什么。另请注意,数组是以“正常”方式访问的。以下是此 "backward" 声明范例的一些实际应用示例:
int8[][5] somearray; // This is 5 dyn arrays, NOT a dyn array-of-arrays w/len=5
// so...
somearray[4]; // the last dynamic array
somearray[1][12]; // the 13th element of the second dynamic array
// thus...
somearray.length++; // illegal. This array has length 5. Always.
somearray[0].length++;// legal
遇到同样的问题,我不得不使用 storage
关键字,因为我试图修改全局存储阵列。
bytes32[] storage someArray = someGlobalStorageArray;