А сегодня мы поговорим про Function Overloading - перегрузку функций.
32. Return parameters are not taken into account for overload resolution for function calls to overloaded functions, only function arguments are matched. (Overload resolution is nothing in practice because function dispatcher will match the selectors)
что в переводе:
Возвращаемые параметры не учитываются при разрешении перегрузки для вызовов перегруженных функций, сопоставляются только аргументы функции. (На практике разрешение перегрузки не имеет значения, поскольку диспетчер функций будет соответствовать селекторам)
Звучит запутано, но на практике все куда проще.
Вы порой могли замечать в контрактах, что есть функции с одинаковыми именами, но разным количеством принимаемых аргументов например:
contract A {
function f(uint value) public pure returns (uint out) {
out = value;
}
function f(uint value, bool really) public pure returns (uint out) {
if (really)
out = value;
}
}Перегрузка функция также может применяться и во внешних интерфесах, однако тут нужно быть аккуратным, так как то, что "разное" для Solidity, может быть "одинаковым" для ABI. Наприммер,
contract A {
function f(B value) public pure returns (B out) {
out = value;
}
function f(address value) public pure returns (address out) {
out = value;
}
}
contract B {
}Для Solidity объект контракта B, который принимает первая функция абсолютно отличается от аргумента типа address, который присутствует во второй функции. Однако на более "низком уровне", и объект контракта и address - это просто адреса. И поэтому компилятор будет выдавать ошибку при попытке собрать ваш контракт.
Также вам нужно быть аккуратными с размерностью принимаемых аргументов и возвращаемыми значениями. Например,
contract A {
function f(uint8 val) public pure returns (uint8 out) {
out = val;
}
function f(uint256 val) public pure returns (uint256 out) {
out = val;
}
}Это еще один пример перегрузки функций, так как аргументы отличаются, не смотря на одинаковые имена функций.
При этом, если мы попробует выполнить f(50), то возникнет ошибка. По сути, число 50 может быть конвертировано, как в uint256, так и в uint8, и программа просто не поймет, какую функцию требуется вызвать. Но с запросом f(256) все будет ок, так как для этого числа подойдет только вторая функция.
Об этом и говорится в обозначенном в начале поста пункте.
#overloading