【问题标题】:How to set default parameters to functions in Solidity如何在 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
  • 如果默认参数不允许的话,如何实现呢?

感谢帮助?

【问题讨论】:

    标签: solidity


    【解决方案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 调用函数观点。
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2015-01-08
    • 2010-10-28
    • 2010-10-22
    • 2014-04-25
    • 2016-06-20
    相关资源
    最近更新 更多