Tengo una función que toma un parámetro de tipo function (uint256) view returns (uint256)
.
Quiero pasarle un puntero a una función de tipo function (uint256) pure returns (uint256)
.
Obviamente, no debería haber ningún problema con pasar esta pure
función a un parámetro que espera una view
función, porque los tipos de parámetro y de retorno son los mismos y pure
son incluso más limitantes que view
. Sin embargo, me sale este TypeError:
TypeError: tipo no válido para el argumento en la llamada a la función. Conversión implícita no válida de
function (uint256) pure returns (uint256)
afunction (uint256) view returns (uint256)
solicitada.
Cosas que he probado:
Asignar la función a una variable local da un TypeError similar:
function(uint256) view returns(uint256) a = func;
TypeError: el tipo
function (uint256) pure returns (uint256)
no se puede convertir implícitamente al tipo esperadofunction (uint256) view returns (uint256)
La sintaxis habitual de conversión de tipos de Solidity da un ParserError en la function
palabra clave
function(uint256) view returns(uint256) a = function(uint256) view returns(uint256) (func);
ParserError: Expresión primaria esperada
-------
Me di cuenta de que TypeError sigue diciéndome que el puntero de función no es implicitly
convertible. ¿Hay alguna manera de convertirlo explícitamente?
Actualización: en las versiones recientes de Solidity, los punteros de función puros ahora se pueden convertir implícitamente para ver los punteros de función.
No encontré una solución a este problema, así que envié un problema en Github: https://github.com/ethereum/solidity/issues/4349
Encontré dos formas de solucionar el problema:
1: Degradar todas mis funciones puras para ver.
2: use el ensamblaje en línea para asignar a una variable local, eludiendo así el sistema de tipo Solidity:
function(uint256)view returns(uint256) a;
assembly { a := func }
No puedo entender tu punto.
En solidity no existen punteros de función, porque el mecanismo de llamada es pasar el control al contrato inteligente que posee la función y usar la tabla ABI para saltar allí a la primera instrucción de la función.
¡Así que no hay un puntero a una función que pueda usar como lo hace en C!
En Solidity la dirección de cualquier función ES la dirección ethereum de su contrato inteligente
Es decir, de forma cualitativa, la dirección (función foo()) es la dirección del contrato inteligente que implementa foo()
¡Puede ser que no entendí bien tu pregunta!
EDITAR DESPUÉS DE LOS COMENTARIOS
Typecast no se puede aplicar al tipo de función, que yo sepa, solo se puede realizar una conversión implícita y esta ES la demostración de que el puntero de función como lvalue NO EXISTE.
"Un valor de tipo de función externa se puede convertir explícitamente en dirección, lo que da como resultado la dirección del contrato de la función.
Una función tipo A es implícitamente convertible a una función tipo B si y solo si sus tipos de parámetros son idénticos, sus tipos de devolución son idénticos, su propiedad interna/externa es idéntica y la mutabilidad de estado de A no es más restrictiva que la mutabilidad de estado de B. En particular:
Las funciones puras se pueden convertir en funciones de visualización y funciones no pagables. Las funciones de visualización se pueden convertir en funciones no pagables. Las funciones de pago se pueden convertir en funciones no pagables.
No son posibles otras conversiones entre tipos de funciones. "
De todos modos, si estamos aquí para aprender, entonces espero aprender algo nuevo de usted pronto.
Compruebe también la función como parámetro
function testFunc(uint256 x) internal pure returns (uint256 y) { return x+5; }
ahora puede colocar su puntero de función en una variable local con el tipo apropiado: function(uint256) internal pure returns (uint256) func = testFunc;
y puede llamar a la función a través de su puntero de función:func(345)
function (uint256) internal pure returns (uint256)
a tipo function (uint256) internal view returns (uint256)
. ¿Entiendes ahora?
Alireza Zojaji
jesús
view
función como parámetro. Quiero pasarle unapure
función.Alireza Zojaji
jesús