如何在Solidity中为功能设置默认参数

时间:2018-08-31 10:12:05

标签: solidity

我有一个来自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});
    }
}

我的问题是-

  • Solidity语言是否提供默认参数?
  • 如果不允许默认参数,如何实现相同的目的?

感谢帮助吗?

2 个答案:

答案 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);
    }
}