Blockchain 数据位置必须为";“记忆”;用于函数中的返回参数,但未给出任何值
我在混音中尝试了上面的solidity示例,solidity版本>0.5.0 但我现在得到了这个错误。 解决这个错误的方法是什么Blockchain 数据位置必须为";“记忆”;用于函数中的返回参数,但未给出任何值,blockchain,ethereum,solidity,Blockchain,Ethereum,Solidity,我在混音中尝试了上面的solidity示例,solidity版本>0.5.0 但我现在得到了这个错误。 解决这个错误的方法是什么 contract MyContract { string value; function get() public view returns (string) { return value; } function set(string _value) public { value = _value;
contract MyContract {
string value;
function get() public view returns (string) {
return value;
}
function set(string _value) public {
value = _value;
}
constructor() public {
value = "myValue";
}
}
您应该为string参数添加memory关键字,这是solidity版本0.5.0中引入的 根据文件: 结构、数组或映射类型的所有变量的显式数据位置现在都是必需的。这也适用于函数参数和返回变量。例如,将uint[]x=m_x更改为uint[]storage x=m_x,将函数f(uint[]x)更改为函数f(uint[]memory x),其中内存是数据位置,可能会相应地被存储或调用数据替换。请注意,外部函数需要数据位置为calldata的参数 修正码
contract MyContract {
string value;
function get() public view returns (string memory) {
return value;
}
function set(string memory _value) public {
value = _value;
}
constructor() public {
value = "myValue";
}
}
请参考官方发布的版本0.5.0中所做的更改,Solidity每天都会更新,因此您应该了解所做的更改。为此,请继续参考更新的solidity文档 代码应该是这样的:
contract MyContract {
string value;
function get() public view returns (string memory) {
return value;
}
function set(string memory _value) public {
value = _value;
}
constructor() public {
value = "myValue";
}
}
或
contract MyContract {
string value;
function get() public view returns (string calldata) {
return value;
}
function set(string calldata _value) public {
value = _value;
}
constructor() public {
value = "myValue";
}
}
引用类型的值可以通过多个不同的
名字。将其与值类型进行对比,在值类型中可以获得独立的
每当使用值类型的变量时复制。因此,,
必须比值类型更仔细地处理引用类型。
目前,引用类型包括结构、数组和映射。如果
如果使用引用类型,则始终必须显式提供
存储类型的数据区域:内存(其生存期有限
对于外部函数调用),存储(状态
存储变量,其中生存期限制为
合同)或calldata(包含
函数参数)
警告
在版本0.5.0之前,数据位置可以省略,并根据变量类型、函数类型等默认为不同的位置,但所有复杂类型现在都必须给出明确的数据位置
因此,您必须将内存
或调用数据
放在字符串后面,如下所示:
contract MyContract {
string value;
function get() public view returns (string memory) {
return value;
}
function set(string memory _value) public {
value = _value;
}
constructor() {
value = "myValue";
}
}
需要注意的另一件事是,您不再需要在构造函数中公开:
警告:在版本0.7.0之前,必须指定
构造函数作为内部构造函数或公共构造函数