我有一个来自Solidity Documeentation的以下示例,并且在我的项目中有类似的代码,并且如果未从调用方传递密钥,则想将默认值设置为key参数。
pragma solidity ^0.4.0;
contract C {
function f(uint key, uint value) public {
// ...
}
function g() public {
// named arguments
f({value: 2, key: 3});
}
}
我的问题是-
感谢帮助吗?
答案 0 :(得分:2)
Solidity不支持默认参数,但它在其路线图上(请参阅https://github.com/ethereum/solidity/issues/232)。要解决此问题,只需使用函数重载:
pragma solidity ^0.4.0;
contract C {
function f(uint key, uint value) public {
// ...
}
function h(uint value) public {
f(123, value);
}
function g() public {
// named arguments
f({value: 2, key: 3});
}
function i() public {
h({value: 2});
}
}
答案 1 :(得分:0)
Openzeppelin 在举例说明如何制作“默认”参数方面做得很好。看看他们的SafeMath Library。
在其中,它们有两个子(减法)合约,它们具有相同的可见性和可变性——但有一个关键区别:
function sub(
uint256 a,
uint256 b
)internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
第一个默认采用两个参数 a & b (将被减去)。如果没有给出第三个参数(错误语句),它将默认为
<块引用>SafeMath:减法溢出
如果给出第三个参数,它将替换该错误语句。
本质上:
pragma solidity >=0.6.0 <0.9.0;
contract C {
function f(unit value) public {
uint defaultVal = 5;
f(defaultVal, value);
function f(uint key, uint value) public {
// ...
}
function g() public {
// named arguments
f(2, 3);
}
}