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

Posted

技术标签:

【中文标题】如何在 Solidity 中为函数设置默认参数【英文标题】:How to set default parameters to functions in Solidity 【发布时间】:2019-02-06 08:28:58 【问题描述】:

我在Solidity Documentation 中遇到了下面的示例,并且在我的项目中有类似的代码,如果没有从调用者传递密钥,我想将default value 设置为密钥参数

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 语言是否提供default parameters? 如果默认参数不允许的话,如何实现呢?

感谢帮助?

【问题讨论】:

【参考方案1】:

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

【讨论】:

值得指出的是,Solidity 允许具有相同名称的函数,如果它们具有不同的参数类型。所以他们都可以被称为f(...) 非常正确。我不知道为什么我使用h()...尤其是在提到函数重载之后。 谢谢 Adam 和 Carver,这是非常有效的信息 这太棒了...想了一会儿。【参考方案2】:

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

【讨论】:

但是,通过这个解决方案,我如何同时使用来自 web3 的 f 方法?因为我只能用第一种方法f。 @HenryPalacios 我相信如果使用提供的参数(2 对 3)调用 f() 不起作用,您可能需要获取 HASH ID 名称并以这种方式从 web3 调用函数观点。

以上是关于如何在 Solidity 中为函数设置默认参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby 中为 splat 参数设置默认值

如何在 Clojure 中为函数参数创建默认值

如何在 Selenium Webdriver 3 中为 Firefox 驱动程序设置默认配置文件?

Django:如何在管理视图中为 readonly_field 设置默认随机值?

如何在 django 中为分组选项设置默认值

如何在 django 中为分组选项设置默认值