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

20
我在Solidity文档中看到以下示例,我的项目中有类似的代码,并想要在调用者没有传递键参数时将默认值设置为键参数。
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个回答

25

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

6
值得一提的是,Solidity允许使用相同名称的函数,只要它们具有不同的参数类型即可。因此,它们都可以被称为f(...) - carver
非常正确。我不知道为什么要使用h()……尤其是在提到函数重载之后。 - Adam Kipnis
谢谢Adam和Carver,这是非常有价值的信息。 - MBB
这太棒了...我已经想了一段时间了。 - Maxareo

4
Openzeppelin很好地展示了如何制作“默认”参数。请查看他们的SafeMath Library.(链接) SafeMath库中有两个相同可见性和可变性的子(减法)合约,但有一个关键区别:
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:subtraction overflow

如果提供了第三个参数,它将替换该错误说明。

本质上:

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

但是,使用这种解决方案,我如何同时使用web3的两种f方法?因为我只能使用第一个方法f。 - Henry Palacios
1
@HenryPalacios 我认为如果使用提供的参数(2 vs 3)调用 f() 函数无法正常工作,你可能需要获取哈希 ID 名称,并从 web3 的角度调用该函数。 - rabbitt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接